当前位置: 首页 > news >正文

【C# 网络编程】基本概念

基本概念

OSI模型

背景:
为了统一和兼容不同计算机厂商的网络体系结构概念,国际标准化组织(ISO)在1979年提出了OSI参考模型(Open System Interconnection,)
结构
在这里插入图片描述

  1. 物理层(Physical Layer)
    要传递信息就要利用一些物理媒体,如双绞线、同轴电缆等,但具体的物理媒体并不在OSI的七层之内,有人把物理媒体当作第0层,物理层的任务就是为它的上一层提供一个物理连接,以及它们的机械、电气、功能和过程特性。如规定使用电缆和接头的类型,传送信号的电压等。在这一层,数据还没有被组织,仅作为原始的位流或电气电压处理,单位是比特。\
  2. 数据链路层(Data Link Layer)
    数据链路层负责在两个相邻结点间的线路上,无差错地传送以帧为单位的数据。每一帧包括一定数量的数据个一些必要的控制信息。和物理层相似,数据链路层负责建立、维持和释放数据链路的连接。在传送数据时,如果接收点检测到所传数据中有差错,就要通知发送方重发这一帧。
  3. 网络层(Network Layer)
    在计算机网络中进行通信的两个计算机之间可能会经过很多个数据链路,也可能还要经过很多通信子网。网络层的任务就是选择合适的网间路由和交换结点,以确保数据及时传送。网络层将数据链路层提供的帧组成数据包,包中封装有网络层包头,其中含有逻辑地址信息(源站点和目的站点地址的网络地址)
  4. 传输层(TransporyLayer)
    传输层的任务是根据通信子网的特性来最佳地利用网络资源,并以可靠和经济的方式,为两个端系统(也就是源站和目的站)的会话层之间,提供建立、维护和取消传输连接的功能,并负责可靠地传输数据。在这一层,信息的传送单位是报文。
  5. 会话层(Session Layer)
    会话层也称为会晤层或对话层,在会话层及以上的高层次中数据传送的单位不再另外命名,都统称为报文。会话层不参与具体的传输,它提供包括访问验证和会话管理在内的建立和维护应用之间通信的机制。如服务器验证用户登录便是由会话层完成的
  6. 表示层(Presentation Layer)
    表示层主要解决用户信息的语法表示问题。它将欲交换的数据从适合于某一用户的抽象语法,转换为合适于OSI系统内部使用的传送语法。即提供格式化的表示和转换数据服务。数据的压缩和解压缩,加密和解密等工作都由表示层负责。
  7. 应用层(Application Layer)
    应用层确定进程之间通信的性质以满足用户需要以及提供网络与用户应用软件之间的接口服务。

TCP/ IP模型

OSI模型提出是为了解决不同厂商、不同结构的网络产品之间互相连接时遇到的不兼容性问题。但是由于该模型的设计过于复杂,阻碍了其在计算机网络领域的实际应用。所以为了方便应用,一款由技术人员自己开发的传输控制协议/网际协议(Transfer Control Protocol/Internet Protocol, TCP/IP)模型应运而生。TCP/IP协议是目前因特网范围内运行的唯一一种协议。
在这里插入图片描述

OSI参考模型与TCP/IP模型

TCP/IP 包括两个协议,即传输控制协议(Transfer Control Protocol, TCP)和网络协议(Internet Protocol,IP),但实际上TCP/IP 是一系列协议的代名词,它包括上百个各种功能的协议,如:地址解析协议(ARP)、Internet控制消息协议(ICMP)、文件传输协议等,而TCP协议和IP协议只是保证数据完整传输的两个重要协议,所以也常称为TCP/IP协议族。该协议族分为四个层次:链路层、网络层、传输层、和应用层。
在这里插入图片描述

TCP/IP工作原理

