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) 建立连接,确保双方都准备好进行通信。

3way

流程如下:

  1. SYN(同步):客户端发送 SYN 包(如 seq=100)给服务器,并进入 SYN_SENT 状态。
  2. SYN-ACK(同步-确认):服务器响应 SYN-ACK(seq=300, ack=101),进入 SYN_RCVD 状态。
  3. 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 用于文件传输或支付类业务,否则可能造成数据丢失。

理解它们的特性,才能在实际开发中做出更合理的选择。


原始标题:UDP vs TCP