1. UDP
1.1 核心特性
UDP(User Datagram Protocol)是一种轻量级的传输层协议,由 David P. Reed 于 1980 年设计并记录在 RFC 768 中。它不建立连接,也不保证数据的可靠传输。
✅ 无连接(Connectionless):UDP 不需要握手过程,发送方可以直接发送数据包给接收方。这意味着通信延迟低,但同时也意味着没有连接状态维护。
✅ 不可靠传输(Unreliable Delivery):UDP 不保证数据包一定能被接收,也不保证顺序。如果网络环境良好,数据通常能正常到达;但如果出现丢包或乱序,UDP 不会重传或重新排序。
✅ 低开销(Lightweight):由于没有流量控制、拥塞控制、确认机制等,UDP 的协议开销非常小,适合对实时性要求高的场景。
✅ 支持广播与多播(Multicast/Broadcast):UDP 支持向多个主机同时发送消息,非常适合如 IPTV、在线直播等场景。
❌ 不适用于关键数据传输:例如金融交易、文件传输等,这些场景需要数据的完整性和顺序性。
1.2 数据报结构
UDP 数据报由 头部(Header) 和 数据(Payload) 两部分组成,头部固定为 8 字节。
Bits 0-15 | Bits 16-31 |
---|---|
源端口号(16位) | 目标端口号(16位) |
长度(16位) | 校验和(16位) |
数据(可变长度) |
- 源端口号(Source Port):发送方的端口号,可选字段,若未使用则为 0。
- 目标端口号(Destination Port):接收方的端口号,必填字段。
- 长度(Length):整个数据报的长度(包括头部和数据),最小为 8 字节,最大为 65527 字节。
- 校验和(Checksum):用于校验头部和数据是否出错,可选字段。
⚠️ UDP 的校验和机制虽然存在,但不是强制的,因此在某些高性能场景中会被禁用。
2. TCP
2.1 核心特性
TCP(Transmission Control Protocol)也是一种运行在传输层的协议,最早在 1974 年发表于 RFC 675。与 UDP 相比,TCP 提供了可靠的、面向连接的数据传输机制。
✅ 面向连接(Connection-Oriented):在数据传输前必须建立连接,通常通过三次握手完成。
✅ 可靠传输(Reliable Delivery):TCP 保证数据按序到达,并能检测和重传丢失的数据包。
✅ 流量控制与拥塞控制(Flow & Congestion Control):TCP 会根据接收方的处理能力和网络状况动态调整发送速率,避免网络拥塞。
✅ 全双工通信(Full-Duplex):TCP 支持双向通信,即通信双方可以同时发送和接收数据。
❌ 传输延迟较高:由于需要建立连接、确认、重传等机制,TCP 的传输速度通常比 UDP 慢。
2.2 连接建立:三次握手
TCP 使用 三次握手(Three-Way Handshake) 建立连接,确保双方都准备好进行通信。
流程如下:
- SYN(同步):客户端发送 SYN 包(如 seq=100)给服务器,并进入
SYN_SENT
状态。 - SYN-ACK(同步-确认):服务器响应 SYN-ACK(seq=300, ack=101),进入
SYN_RCVD
状态。 - ACK(确认):客户端发送 ACK 包(ack=301),连接建立完成,双方进入
ESTABLISHED
状态。
⚠️ 如果某一方未收到确认包,连接建立将失败,需重试或断开。
2.3 数据包结构
TCP 数据包的头部结构比 UDP 复杂,最小为 20 字节,最多 60 字节(含可选字段)。
Bits 0-15 | Bits 16-31 |
---|---|
源端口号 | 目标端口号 |
序列号(32位) | |
确认号(32位) | |
数据偏移(4位) | 保留(3位) |
校验和(16位) | 紧急指针(16位) |
可选字段(0~320位) |
- 序列号(Sequence Number):标识发送的数据起始位置,用于接收方重组数据。
- 确认号(Acknowledgment Number):表示期望收到的下一个字节的序号。
- 标志位(Flags):包括 SYN、ACK、FIN、RST 等,用于控制连接和数据传输。
- 窗口大小(Window Size):用于流量控制,告知对方当前可接收的数据量。
- 校验和(Checksum):确保数据完整性。
- 紧急指针(Urgent Pointer):标识数据中紧急部分的长度。
3. UDP 与 TCP 对比总结
特性 | UDP | TCP |
---|---|---|
是否可靠 | ❌ 不可靠 | ✅ 可靠 |
是否连接 | ❌ 无连接 | ✅ 面向连接(三次握手) |
数据传输顺序 | ❌ 不保证顺序 | ✅ 保证顺序 |
是否支持多播 | ✅ 支持 | ❌ 不支持 |
传输速度 | ✅ 快速 | ❌ 较慢(因确认、重传等机制) |
头部大小 | 8 字节 | 20~60 字节 |
典型应用场景 | 实时音视频、在线游戏、DNS 查询等 | 网页浏览、邮件、文件传输等 |
4. 如何选择?
✅ 选择 UDP 的场景:
- 实时性要求高,容忍少量丢包(如语音通话、视频会议、游戏同步)。
- 需要广播或多播通信(如局域网设备发现、组播直播)。
- 对性能要求极高,希望减少协议开销。
✅ 选择 TCP 的场景:
- 数据完整性、顺序性要求高(如金融交易、HTTP、FTP)。
- 不希望自行处理丢包、乱序、重传等问题。
- 需要稳定、可靠、双向通信。
5. 小结
TCP 和 UDP 是网络通信中最基础也最重要的两个协议。它们各有优劣,适用于不同场景。
- UDP:轻量、快速、无连接、不可靠,适合实时性强、容忍丢包的场景。
- TCP:可靠、面向连接、有流量控制,适合对数据完整性和顺序性要求高的应用。
✅ 踩坑提醒:
- 不要将 TCP 用于实时音视频传输,否则可能因重传造成卡顿。
- 不要将 UDP 用于文件传输或支付类业务,否则可能造成数据丢失。
理解它们的特性,才能在实际开发中做出更合理的选择。