UDP 协议
UDP(User Datagram Protocol,用户数据报协议)是无连接的、不可靠的传输层协议。UDP 不提供连接建立、数据确认、重传机制,只负责尽最大努力交付数据。
UDP vs TCP
UDP 的优势
无连接:不需要三次握手,发送数据前不需要建立连接,开销小。
首部开销小:UDP 首部只有 8 字节,TCP 首部最小 20 字节。
无拥塞控制:网络拥塞时不降低发送速率,适合实时应用(如视频会议、在线游戏)。
支持一对一、一对多、多对多:支持单播、广播、组播。
UDP 的劣势
不可靠:不保证数据到达,数据可能丢失、重复、乱序。
无流量控制:发送方不知道接收方的接收能力,可能淹没接收方。
无拥塞控制:网络拥塞时不降低发送速率,可能导致网络瘫痪。
UDP 头部格式
源端口和目的端口
16 位,标识发送方和接收方的进程。端口为 0 表示不指定端口。
长度
16 位,UDP 首部和数据的总长度,以字节为单位。最小值 8(只有首部)。
校验和
16 位,检验 UDP 首部和数据的完整性。UDP 的校验和是可选的,TCP 的校验和是必须的。
UDP 的应用场景
DNS
DNS 使用 UDP 通信,查询和响应短小,UDP 的开销小。DNS 响应超过 512 字节时使用 TCP。
DHCP
DHCP 使用 UDP 通信,客户端广播发送 DHCP Discover,服务器广播回复 DHCP Offer。
VoIP
VoIP(Voice over IP)使用 UDP 传输语音数据,容忍少量丢包,但要求低延迟。重传会导致延迟增加,影响通话质量。
在线游戏
在线游戏使用 UDP 传输游戏状态,容忍少量丢包,但要求低延迟。游戏客户端预测和插值可以补偿丢包。
直播
直播使用 UDP 传输视频数据,容忍少量丢包,但要求低延迟。重传会导致延迟增加,影响观看体验。
UDP 的增强
可靠 UDP
可靠 UDP 在 UDP 之上增加序列号、确认应答、超时重传,实现可靠传输。可靠 UDP 用于游戏、直播等场景,比 TCP 更灵活。
KCP(快速可靠传输 ARQ)是可靠 UDP 的实现,比 TCP 延迟低 30%-40%,但吞吐量比 TCP 低 10%-20%。
UDP 转发
UDP 转发(UDP Forwarding)是将 UDP 报文转发到其他服务器,实现负载均衡。UDP 转发需要修改源端口和目的端口,重新计算校验和。
UDP 打洞
UDP 打洞(UDP Hole Punching)是 NAT 穿透技术,用于 P2P 通信。两个 NAT 后的客户端通过中间服务器交换公网 IP 和端口,然后直接通信。
UDP 的安全问题
UDP 放大攻击
攻击者伪造源 IP,向 DNS、NTP 等服务器发送小请求,服务器回复大响应,流量被放大,攻击目标。解决方案:限制响应大小、验证请求来源。
UDP 洪水攻击
攻击者向目标发送大量 UDP 报文,耗尽目标的带宽和处理能力。解决方案:限流、黑名单、DDoS 防护。
UDP 的编程注意事项
报文大小
UDP 报文最大 65507 字节(65535 - 8 字节首部 - 20 字节 IP 首部)。超过 MTU(1500 字节)的报文会被 IP 层分片,分片丢失会导致整个报文丢失。建议 UDP 报文不超过 1472 字节(1500 - 20 字节 IP 首部 - 8 字节 UDP 首部)。
缓冲区溢出
UDP 不保证数据到达,发送速率超过接收方的处理能力时,接收方的缓冲区溢出,数据丢失。解决方案:增加缓冲区、限流、丢包策略。
校验和
UDP 的校验和是可选的,设置为 0 表示不计算校验和。建议启用校验和,避免数据损坏。
UDP 是简单高效的传输协议,适合实时应用和短连接场景。理解 UDP 的原理和权衡,有助于选择合适的传输协议。