由上述OSI参考模型可知,在因特网上源主机的协议层与目的主机的同层提供的服务实现对话。TCP/IP协议族模型也是按照这一原则来工作的。它们之间的对话实际上是在源主机上从上到下传递然后穿越网络到达目的主机后再从下到上到达相应层。
在这里插入图片描述

  1. 在信源上,利用应用层协议(HTTP)将需传输的请求数据流传送给信源上的传输层(TCP)。
  2. 信源上的传输层将应用层的请求数据流截成若干分组,并加上TCP首部形成TCP段,送交信源上的网络层(IP)。
  3. 信源的网络层给TCP段加上包括源、目的主机IP地址的IP首部,生成一个IP数据报,并将IP数据报送交信源的链路层。
  4. 信源的链路层在其MAC帧的数据部分装上IP数据报,再加上源、目的主机的MAC地址和MAC帧头,并根据其目的MAC地址,将MAC帧发往信宿或中间路由器,例如路由器R。
  5. 路由器是一个具有多个接口的网络互连设备,可以把数据从一个网络转发到另一个网络。当数据传输到路由器后,路由器将根据数据包中的目的地址进行传输路径的选择,并根据所选择的传输路径进行数据传输。通常,路由器只处理链路层和网络层的数据。在本实例中,路由器接收客户机A发送过来的IP数据并将该数据报转发给服务器B。
  6. 当数据传输到信宿,链路层将MAC帧的帧头去掉,并将IP数据送交信宿的网络层。
  7. 信宿的网络层检查IP数据报首部,假如首部在校验和与计算结果不一致,则丢弃该IP数据报;若校验和计算结果一致,则去掉IP首部,将TCP段送交信宿的传输层。
  8. 信宿的传输层检查顺序号,判断是否正确的TCP分组,然后检查TCP首部数据。若正确,则向信源发确认信息;若不正确或丢包,则向信源要求重发信息。
  9. 信宿的传输层去掉TCP首部,将排好顺序大额分组组成应用数据流送给信宿上相应程序。这样信宿接收到的来自信源的字节流,就像是直接接收到来自信源的字节流一样。
    在这里插入图片描述

套接字

在这里插入图片描述

简介

套接字就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议栈进行交互的接口

类型

TCP/IP的Socket提供了3种类型的套接字

  1. 流式套接字(SOCK_STREAM)
    提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收。内设流量控制,避免数据流超限;数据被看作是字节流,无长度限制。文件传输协议(FTP)即使用流式套接字。
  2. 数据报套接字(SOCK_DGRAM)
    提供无连接服务。数据包以独立包形式发送,不提供无差错保证,数据可能丢失或重复,并且接收顺序混乱。网络文件系统(NFS)使用数据报式套接字。
  3. 原始套接字(sock_raw)
    该接口允许对较低层协议,如IP、ICMP直接访问。常用于检验新的协议实现或访问现有服务中配置的新设备

工作原理

在这里插入图片描述
在这里插入图片描述
套接字可以像Stream流一样被视为一个数据通道,这个通道架设在客户端应用程序和服务器端之间,数据的读取(接收)和写入(发送)均针对这个通道来进行。因此要通过网络进行通信,就至少需要一对套接字,其中一个运行于客户端,称之为客户端套接字(ClientSocket),另一个运行于服务器端,称之为服务器端套接字(ServerSocket)。 当创建了这两个套接字对象之后,将这个套接字连接起来就可以实现数据传输了。

.NET中的Socket类

针对Socket编程,.NET框架的System.NET.Sockets命名空间为需要严密控制网络访问的开发人员提供了WinSock接口的托管实现。其中Socket类是WinSock32 API提供的套接字服务的托管代码版本,为实现网络编程提供了大量的方法。

//addressFamily用来指定网络类型
//SocketType用来指定套接字类型(即连接方式)
//ProtocolType用来指定网络协议
public Socket(AddressFamily addressFamily, SocketType socketType,ProtocolType protocolType)

addrressFamily,socketType和protocolType均为枚举类型。三者并不能任意组合,有特定的组合。如常规的IP通信网络,AddressFamily.InterNetWork,此时可用的SocketType和ProtocolType如下表所示

SocketTypeProtocolTyp描述
StreamTcp面向连接套接字
DgramUdp无连接套接字
RawIcmp网际消息控制协议套接字
RawRaw基础传输协议套接字

Socket类的常用方法

