UDP 数据报与 UDP 检验
UDP 仅在 IP 层的数据报服务之上增加了复用、分用和差错检测的功能。若应用开发者选择 UDP 而非 TCP,则应用程序几乎直接与 IP 打交道。
真题考过 UDP 的特点(2014)、首部各字段的意义(2018)、首部长度(2021)和检验和的计算(2024)。本页的错题在伪首部上:伪首部只参与计算,既不发送也不上交。
机制
5.2.1 UDP 的优点
既然 TCP 提供可靠的服务而 UDP 不提供,TCP 并不总是首选,因为有很多应用更适合用 UDP。UDP 主要具有如下优点(UDP 的特点 2014 年考过):
- UDP 无须建立连接。因此 UDP 不会引入建立连接的时延。
- 无连接状态。TCP 需要在端系统中维护连接状态,包括接收和发送缓存、拥塞控制参数和序号与确认号的参数;而 UDP 既不维护连接状态,又不跟踪这些参数。因此,当某些专用服务器使用 UDP 时,一般都能支持更多的活动客户机。
- UDP 的首部开销小。TCP 有 20B 的首部开销,而 UDP 仅有 8B 的开销。
- UDP 没有拥塞控制,因此网络中的拥塞不会影响源主机的发送速率。某些实时应用要求源主机以稳定的速率发送数据,能容忍一些数据的丢失,但不允许有太大的时延。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
UDP 常用于一次性传输较少数据的网络应用,如 DNS、SNMP 等,因为对于这些应用,若采用 TCP,则将为连接创建、维护和拆除带来不小的开销。UDP 也常用于多媒体应用(如 IP 电话、实时视频会议、流媒体等),可靠数据传输对这些应用来说并不是最重要的,但 TCP 的拥塞控制会导致数据出现较大的延迟,这是它们不可容忍的。
UDP 不保证可靠交付,但这并不意味着应用对数据的要求是不可靠的,所有维护可靠性的工作可由用户在应用层来完成。应用开发者可根据应用的需求来灵活设计自己的可靠性机制。
UDP 是面向报文的。 发送方 UDP 对应用层交下来的报文,在添加首部后就向下交付给 IP 层,一次发送一个报文,既不合并,又不拆分,而是保留这些报文的边界;接收方 UDP 对 IP 层交上来的 UDP 数据报,在去除首部后就原封不动地交付给上层应用进程,一次交付一个完整的报文。因此报文不可分割,是 UDP 数据报处理的最小单位。所以应用程序必须选择合适大小的报文:若报文太长,则 UDP 把它交给 IP 层后,可能导致分片;若报文太短,则 UDP 把它交给 IP 层后,会使 IP 数据报的首部的相对长度太大,两者都会降低 IP 层的效率。
UDP 的首部格式
UDP 数据报包含两部分:首部字段和数据字段。UDP 首部有 8B,由 4 个字段组成,每个字段的长度都是 2B(UDP 首部格式及各字段意义 2018 年考过,首部长度 2021 年考过):
| 字段 | 长度 | 意义 |
|---|---|---|
| 源端口 | 2B | 源端口号。在需要对方回信时选用,不需要时可用全 0 |
| 目的端口 | 2B | 目的端口号。这在终点交付报文时必须使用到 |
| 长度 | 2B | UDP 数据报的长度(包括首部和数据),其最小值是 8(仅有首部) |
| 检验和 | 2B | 检测 UDP 数据报在传输中是否有错,有错就丢弃。该字段是可选的,当源主机不想计算检验和时,则直接令该字段为全 0 |
当传输层从 IP 层收到 UDP 数据报时,就根据首部中的目的端口,把 UDP 数据报通过相应的端口,上交最后的终点——应用进程。若接收方 UDP 发现收到的报文中的目的端口号不正确(不存在对应于端口号的应用进程),则就丢弃该报文,并由 ICMP 发送”端口不可达”差错报文给发送方(4.2.7)。
5.2.2 UDP 检验
在计算检验和时,要在 UDP 数据报之前增加 12B 的伪首部。伪首部并不是 UDP 的真正首部,只是在计算检验和时,临时添加在 UDP 数据报的前面,得到一个临时的 UDP 数据报。检验和就是按照这个临时的 UDP 数据报来计算的。伪首部既不向下传送,又不向上递交,而只是为了计算检验和。
| 伪首部字段 | 源 IP 地址 | 目的 IP 地址 | 全 0 | 协议号 17 | UDP 长度 |
|---|---|---|---|---|---|
| 字节数 | 4 | 4 | 1 | 1 | 2 |
UDP 计算检验和的方法和计算 IP 数据报首部检验和的方法基本相同。不同的是:IP 数据报的检验和只检验 IP 数据报的首部,但 UDP 的检验和要将首部和数据部分一起检验。
- 在发送方,先把全 0 放入检验和字段,再把伪首部和 UDP 数据报看成是由许多 16 位的字串接起来的。若 UDP 数据报的数据部分不是偶数个字节,则要在末尾填入一个全 0 字节(但此字节不发送)。然后按二进制反码计算出这些 16 位字的和,将此和的二进制反码写入检验和字段,并发送。
- 在接收方,把收到的 UDP 数据报连同伪首部(若不是偶数个字节,则还需补上一个全 0 字节)后,按二进制反码求这些 16 位字的和。当无差错时其结果应为全 1,否则就表明有差错出现,接收方就应丢弃这个 UDP 数据报。
二进制反码求和的运算规则(UDP 检验和的计算规则 2024 年考过):①从低位到高位逐列进行计算,0 和 0 相加是 0,0 和 1 相加是 1,1 和 1 相加是 0 并产生进位 1;②若最高位相加后产生进位,则最后得到的结果要在最低位加 1,该过程也称回卷。
王道的注意框补充两点:
- 若 UDP 检验和检验出 UDP 数据报是错误的,则可以丢弃,也可以交付给上层,但是需要附上错误报告,即告诉上层这是错误的数据报。
- 通过伪首部,不仅可以检查源端口号、目的端口号和 UDP 用户数据报的数据部分,还可以检查 IP 数据报的源 IP 地址和目的地址。
这种简单的差错检验方法的检错能力并不强,但它的好处是简单、处理速度快。
计算模板
检验和(二进制反码求和再取反)
- 把参与计算的所有 16 位字逐个相加。
- 每次相加若最高位产生进位,就把这个进位回卷到最低位加 1。
- 全部加完后,把结果逐位取反,得到检验和。
- 接收方把包括检验和在内的所有 16 位字按同样规则相加,结果为全 1 则无差错。
例(2024 年统考真题,王道 5.2.3 第 16 题):中间结果为 1011 1001 1011 0110,还需加上最后一个 16 位数 0110 0101 1100 0101。
检验和为 1110 0000 1000 0011(选 C)。只做到回卷而不取反,就会误选 B。
UDP 数据报在以太网上分片
UDP 数据报整体(首部 8B + 数据)作为 IP 数据报的数据部分,按 4.2.1 的方法分片。例如数据字段 9192B 的 UDP 数据报,总长 9200B,每片最多 1480B,需要
传输效率
应用层数据 200B,UDP 首部 8B,IP 首部取最大 60B,以太网帧首部和尾部 18B,传输效率
边界
错题复盘:伪首部只用于计算检验和,不发送给目的主机
王道 5.2.3 第 9 题:下列关于 UDP 检验的描述中,错误的是(A. UDP 检验和段的使用是可选的,若源主机不想计算检验和,则该检验和段应为全 0 B. 在计算检验和的过程中,需要生成一个伪首部,源主机需要把该伪首部发送给目的主机 C. 检验出 UDP 数据报出错时,可以丢弃或交付给上层 D. UDP 检验和还能检验 IP 数据报的源 IP 地址和目的 IP 地址)。答案 B。
UDP 数据报的伪首部包含了 IP 地址信息,目的是通过数据检验保证 UDP 数据报正确到达目的主机。伪首部是临时添加的,只是为了计算检验和,既不向下传送,又不向上递交。 接收方用自己收到的 IP 数据报首部中的地址重新构造伪首部来验算。若检验出 UDP 数据报出错,则可以丢弃,也可以交付给上层,但是需要告诉上层这是错误的数据报(C 对)。
D 看起来像越界——UDP 怎么能检验 IP 地址?答案正是伪首部:它把源、目的 IP 地址拉进了检验和的计算,接收方若收到了投错主机的数据报,验算就会失败。
UDP 长度字段不包括伪首部。 伪首部不属于 UDP 数据报,长度只算首部 8B 加数据(王道 5.2.3 第 2 题)。
UDP 首部没有”首部长度”字段。 首部固定 8B,没有必要设置(第 3 题)。
分用依据的是目的端口号,不是源端口号。 源端口号在不需要回信时甚至可以为全 0(2018)。
UDP 的差错检测不保证可靠传输。 出错就丢弃,没有重传;可靠性只能由应用层实现(2014)。
计算结果恰好为 0 时,检验和字段填全 1。 全 0 已被用来表示”没有计算检验和”(第 8 题,王道注明了解即可)。
口径差异:出错的 UDP 数据报能否交付给上层,检验和能否省略
教材口径:检验出错时可以丢弃,也可以交付给上层并附上错误报告;检验和是可选的,不计算时填全 0。
标准口径:主机要求规范(RFC 1122)规定,收到检验和非零且验算出错的 UDP 数据报,必须静默丢弃;常见操作系统也是这样实现的。检验和”可选”只在 IPv4 下成立,IPv6 取消了首部检验和(4.3.2),因此 IPv6 上的 UDP 检验和是必选的。
考试按教材口径作答:C 选项”可以丢弃或交付给上层”判为正确。
对照速查
| 说法 | 对错 |
|---|---|
| UDP 在 IP 之上增加了复用、分用和差错检测 | ✅ |
| UDP 首部 8B,由 4 个 2B 字段组成 | ✅ |
| UDP 长度字段只记录数据部分的长度 | ❌(首部 + 数据) |
| UDP 长度字段包括伪首部的长度 | ❌ |
| 伪首部要随 UDP 数据报一起发送 | ❌ |
| UDP 检验和检验首部和数据部分 | ✅ |
| UDP 检验和还能检验源、目的 IP 地址 | ✅(通过伪首部) |
| UDP 分用时依据源端口号 | ❌(目的端口号,2018) |
| UDP 通过差错检验保障可靠传输 | ❌(2014) |
| UDP 对应用层报文既不合并也不拆分 | ✅(面向报文) |
| UDP 没有拥塞控制,网络拥塞不影响源主机发送速率 | ✅ |
考点
- UDP 五个优点:无连接、无状态、首部 8B、无拥塞控制、支持多种交互(2014)
- 面向报文:保留边界,不合并不拆分
- 首部四字段:源端口(可全 0)、目的端口(分用依据)、长度(含首部,最小 8)、检验和(可选)(2018、2021)
- 12B 伪首部:只参与计算,不发送、不上交
- 二进制反码求和、回卷、最后取反(2024)
链接
- 🏠 返回总览:计算机网络第 5 章:传输层总览
- ⬅️ 上一节:5.1.3 无连接服务与面向连接服务
- ➡️ 下一节:5.3.1 TCP 的特点与报文段
- 🔗 4.2.1 IPv4 首部检验和与分片
- 🔗 CRC、校验和与路由算法伪代码(16 位检验和)
- 📖 名词库:第 5 章名词库