进阶 #network#udp#transport

UDP 协议

UDP(User Datagram Protocol)是传输层的"平信"——不建立连接、不保证可靠、不重传丢失的包,但速度快、开销小,适合实时应用

✉️ 平信 vs 挂号信

你给朋友寄两张明信片:

挂号信(TCP):寄出前确认你能收、每封编号、收到要签收、丢了重寄——可靠但慢。

平信(UDP):写了地址就丢进邮筒——不管到没到、不管顺序。快但不保证到。

📐 UDP(User Datagram Protocol,用户数据报协议) 是传输层最简单的协议——它只是在 IP 层之上加了”端口号”来区分不同应用,其他什么也不保证。


📋 UDP 头部——只有 8 字节

和 TCP 头部(20-60 字节)相比——UDP 头部只有 4 个字段、8 个字节:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
┌───────────────┬───────────────────────────────────────────────┐
│      源端口    │            目标端口                            │
├───────────────┼───────────────────────────────────────────────┤
│      UDP 长度 │            UDP 校验和                          │
├───────────────┴───────────────────────────────────────────────┤
│                      数据                                      │
└───────────────────────────────────────────────────────────────┘

UDP 比 TCP 少了什么?

TCP 有(20-60 字节)UDP 有(8 字节)
序列号(保证顺序)❌ 无——数据可能乱序
确认号(保证到达)❌ 无——丢了不重传
窗口大小(流量控制)❌ 无——发就完了
标志位(SYN/ACK/FIN)❌ 无——不建立连接
端口号✅ 有
校验和✅ 有(可选)

⚡ 为什么需要 UDP——速度就是一切

TCP 的可靠性有代价:三次握手的延迟、确认重传的等待——有些场景下,“快”比”可靠”更重要。

场景为什么用 UDP即使丢包会怎样
视频通话延迟必须 < 150ms——不能等 TCP 重传一帧丢了就花一下,下帧马上来
在线游戏操作必须实时——等 TCP 重传的话人已经死了位置跳一下,但比”卡住不动”好
DNS 查询一个请求一个响应——简单快捷超时了再发一次就行
DHCP设备还没有 IP——没法建立 TCP 连接广播发出,不成功就重试
音视频直播数据量大——TCP 的确认重传会加剧拥塞偶尔花屏观众能接受
# DNS 使用 UDP 的典型过程(简单场景)
import socket

# 创建一个 UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# 构造一个 DNS 查询(二进制)
query = b'\x00\x01\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x05baidu\x03com\x00\x00\x01\x00\x01'

# 直接发——不需要 connect,不需要握手
sock.sendto(query, ('8.8.8.8', 53))

# 等响应——可能等不到(UDP 不保证),超时就重发
sock.settimeout(2)
try:
    response, addr = sock.recvfrom(1024)
    print('收到 DNS 响应')
except socket.timeout:
    print('超时,重发查询')

🆚 TCP vs UDP

对比TCPUDP
连接需要三次握手建立连接无连接——直接发
可靠性✅ 确认+重传保证到达❌ 不保证——丢了就丢了
顺序✅ 序列号保证有序❌ 可能乱序
头部大小20-60 字节8 字节
速度相对慢极快
流控✅ 有❌ 无
适用文件传输、网页、邮件音视频、游戏、DNS

📝 小结

概念一句话
UDP传输层的”平信”——不握手、不保证、不重传
头部仅 8 字节——源端口、目标端口、长度、校验和
无连接发数据不需要先建立连接——直接发
适用场景视频通话、在线游戏、DNS、实时音视频
UDP vs TCPUDP 快但不保证,TCP 慢但可靠——取决于你要什么