方法描述
Bing(EndPoint address)在服务器端,当一个套接字被创建后,需要将它绑定到系统的一个特定地址。可以使用Bind()方法来完成,其参数为一个IPEndPoint实例(包含IP地址和端口信息)
Listen(int con_num)服务器端的套接字完成了与地址的绑定后,就使用该方法监听客户发送的连接请求。con_num为整数值,该值表示服务器最大连接数目,超过这个数目的连接会被拒绝。con_num数值的设定会影响到服务器的运行,因为每个连接的接收都要使用TCP缓冲区,如果设置过大,收发数据的缓存数据将减少。
Accept()在服务器进入监听状态时,如有从客户端发来的连接请求,服务器将使用Accept()方法来接受连接请求。Accept()返回一个新的套接字,该套接字包含所建立的连接的信息并负责处理本连接的所有通信。而服务器刚开始创建的套接字仍然负责监听,并在需要时调用Accept()接受新的连接请求。
Send()当服务器接受了来自客户端的连接请求后,服务器和客户端双方就可以利用Send()方法来发送数据。Send有四种重载方法,
Receive()当服务器接收了来自客户端的连接请求后,服务器和客户段端双方就可以利用Receive()方法来接收数据。Receive()也有四种重载方法。
Connect(EndPoint remoteEP)同服务端一样,客户端的套接字建立后也必须与一个地址绑定。在客户端使用Connect()方法实现绑定,
Shutdown(SocketShutdown how)当客户端和服务器的通信结束时,必须关闭相应的套接字实例,可以使用Shutdown()方法来禁止该套接子上的发送和接收,shutdown()方法有一个枚举类型的参数,如SocketShutdown.Send表示禁用发送套接字,如SocketShutdown.Receive表示禁用接收套接字吗,SocketShutdown.Both表示禁用发送和接收的套接字。
close()禁止套接字上的发送和接收之后,使用Close()方法关闭套接字连接并释放所有相关资源。这样套接字会在系统内部缓冲区处理完毕后关闭套接字并释放资源。

Send()、Receive()重载方法

方法说明
Send(byte[] data)将数据发送到连接的Socket
Send(byte[] date,SocketFlang sf)使用指定的SocketFlags将数据发送到连接的Socket
Send(byte[] data,int size,SocketFlags sf)使用指定的SocketFlags将指定字节数的数据发送到已连接的Socket
Send(byte[] data,int offset, int size,SocketFlags sf)使用指定的SocketFlags,将指定字节数的数据发送到已连接的Socket(从指定的偏移量开始)
Receive(byte[] data)从绑定的套接字接收数据,将数据存入接收缓冲区
Receive(byte[] data,SocketFlags sf)使用指定的SocketFlags,从绑定的套接字接收数据,将数据存入接收缓冲区
Receive(byte[] data,int size,SocketFlags sf)使用指定的SocketFlags,从绑定的套接字接收指定字节数的数据,将数据存入接收缓冲区

相关文章:

【C# 网络编程】基本概念

