进阶 #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
| 对比 | TCP | UDP |
|---|---|---|
| 连接 | 需要三次握手建立连接 | 无连接——直接发 |
| 可靠性 | ✅ 确认+重传保证到达 | ❌ 不保证——丢了就丢了 |
| 顺序 | ✅ 序列号保证有序 | ❌ 可能乱序 |
| 头部大小 | 20-60 字节 | 8 字节 |
| 速度 | 相对慢 | 极快 |
| 流控 | ✅ 有 | ❌ 无 |
| 适用 | 文件传输、网页、邮件 | 音视频、游戏、DNS |
📝 小结
| 概念 | 一句话 |
|---|---|
| UDP | 传输层的”平信”——不握手、不保证、不重传 |
| 头部 | 仅 8 字节——源端口、目标端口、长度、校验和 |
| 无连接 | 发数据不需要先建立连接——直接发 |
| 适用场景 | 视频通话、在线游戏、DNS、实时音视频 |
| UDP vs TCP | UDP 快但不保证,TCP 慢但可靠——取决于你要什么 |