UDP 长度是这份用户数据报的八位组数,含 UDP 头和数据,最小是 8。它不计 IP 头。IP 传输载荷更长时,多出来的一段在 RFC 9868 里叫做余量区。IPv6 上只有头加数据超过 65535,RFC 2675 才要求把该字段写成 0。

长度含头,最小是 8

一个可独立引用的定义句:UDP 长度是这份用户数据报的八位组数,含这个头和数据。因此长度的最小值是 8(RFC 768)。

RFC 768 是 1980 年 8 月的 Internet Standard,STD 6。它没有 BCP 14 的用词条款。上面这句是字段定义,不是后来加上的「必须」。图里在数据之前有源端口、目的端口、长度、校验和四栏。原文没有另印「头长等于 8」;它印出的是最小值 8。

源端口不用时填 0。目的端口的含义要连同目的地址一起看。这两栏都是 16 位,但不进入本文的长度规则。校验和盖住伪首部、UDP 头和数据;伪首部里也有一份 UDP 长度。全 0 校验和表示什么,见 UDP 校验和。本文不重述。

2026 年 10 月 25 日打开的 RFC 768 勘误页 写着没有匹配的勘误。同日的 RFC 编辑器元数据把更新者列为 RFC 9868。下一节只采用已读过的那些节。

它可以短于 IP 给出的空间

一个可独立引用的定义句:UDP 长度含 UDP 头。IP 头所暗示的传输载荷更长时,多出来的一段是余量区,RFC 9868 用它放置 UDP 选项。多数情况下两者指到同一处,这不是 RFC 768 的一项要求(RFC 9868 第 7 节)。

RFC 9868 是 2025 年 10 月的 Standards Track,更新 RFC 768。关键词按 RFC 2119 和 RFC 8174 解释,只在全大写时才算。行首的 >> 标出使用这些词的句子。

第 7 节给出长度的上界。协议字段是 17 时:

外层上界
IPv4UDP 长度 ≤ IPv4 总长度 − IHL × 4。前面若还有垫片头,再减去那些头的长度
IPv6UDP 长度 ≤ IPv6 载荷长度 − 各扩展头长度之和

IHL 以 4 字节为单位,这句引自 RFC 9868 对 RFC 791 的转述。本文不另写 IPv4 头长度。协议字段不是 17 时,例如中间还有 IPsec 或 IPComp,第 7 节把这写成例外,上表的前提不成立。本文不展开那两份封装怎样改写协议字段。

第 8 节有一条带 >> 的必须:UDP 长度必须至少等于 UDP 头(8),并且不得大于 IP 传输载荷。落在这个范围外的数据报必须当作无效而静默丢弃,并记入日志。日志应当限速。第 21 节列出的更新只有两条:把 UDP 长度之外、IP 长度之内的区域定义为余量区;以及扩展 UDP 的编程接口。上一段的「必须丢弃」印在第 8 节,没有再出现在第 21 节的条目里。

第 18 节写:UDP 长度与 IP 传输载荷长度不一致,一直是允许的,并引用 RFC 768。第 22 节又写:这种关系在 RFC 768 和主机要求 RFC 1122 里都没有明确约束。两句都在 RFC 9868 里。RFC 768 正文没有比较这两个长度。2026 年 10 月 25 日没有重读 RFC 1122,因此不复述那一份的句子。

图 3 把 UDP 长度画成盖住 UDP 头和用户数据,余量区在这个长度之后、IP 传输载荷之内。第 17 节写明,长度偏移之后的数据默认不交给应用,只在 UDP 传输层里解释。本文没有读完各选项种类,因此不给 Kind、AUTH 或分片选项的格式。已验证勘误 8834 改的是第 14 节过长选项如何处理,并指向第 10 节;它不改第 8 节的长度范围。勘误 8708 标为 Held for Document Update,改的是第 11.4 节的一张图。本文不采用尚未写入正文的那一处。

写成 0 时,实际长度要另算

一个可独立引用的定义句:UDP 头加数据大于 65535 八位组时,才把 UDP 长度设为 0,接收方再从 IPv6 巨型载荷长度减去 IPv6 头和 UDP 头之间的扩展头,得到实际长度。在这份修改之前,0 不是合法值,因为长度含头,最小是 8(RFC 2675 第 4 节)。

