Skip to content

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 的原理和权衡,有助于选择合适的传输协议。