基本概念 OSI模型 背景: 为了统一和兼容不同计算机厂商的网络体系结构概念,国际标准化组织(ISO)在1979年提出了OSI参考模型(Open System Interconnection,) 结构 物理层(Physica…...

系统架构设计师-下午案例题(2018年下半年)

1.某文化产业集团委托软件公司开发一套文化用品商城系统,业务涉及文化用品销售、定制、竞拍和点评等板块,以提升商城的信息化建设水平。该软件公司组织项目组完成了需求调研,现已进入到系统架构设计阶段。考虑到系统需求对架构设计决策的影响,项目组先列出了可能影响系统架…...

StarRocks报错:Getting analyzing error. Detail message: Unknown database ‘你的库名‘.

在starrocks上进行业务sql压力测试的时候,当并发提高到一定阈值就会报下面这个错误 背景描述:starrocks上有一张明细主表,维度表均是通过创建外部mysql catalog的方式使用的。 java.sql.SQLSyntaxErrorException: Getting analyzing error.…...

【原创教程】电气电工23:电气柜的品牌及常用型号

电气电工要清楚常用的电气柜品牌及型号,对于电器柜的选择,现在我们一般常用的品牌有3个。分别是好夫满、上海上海桐赛电气和南京巴哈曼电气,还有一种就是网上订制。 一、好夫满系列电气箱 好夫满有很多种类的机箱,EB精巧控制箱系列、KL接线箱系列、BKL不锈钢接线箱系列、…...

AI引起用人格局变动,个人如何应对这一趋势

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 人工智能的发展带来的就业结构变革&#xf…...

小程序项目实践(一)--项目的初始化以及前期的准备工作

目录 1.起步 1.1 uni-app 简介 1.2 开发工具 1.2.1 下载 HBuilderX 1.2.2 安装 HBuilderX 1.2.3 安装 scss/sass 编译 1.2.4 快捷键方案切换 1.2.5 修改编辑器的基本设置 1.3 新建 uni-app 项目 1.4 目录结构 1.5 把项目运行到微信开发者工具 1.6 使用 Git 管理项目 …...

宝藏CSS样式网站,开发一些酷炫的特效

一、Uiverse 地址:Uiverse | The Largest Library of Open-Source UI elementshttps://uiverse.io/ 项目包含了我们常用到的一些组件,例如:按钮Button、多选框Checkbox、胶囊按钮Switch、加载特效Loading、输入框Input、表单Form、提示框To…...

vscode报错No module named ‘Crypto‘

背景 在Windows系统下,使用vscode的Run Code命令执行程序时,会报错 from Crypto.Cipher import AES ModuleNotFoundError: No module named Crypto有可能是因为当前操作系统存在两个版本的Python,而安装的Crypto仅对应于其中的一个Python版本…...

机器学习中的多模态学习:用C/C++实现高效模型

引言 多模态学习(Multimodal Learning)是一种机器学习技术,它旨在整合多种数据类型(例如图像、文本、音频、传感器数据等)来提升模型的预测精度和泛化能力。其应用领域包括情感分析、多模态推荐系统、智能驾驶、语音识…...

Java 运行机制及运行过程

Java的运行机制是基于Java虚拟机(Java Virtual Machine,JVM)的。Java程序在运行时,首先需要将源代码通过Java编译器编译为字节码文件(.class文件),然后由JVM解释执行或通过即时编译器&#xff0…...

IC开发——数字电路设计简介

1. 前言 我们说的数字电路,一般是指逻辑数字电路,即通过逻辑门组合成的电路,也即我们常说的逻辑IC。IC除了逻辑IC之外,还有模拟IC,存储IC等。 IC设计,需要学习数字电路,需要学习Verilog/VHDL等…...

openmmlab实现图像超分辨率重构

文章目录 前言一、图像超分辨率重构简介二、mmmagic实现图像超分 前言 超分辨率重构技术,作为计算机视觉领域的一项重要研究课题,近年来受到了广泛关注。随着科技的飞速发展,人们对图像质量的要求越来越高,尤其是在智能手机、监控…...

四、远程登录到Linux服务器

说明 linux 服务器是开发小组共享,正式上线的项目是运行在公网,因此需要远程登录到 Linux 进行项目管理或者开发 Xshell 1、特点 Xshell 是目前最好的远程登录到 Linux 操作的软件,流畅的速度并且完美解决了中文乱码的问题, 是目…...

Qt开发全指南:从基础到高级

1. Qt快速入门 • 什么是Qt框架? • 如何安装和配置Qt? • 使用Qt Creator:快速上手 • 项目结构与构建系统:qmake 和 CMake 2. 核心模块解析 • 信号与槽机制详解 • QtCore、QtGui 和 QtWidgets 模块介绍 • 并行编程&a…...

【算法】——双指针算法合集(力扣)

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 第一题:移动零 第二题:复写零 第三题:快乐数 第四题&#xff1a…...

小猿口算自动PK脚本

大家好,我是小黄。 近期,众多大学生炸鱼小猿口算APP,把一众小学生都快虐哭了,小黄听闻后,也跃跃欲试。对此小黄也参考网上的资料写了一个自动Pk的脚步。 首先大家需要安装一个pytorch环境过程中,如果小伙伴对此不熟悉的…...

蓝桥杯备赛(c/c++)

排序 9. 实现选择排序 10. 实现插入排序 11. 实现快速排序 12. 实现归并排序 13. 实现基数排序 14. 合并排序数组...

LLM大模型预测耗时的粗略估计以及sft和continue pre-train的区别

目录 预训练(Pretraining)与微调(SFT, Supervised Fine-Tuning)的区别 训练方式 数据组成 特殊标记(Special Tokens) Prompt处理 Session数据处理 训练目的 小结 LLM大模型预测耗时的粗略估计 1. …...

go和python打包项目对比

go源码 package mainimport ("fmt" )func main() {fmt.Println(" _____ _____ _____ _____")fmt.Println(" |2 ||2 ||2 ||2 |")fmt.Println(" | ^ || & || v || o |")fmt.Println(" | …...

EmEditor传奇脚本编辑器

主程序:EmEditor.exe 目前已有功能 可以自己指定一个快捷键 实现以下功能(默认快捷键为:F1) 以下全功能 都是鼠标所在行 按快捷键 (默认快捷键:F1) 1.在Merchant.txt中 一键打开NPC 没有…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...