C# 网络通讯核心知识点笔记
一、网络协议基础理论
1.1 OSI 七层参考模型
1.1.1 核心定义
OSI(Open System Interconnect,开放式系统互联)参考模型是 ISO(国际标准化组织)1985 年制定的网络互联框架,定义了七层网络结构,确保不同设备、系统间按统一规则传输数据,数据需经 “发送端层层向下封装→物理层传输→接收端层层向上解封装” 的流程传递。
1.1.2 七层结构与核心信息
层级 | 名称 | 核心功能 | 常用协议 / 技术 | 数据单位 |
---|---|---|---|---|
7 | 应用层 | 为应用程序提供网络服务(如数据交互、请求响应) | HTTP、HTTPS、FTP、SMTP、DNS、Telnet | 应用数据 |
6 | 表示层 | 数据格式转换、加密解密、压缩解压(确保接收端能识别数据) | ASCII、UTF-8、Unicode、SSL/TLS、JPEG | 表示层数据 |
5 | 会话层 | 建立、管理、终止通信连接(如会话超时控制、连接恢复) | ADSP、RPC、SQI | 会话层数据 |
4 | 传输层 | 提供端到端(端口到端口)的可靠 / 不可靠传输,控制数据流量 | TCP、UDP、SPX | 段(TCP)/ 数据报(UDP) |
3 | 网络层 | 路由选择(确定数据传输路径)、IP 寻址(定位目标设备) | IP(IPv4/IPv6)、ICMP、ARP、RARP | 数据包 |
2 | 数据链路层 | 物理地址(MAC 地址)寻址、帧同步、差错检测(如 CRC 校验) | HDLC、PPP、IEEE 802.3(以太网)、WIFI | 帧 |
1 | 物理层 | 实现比特流(0/1 序列)与物理信号(电压、光信号)的转换,定义物理接口 | RS232、RS485、RJ-45、UART、V35 | 比特流 |
1.2 核心协议分类与重点协议解析
1.2.1 协议分类
传输层核心协议:TCP(可靠连接)、UDP(不可靠无连接)
应用层常用协议:HTTP(80 端口)、HTTPS(443 端口,基于 SSL/TLS 加密)、FTP(文件传输,21 端口)
串口协议:RS232(点对点,短距离)、RS485(多点通信,长距离抗干扰)、RS422(全双工,两点通信)
物理接口协议:RJ-45(网口,以太网标准)、UART(通用异步收发传输器,串口底层)
1.2.2 必须掌握的协议(重点)
协议 | 所属层级 | 核心特点 | 应用场景 | 关键参数 / 注意事项 |
---|---|---|---|---|
TCP | 传输层 | 面向连接、可靠(无丢失 / 无重复 / 有序)、基于字节流、延时高、资源占用多 | 聊天软件、文件传输(如 FTP)、HTTP | 需三次握手建立连接,四次挥手释放连接 |
UDP | 传输层 | 无连接、不可靠(可能丢包 / 乱序)、基于数据报、延时低、资源占用少 | 视频直播、实时语音、物联网传感器 | 无需建立连接,直接发送,需自行处理丢包问题 |
IP | 网络层 | 负责 IP 寻址(定位设备)、路由选择,无连接、不可靠 | 所有 TCP/UDP 数据的底层传输 | 分为 IPv4(32 位地址)和 IPv6(128 位地址) |
HTTP | 应用层 | 无状态、基于请求 - 响应模式、明文传输(不安全) | 网页浏览、API 接口(如 RESTful) | 默认端口 80,请求方法:GET/POST/PUT/DELETE |
HTTPS | 应用层 | HTTP+SSL/TLS 加密,提供身份认证和数据加密(安全) | 支付、登录、敏感数据传输 | 默认端口 443,需 SSL 证书验证 |
RS232 | 物理层 | 点对点通信、传输距离短(<15 米)、抗干扰弱、单工 / 半双工 | 单片机与 PC 通信、老式设备调试 | 9 针 / 25 针接口,需匹配波特率、数据位、校验位 |
RS485 | 物理层 | 多点通信(最多 32 个节点)、传输距离长(<1200 米)、抗干扰强、半双工 | 工业控制(如 PLC)、传感器组网 | 需终端电阻(120Ω)匹配,避免信号反射 |
1.2.3 需了解的协议
Telnet:应用层,远程登录协议(明文,不安全,多用于设备调试)
SMTP:应用层,邮件发送协议(配合 POP3/IMAP 接收邮件)
ARP:网络层,将 IP 地址转换为 MAC 地址(局域网内寻址)
RARP:网络层,将 MAC 地址转换为 IP 地址(如无盘工作站)
MIME:应用层,多用途互联网邮件扩展,定义邮件附件格式(如图片、文档)
二、TCP 深度解析
2.1 TCP 核心概念
定义:Transmission Control Protocol(传输控制协议),传输层协议,基于 TCP/IP 协议簇,提供可靠的端到端传输。
TCP 连接标识:由4 元组唯一确定 ——(源 IP 地址、源端口号、目的 IP 地址、目的端口号)。
TCP 报文结构:固定首部 20 字节 + 可选首部(0-40 字节),核心字段包括:
源端口 / 目的端口(各 2 字节):定位应用程序;
序号(seq,4 字节):标识当前报文段数据的第一个字节序号;
确认序号(ack,4 字节):期望接收的下一个字节序号(仅 ACK=1 时有效);
标志位(6 个):SYN(建立连接请求)、ACK(确认)、FIN(释放连接)、RST(重置连接)、PSH(立即推送数据);
窗口(2 字节):流量控制,标识接收端可接收的最大字节数。
2.2 TCP 连接的 “三次握手” 与 “四次挥手”(面试重点)
2.2.1 三次握手(建立连接)
目的:确保客户端和服务器双方的发送、接收能力正常,同步序号。
第一次握手:客户端 → 服务器,发送报文:
SYN=1,seq=x
(x 为客户端初始序号,如 100);第二次握手:服务器 → 客户端,响应报文:
SYN=1,ACK=1,seq=y(服务器初始序号,如300),ack=x+1(确认收到客户端数据)
;第三次握手:客户端 → 服务器,确认报文:
ACK=1,seq=x+1,ack=y+1(确认收到服务器数据)
。
为什么需要三次握手? 避免 “失效的连接请求” 导致服务器资源浪费:若仅两次握手,客户端发送的请求报文因网络延迟到达服务器,服务器误判为新连接并分配资源,而客户端已超时重发,导致服务器资源闲置。
2.2.2 四次挥手(释放连接)
目的:确保双方数据均已传输完成,安全释放连接(TCP 是全双工,需双向关闭)。
第一次挥手:客户端(数据传输完成)→ 服务器,发送
FIN=1,seq=x(客户端当前序号)
,表示客户端不再发送数据;第二次挥手:服务器 → 客户端,响应
ACK=1,ack=x+1
,表示服务器确认收到关闭请求(此时服务器仍可向客户端发送数据);第三次挥手:服务器(数据传输完成)→ 客户端,发送
FIN=1,seq=y(服务器当前序号)
,表示服务器不再发送数据;第四次挥手:客户端 → 服务器,响应
ACK=1,ack=y+1
,表示客户端确认收到关闭请求(客户端需等待 2MSL 后彻底释放连接,确保服务器收到确认)。
2.3 TCP 连接的三个阶段
连接建立阶段:通过三次握手完成,双方进入 “已建立连接” 状态;
数据传输阶段:基于字节流传输数据,通过序号、确认序号保证可靠性,通过窗口机制进行流量控制;
连接释放阶段:通过四次挥手完成,双方释放资源,断开连接。
三、UDP 深度解析
3.1 UDP 核心概念
定义:User Datagram Protocol(用户数据报协议),传输层协议,无连接、不可靠的数据包传输。
UDP 报文结构:固定首部 8 字节,仅包含源端口、目的端口、长度、检验和,结构简单,传输效率高。
核心特点:
无连接:发送前无需建立连接,直接发送数据报;
不可靠:不保证数据送达、不保证顺序、不重传丢失数据;
面向数据报:每个数据报独立,大小限制(通常 < 65507 字节);
低延时:无握手 / 挥手过程, overhead 小,适合实时场景。
3.2 TCP 与 UDP 的核心区别
对比维度 | TCP | UDP |
---|---|---|
连接方式 | 面向连接(三次握手建立,四次挥手释放) | 无连接(直接发送) |
可靠性 | 可靠(无丢失、无重复、有序) | 不可靠(可能丢包、乱序) |
数据传输单位 | 字节流(无边界,需应用层定义分隔) | 数据报(有边界,一次发送一个数据报) |
流量控制 | 支持(滑动窗口机制) | 不支持(需应用层自行处理) |
拥塞控制 | 支持(慢启动、拥塞避免等算法) | 不支持(可能导致网络拥塞) |
延时 | 高(握手 / 确认 / 重传耗时) | 低(无额外耗时) |
资源占用 | 高(需维护连接状态、序号、窗口等) | 低(无连接状态,结构简单) |
应用场景 | 文件传输、聊天、HTTP/HTTPS | 视频直播、实时语音、物联网传感器 |
四、Socket 与 C# 网络编程
4.1 Socket 核心概念
定义:套接字(Socket)是应用层与 TCP/IP 协议簇通信的中间抽象层,封装了 TCP/UDP 的底层细节,为开发者提供统一的 API 接口。
Socket 与 TCP/UDP 的关系:Socket 不是协议,而是 “工具”—— 通过 Socket 可以实现 TCP 的连接式通信,也可以实现 UDP 的无连接通信。
C# 中的 Socket 封装:.NET Framework 提供了更易用的封装类,推荐优先使用:
TcpListener
:TCP 服务器端,用于监听客户端连接;TcpClient
:TCP 客户端,用于与 TCP 服务器建立连接并传输数据;UdpClient
:UDP 客户端 / 服务器端,用于 UDP 数据报的发送与接收。
4.2 C# 中 TCP 通讯的核心流程
4.2.1 TCP 服务器端(TcpListener)
创建
TcpListener
实例,绑定 IP 地址和端口(如new TcpListener(IPAddress.Any, 8888)
);调用
Start()
方法开始监听客户端连接;调用
AcceptTcpClient()
方法(阻塞),等待客户端连接,返回TcpClient
实例(代表与该客户端的连接);通过
TcpClient.GetStream()
获取网络流(NetworkStream
),用于读写数据;数据传输完成后,关闭
NetworkStream
、TcpClient
,调用TcpListener.Stop()
停止监听。
4.2.2 TCP 客户端(TcpClient)
创建
TcpClient
实例,调用Connect(IPAddress, 端口)
连接服务器;通过
GetStream()
获取网络流,用于向服务器发送 / 接收数据;数据传输完成后,关闭网络流和
TcpClient
。
4.3 C# 中 UDP 通讯的核心流程
UDP 无连接,客户端和服务器端逻辑类似,均使用UdpClient
:
创建
UdpClient
实例,绑定本地端口(服务器端需固定端口,客户端可随机);发送数据:调用
Send(byte[] data, int length, IPEndPoint remoteEP)
,指定目标 IP 和端口;接收数据:调用
Receive(ref IPEndPoint remoteEP)
(阻塞),接收来自指定端点的数据,返回字节数组;通讯结束后,关闭
UdpClient
。
注意:UDP 接收需通过
IPEndPoint
获取发送方的地址和端口,且需异步或多线程处理,避免阻塞主线程(如Task.Run(() => 接收逻辑)
)。
4.4 Socket 通讯的关键注意事项
TCP 服务器的多客户端处理:单个
TcpListener
一次只能处理一个客户端,需通过多线程(如ThreadPool.QueueUserWorkItem
)或异步(AcceptTcpClientAsync
)处理多个客户端连接;数据粘包 / 拆包:TCP 是字节流,可能出现 “粘包”(多个发送的数据合并接收)或 “拆包”(一个发送的数据分多次接收),需在应用层定义数据格式(如 “长度 + 数据”)解决;
UDP 数据报大小:UDP 数据报最大长度为 65507 字节(IP 首部 20 字节 + UDP 首部 8 字节),超过需在应用层分片;
资源释放:网络流、TcpClient/UdpClient、TcpListener 需在使用后及时关闭,避免资源泄漏(推荐使用
using
语句自动释放)。
五、核心知识点总结
网络协议框架:OSI 七层模型是基础,重点关注传输层(TCP/UDP)、应用层(HTTP/HTTPS)、物理层(RS232/RS485/RJ-45);
TCP 核心:面向连接、可靠传输,三次握手建立连接,四次挥手释放连接,4 元组标识连接;
UDP 核心:无连接、不可靠传输,低延时,适合实时场景,需应用层处理可靠性问题;
C# 编程:优先使用
TcpListener/TcpClient/UdpClient
封装类,避免直接操作底层 Socket;TCP 需处理多客户端和粘包,UDP 需注意数据报大小和异步接收;协议选择原则:对可靠性要求高选 TCP,对延时要求高选 UDP;短距离设备通信选 RS232,长距离工业组网选 RS485,以太网通信选 RJ-45。