Skip to content

UDP协议

UDP 是 TCP/IP 协议族中传输层的一个核心协议。它被设计成一种极简的、面向报文的传输协议。它在 IP 协议提供的不可靠服务之上,仅增加了两个最基本的服务:复用/分用(端口号)差错检测(校验和)

1. UDP 的核心特性

  1. 面向无连接:发送数据之前不需要建立连接(没有三次握手),发送结束后也没有连接释放(没有四次挥手)。
  2. 不可靠交付:它不保证数据包能成功到达目的地,也不保证按序到达,更没有重传机制。数据发出去后,UDP 就不再管了。
  3. 面向报文:UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给 UDP 多长的报文,UDP 就发多长。
  4. 无拥塞控制与流量控制:UDP 永远以恒定的速度发送数据,不管网络是否拥堵。这对于实时应用(如直播)非常重要。
  5. 支持一对一、一对多(广播/多播)通信:这是 TCP 做不到的。
  6. 首部开销极小:只有 8 个字节,比 TCP 的 20 字节轻量得多。

2. UDP 报文首部结构 (仅 8 字节)

UDP 的简洁在其首部体现得淋漓尽致。

字段名长度说明
源端口 (Source Port)16 位发送方的进程端口号。
目的端口 (Destination Port)16 位接收方的进程端口号。
长度 (Length)16 位UDP 用户数据报的长度(包含首部和数据),最小值为 8。
校验和 (Checksum)16 位检测 UDP 数据报在传输中是否有错。如果有错,直接丢弃。

3. UDP vs. TCP 深度对比

这是网络面试中最经典的问题,通过表格可以直观看出两者的取向:

特性UDPTCP
连接性无连接面向连接
可靠性不可靠(尽力而为)可靠(保证送达、不乱序)
传输方式面向报文(保留数据边界)面向字节流(无边界)
传输速度极快(无握手开销)较慢(机制复杂)
首部开销8 字节20 ~ 60 字节
流量/拥塞控制
资源消耗
适用场景实时视频、在线游戏、DNS、直播文件传输、邮件、网页浏览
优点安全、快速、漏洞少稳定、重传机制、拥塞控制机制、断开连接
缺点不可靠、不稳定、容易丢包速度慢、效率低、占用资源、容易被攻击(三次握手->DDOS攻击)

4. UDP 的典型应用场景

为什么在明知不可靠的情况下,我们还要使用 UDP?答案是:低延迟和实时性

  1. 实时流媒体/视频会议 (VoIP):在语音通话或直播中,丢掉一两个数据包(画面花一下或声音断一下)是可以接受的,但如果因为等待重传而导致长达数秒的延迟,通话就没法进行了。
  2. 在线游戏:在快节奏游戏中(如 FPS 或 MOBA),即时位置信息比历史位置更重要。丢了旧包没关系,只要下一个新包能快点到就行。
  3. DNS (域名系统):查询域名的请求很短。如果用 TCP,握手就需要 3 个包,查询才 1 个包,太浪费了。用 UDP 一问一答,效率最高。
  4. 广播与多播:例如局域网内的设备发现、视频广播。TCP 无法实现一对多。
  5. 简单网络协议:如 DHCP(动态主机配置)、SNMP(简单网络管理)。

5. 常见问题 (FAQ) 与面试热点

5.1 UDP 是不可靠的,如果我非要在 UDP 上实现可靠传输怎么办?

  • 答案:这需要在应用层(你写的代码里)自己实现可靠性机制。
  • 具体做法:你可以模仿 TCP,在应用层逻辑中加入序列号、确认应答(ACK)和超时重传。
  • 现代案例QUIC 协议(HTTP/3 的底层)。QUIC 就是基于 UDP 的,但它在 UDP 之上通过算法实现了类似 TCP 的可靠性、拥塞控制,同时又保留了 UDP 快、连接迁移等优点。

5.2 UDP 报文的大小有限制吗?

  • 理论上:UDP 长度字段是 16 位,最大可达 65535 字节。
  • 实际上:受限于底层 IP 层和以太网的 MTU(最大传输单元,通常是 1500 字节)
    • 为了避免在 IP 层被切片(切片会导致效率降低且增加丢包风险),建议 UDP 载荷控制在 1472 字节以内(1500 - 20 字节 IP 首部 - 8 字节 UDP 首部)。

5.3 UDP 会发生粘包吗?

  • 答案:绝对不会。
  • 原因:粘包是 TCP 这种“面向字节流”协议特有的问题。UDP 是“面向报文”的,它有明确的数据边界。发送方发一个包,接收方就收一个完整的包,不会出现多个包粘在一起的情况。

5.4 为什么 UDP 适合用于 DDoS 攻击(如 NTP 反射攻击)?

  • 无连接性:黑客可以非常容易地伪造源 IP 地址发送 UDP 包,而不需要像 TCP 那样建立握手。
  • 放大效应:攻击者利用 UDP 向某些服务器(如 DNS 或 NTP)发送微小的请求,诱导服务器向受害者的 IP 发回巨大的响应数据包,从而以极小的代价瘫痪受害者的网络。

5.5 校验和(Checksum)是必须的吗?

  • 在 IPv4 中,UDP 校验和是可选的(但强烈建议开启)。
  • 在 IPv6 中,为了保证基本的安全性,UDP 校验和是强制性的。

5.6 UDP 发送太快会导致接收方缓冲区溢出吗?

  • 会。 既然 UDP 没有流量控制,如果发送方拼命发,而接收方来不及从内核缓冲区读取数据,缓冲区就会满。一旦满了,后续到达的 UDP 包会被系统直接丢弃

5.7 既然 UDP 不可靠,那 DNS 丢包了怎么办?

  • DNS 客户端在发出请求后会启动一个超时定时器。如果在一定时间内没有收到 UDP 响应,客户端会再次发起请求。这种简单的重试机制对于 DNS 这种轻量级交互来说成本非常低。