UDP 协议
2025/12/21大约 4 分钟
UDP 协议
核心概念
UDP(User Datagram Protocol) 是无连接、不可靠的传输层协议。它只提供最小化的服务:端口寻址、校验和,无序列号、确认、重传、流控、拥塞控制。适合实时性要求高、能容忍少量丢包的场景。
关键特性:
- 无连接:无握手建连,直接发送数据报。
- 不可靠:无重传、无顺序保证、无拥塞控制。
- 低开销:头部仅 8 字节(vs TCP 20-60 字节)。
- 支持多播/广播:一对多通信场景。
- 实时性好:无 TCP 的重传与队头阻塞延迟。
数据报结构
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source Port | Dest Port |
+--------+--------+--------+--------+
| Length | Checksum |
+--------+--------+--------+--------+
| Data Payload... |
+-----------------------------------+- Source/Dest Port:16 位,标识应用层端口。
- Length:整个数据报长度(含头部 8 字节)。
- Checksum:16 位校验和,可选(IPv4,IPv6 必须)。
UDP vs TCP
| 特性 | UDP | TCP |
|---|---|---|
| 连接 | 无连接 | 面向连接(三次握手) |
| 可靠性 | 不可靠(无重传) | 可靠(重传、确认) |
| 顺序 | 无序 | 有序 |
| 头部大小 | 8 字节 | 20-60 字节 |
| 速度 | 快 | 慢(握手、重传、流控) |
| 应用场景 | 实时音视频、DNS、游戏 | HTTP、文件传输、邮件 |
| 拥塞控制 | 无 | 有 |
适用场景
适合 UDP:
- 实时音视频通话(WebRTC、VoIP):延迟敏感,能容忍少量丢包。
- 在线游戏:要求低延迟,偶尔丢包可补偿。
- DNS 查询:单次请求-响应,重试简单。
- 广播/组播:IPTV、局域网设备发现。
- 日志、监控数据上报:允许少量丢失。
不适合 UDP:
- 文件传输:需可靠性,丢包需重传。
- 网页浏览(HTTP/HTTPS):需有序、完整内容。
- 金融交易:绝对不能丢失数据。
UDP 可靠性改进
虽然 UDP 本身不可靠,但应用层可自行实现:
- QUIC:在 UDP 上实现可靠传输 + 多路复用 + 加密。
- KCP:应用层 ARQ 协议,提供快速重传与拥塞控制。
- 自定义 ARQ:应用层序列号、ACK、超时重传机制。
常见问题与排查
问题 1:UDP 丢包
- 原因:网络拥塞、接收缓冲区满、中间设备限速。
- 排查:
netstat -su查看 UDP 统计;ss -ulnp查看监听端口;抓包tcpdump udp port XXX。 - 解决:应用层实现重传;调大接收缓冲区
net.core.rmem_max;限速场景用 QoS。
问题 2:UDP 被防火墙拦截
- 部分企业/运营商限制 UDP;中间盒可能屏蔽大流量 UDP。
- 测试:
nc -u host port或ncat -u;观察能否收到回包。 - 解决:降级到 TCP;使用 UDP 穿透(STUN/TURN);443 端口 UDP 通常较易通过。
问题 3:UDP Flood 攻击
- 恶意发送大量 UDP 包耗尽带宽或服务器资源。
- 防护:限制速率(iptables
limit模块);无状态防火墙过滤非法源;启用应用层认证。
性能调优
# 查看 UDP 统计
netstat -su
ss -su
# 调大接收/发送缓冲区(避免丢包)
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
sysctl -w net.core.rmem_default=262144
sysctl -w net.core.wmem_default=262144
# 增加接收队列长度
sysctl -w net.core.netdev_max_backlog=5000
# 查看特定端口监听
ss -ulnp | grep :5353
# 抓包查看 UDP 流量
tcpdump -i eth0 -n udp port 53相关高频面试题
Q1: UDP 无连接为什么还需要端口?
- 端口用于标识应用层服务,操作系统根据目的端口分发数据报给对应进程;无连接指无需握手建立连接状态,但仍需端口寻址。
Q2: UDP 校验和是如何计算的?可选吗?
- 包括伪头部(源/目的 IP、协议号、UDP 长度)+ UDP 头 + 数据,按 16 位求和取反码。
- IPv4 中可选(置 0 表示不校验),IPv6 中强制必须。
Q3: 为什么 DNS 用 UDP 而不是 TCP?
- DNS 查询通常单次请求-响应,数据量小(< 512 字节),UDP 开销低、速度快;失败后客户端重试简单。超过 512 字节或 DNSSEC 等场景会降级到 TCP。
Q4: UDP 如何实现可靠传输?
- 应用层添加序列号、ACK、超时重传机制(如 QUIC、KCP、RUDP)。
- 示例:QUIC 在 UDP 上实现了完整的可靠传输、流控、拥塞控制。
Q5: UDP 能否用于长连接?
- UDP 本身无连接概念,但应用层可维护"会话"状态(如 QUIC 的 Connection ID)。
- 需要应用层实现心跳保活、NAT 穿透、超时检测。
Q6: UDP Flood 攻击如何防御?
- 限速:iptables 限制每秒包数
iptables -A INPUT -p udp --dport 53 -m limit --limit 10/s -j ACCEPT。 - 无状态过滤:丢弃非法源、非预期端口。
- 应用层验证:Challenge-Response 机制确认合法客户端。
- 使用 CDN/Anti-DDoS 服务分散流量。