RFC 2675 是 1999 年 8 月的 Proposed Standard,取代 RFC 2147。正文没有 RFC 2119 的关键词条款。下面的「必须」对应它的小写 must。巨型载荷选项的类型是十六进制 C2,选项数据长度是 4,放在紧跟 IPv6 头的逐跳选项头里。选项里的 32 位长度不含 IPv6 头,但含逐跳选项头和其他扩展头,并且必须大于 65535。IPv6 头里的载荷长度在带这个选项时必须为 0。它不得与分片头同时出现。第 2 节和第 3 节是这些句子的出处。

发送时还有一句「当且仅当」。校验和使用实际的头加数据长度,不用 0。接收时也是当且仅当长度为 0,才做上面的减法。意外情形是长度为 0 但没有巨型载荷选项:这时改用 IPv6 头里的载荷长度来做同一减法。校验和仍然用算出来的长度,不用 0。

第 4 节开头还有一句较松的话:让接收方从 IPv6 载荷长度推出实际 UDP 包长。勘误 2175 的状态是 Held for Document Update,建议把这句改成从巨型载荷长度推出,理由是 IPv6 载荷长度此时为 0。编号后的接收规则已经分开写了巨型载荷长度和意外情形。本文不把这条尚未入正文的勘误写成现行句子。

RFC 9868 第 22 节写明:UDP 长度为 0 时不能支持 UDP 选项。它把这写成用于、但不限于 IPv6 巨型报文,并写明 RFC 2675 虽是 Standard,却没有 update RFC 768。因此第 8 节「至少为 8」没有在本文里被读成「已经废止长度为 0」。

2026 年 10 月 25 日在下载的 RFC 8200 纯文本里没有检索到 jumbo 或 2675。同日的元数据也没有把 RFC 2675 标成已被取代。本文不据此宣称 RFC 8200 改写或保留了巨型载荷,只说明那份文本里没有这两个词。TCP 没有自己的长度字段,第 5 节是另一件事。本文没有复述。

IPv6 扩展头 里的 Hdr Ext Len 不含前 8 字节,而且只描述某一段扩展头。IPv6 载荷长度则含基本头之后的全部字节。UDP 长度只含 UDP 头和数据。三者不是同一个数。

隧道外层仍用这一个字段

端口 4500 上,IKE 以四个 0 开头,ESP 直接从 SPI 开始。那四个 0 在 UDP 载荷里,见 非 ESP 标记。UDP 长度含数据,因此这四个 0 在 UDP 长度之内。这是两句的对照,不是第三份 RFC 里印出的「长度含标记」。IKE 头自己的长度字段不含这四个 0,见 IKE 头。

外层用 UDP 还是 TCP,见 VPN 用 TCP 还是 UDP。TCP 头没有这个 16 位长度。IP 层把一份 UDP 再拆开,是另一层的事,见 IP 分片。分片不改写「UDP 长度含头」这句定义。

本文不提供构造余量区、把长度写成 0,或改写外层长度的步骤。

现象对照

现象更可能先看什么
长度为 8只有 UDP 头,用户数据长度为 0。这仍含头
长度大于 8,且与 IP 传输载荷对齐没有余量区。RFC 9868 写明这是常见情况,不是 RFC 768 的要求
长度小于 IP 传输载荷,且至少为 8余量区。默认不交给应用
长度小于 8,或大于 IP 传输载荷RFC 9868 第 8 节:必须静默丢弃并记日志
IPv6 上长度为 0RFC 2675 的发送条件是头加数据超过 65535。接收方还要处理没有巨型选项的意外情形
长度为 0 仍想读 UDP 选项RFC 9868 第 22 节:这种包不能支持 UDP 选项

核对清单

  1. 长度含头,最小是 8:RFC 768 没有另印「头长等于 8」。0 在这份修改之前不合法;
  2. 余量区在长度之后:定义和编程接口的更新在 RFC 9868 第 21 节。至少为 8、否则丢弃,印在第 8 节。第 18 节和第 22 节对「768 有没有写明不一致」用词不同;
  3. 写成 0 要另算:发送端当且仅当超过 65535。校验和使用实际长度。勘误 2175 尚未入正文;
  4. 至少为 8 没有在本文里废止长度 0:RFC 9868 第 22 节把长度 0 保留为不能加选项的情形;
  5. 四个 0 在 UDP 长度里,不在 IKE 长度里。选项种类、RFC 1122 和 RFC 8200 的巨型载荷句子没有读完。