UDP 数据报与 UDP 检验

UDP 仅在 IP 层的数据报服务之上增加了复用、分用和差错检测的功能。若应用开发者选择 UDP 而非 TCP,则应用程序几乎直接与 IP 打交道。

真题考过 UDP 的特点(2014)、首部各字段的意义(2018)、首部长度(2021)和检验和的计算(2024)。本页的错题在伪首部上:伪首部只参与计算,既不发送也不上交。

机制

5.2.1 UDP 的优点

既然 TCP 提供可靠的服务而 UDP 不提供,TCP 并不总是首选,因为有很多应用更适合用 UDP。UDP 主要具有如下优点(UDP 的特点 2014 年考过):

  1. UDP 无须建立连接。因此 UDP 不会引入建立连接的时延。
  2. 无连接状态。TCP 需要在端系统中维护连接状态,包括接收和发送缓存、拥塞控制参数和序号与确认号的参数;而 UDP 既不维护连接状态,又不跟踪这些参数。因此,当某些专用服务器使用 UDP 时,一般都能支持更多的活动客户机。
  3. UDP 的首部开销小。TCP 有 20B 的首部开销,而 UDP 仅有 8B 的开销。
  4. UDP 没有拥塞控制,因此网络中的拥塞不会影响源主机的发送速率。某些实时应用要求源主机以稳定的速率发送数据,能容忍一些数据的丢失,但不允许有太大的时延。
  5. 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目的端口号。这在终点交付报文时必须使用到
长度2BUDP 数据报的长度(包括首部和数据),其最小值是 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协议号 17UDP 长度
字节数44112

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,该过程也称回卷。

王道的注意框补充两点:

  1. 若 UDP 检验和检验出 UDP 数据报是错误的,则可以丢弃,也可以交付给上层,但是需要附上错误报告,即告诉上层这是错误的数据报。
  2. 通过伪首部,不仅可以检查源端口号、目的端口号和 UDP 用户数据报的数据部分,还可以检查 IP 数据报的源 IP 地址和目的地址。

这种简单的差错检验方法的检错能力并不强,但它的好处是简单、处理速度快。

计算模板

检验和(二进制反码求和再取反)

  1. 把参与计算的所有 16 位字逐个相加。
  2. 每次相加若最高位产生进位,就把这个进位回卷到最低位加 1。
  3. 全部加完后,把结果逐位取反,得到检验和。
  4. 接收方把包括检验和在内的所有 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,需要 片,前 6 片各 1480B,最后一片 320B,片偏移依次为 0、185、370、555、740、925、1110(王道 5.2.3 第 11 题)。UDP 首部只出现在第一片中。

传输效率

应用层数据 200B,UDP 首部 8B,IP 首部取最大 60B,以太网帧首部和尾部 18B,传输效率 (王道 5.2.3 第 12 题)。

边界

错题复盘:伪首部只用于计算检验和,不发送给目的主机

王道 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)

链接