逐跳选项、目的选项和路由头的 Hdr Ext Len,以 8 个八位组为单位,而且不含前 8 个八位组。字段为 0 时,整段头正好 8 字节。分片头没有这个字段。定义在 2017 年 7 月的 RFC 8200。这份文件没有引用 RFC 2119。

先看不含的那 8 字节

下文引用 RFC 8200 时,「必须」只对应它的小写 must。RFC 9673 的大写词在后文单独标明。

一个可独立引用的定义句:逐跳选项头的 Hdr Ext Len 是 8 位无符号整数,表示该头的长度,单位是 8 个八位组,并且不含前 8 个八位组(RFC 8200 第 4.3 节)。目的选项头用同一句,写在第 4.6 节。路由头用同一句,写在第 4.4 节。

按这句直接推:字段为 0 时,整段是 8 个八位组;字段为 1 时,整段是 16 个八位组。原文没有把 (n + 1) × 8 印成等式。选项区的长度要凑成使整段头仍是 8 的整数倍。第 4 节另有一句总要求:每个扩展头的长度都是 8 个八位组的整数倍,以便后面的头保持这种对齐。

这不是 IPv6 基本头里的载荷长度。载荷长度是 16 位,计的是基本头之后的全部字节,扩展头算在里面(第 3 节)。协议 41 用这个载荷长度去填外层 IPv4 的总长度。Hdr Ext Len 只描述其中某一段头。两份数字不是同一个字段。基本头本身没有校验和,见 IPv4 头校验和。扩展头也没有因此多出一个头校验和字段。

头下一个头取值有没有 Hdr Ext Len长度怎样读
逐跳选项0,写在 IPv6 头里有8 字节单位,不含前 8 字节
目的选项60有与逐跳选项同一句
路由43有与逐跳选项同一句
分片44没有格式固定。图是两行 32 位。原文没有印出「8 个八位组」
无下一个头59不另起一段长度字段59 表示后面没有头

分片头的偏移、M 标志和 32 位标识见 IP 分片。本文只保留「它不使用 Hdr Ext Len」。认证头的长度是另一套:32 位字再减 2,写在 RFC 4302 第 2.2 节。本文不把那套减 2 代进上表。

第 4.8 节给新扩展头规定了同一张图,Hdr Ext Len 仍是 8 字节单位、不含前 8 字节。2026 年 10 月 23 日下载的正文把这一字段解释成 “Length of the Destination Options header”。已验证勘误 5256 是编辑性的,认为这是抄写错误,应改成扩展头(the extension header),单位那半句不动。勘误页的状态是 Verified,下载到的纯文本仍是旧句。本文不把勘误写成已经印进正文的句子。

填不满时用 Pad1 或 PadN

一个可独立引用的定义句:Pad1 是一个值为 0 的字节,没有长度和数据。需要两个或更多字节的填充时应当用 PadN:类型是 1,Opt Data Len 取值 N−2,选项数据是 N−2 个 0。N 是填充的字节数(RFC 8200 第 4.2 节)。

「应当」这里对应原文的小写 should:多于一个字节时,应当用 PadN,而不是连着放多个 Pad1。N 至少是 2。按 N−2 推,两字节填充时 Opt Data Len 是 0,后面不再跟数据字节。原文没有把这个 0 单独印出来。

选项是类型、长度、值。Opt Data Len 只计选项数据,不计类型和长度这两个字节。头里的选项必须严格按出现顺序处理,接收方不得先扫描到某一种再回头。这一句的「必须」「不得」仍是小写 must / must not。

选项类型的高两位决定处理节点不认识它时怎么办:

高两位第 4.2 节的动作
00跳过这个选项,继续处理这个头
01丢掉该包
10丢掉,并且不论目的地址是不是多播,都向源发送 ICMP 参数问题,代码 2,指针指向这个选项类型
11丢掉;只有目的地址不是多播时,才发送同样的 ICMP

第三高位是 0 表示选项数据途中不变,是 1 表示途中可以变。包里若有认证头,途中可变的选项必须把整个选项数据当成 0 来计算或核验认证值。这三位属于选项类型本身,不能只拿低 5 位当类型号。逐跳选项和目的选项共用这一套类型号;某个选项的规范可以限制它只能放在其中一种头里。RFC 4302 怎样把这一位落到完整性校验上,本文没有重读第 3.3.3 节。

当前头的下一个头不被识别时,目的节点应当丢掉该包,并发送 ICMP 参数问题,代码 1,指针指向这个无法识别的值在原包中的偏移。在 IPv6 头以外的任何头里看见下一个头为 0,应当做同样的事。这里是小写 should。本文不把它升成大写必须。

建议的顺序,和必须接受的顺序

一个可独立引用的定义句:多于一个扩展头时,建议的顺序是:IPv6 头、逐跳选项、目的选项、路由头、分片头、认证头、ESP、目的选项、上层头。除目的选项外,每种扩展头应当至多出现一次;目的选项应当至多两次(RFC 8200 第 4.1 节)。

前一个目的选项给路由头列出的那些目的地,包括 IPv6 目的地址字段里的第一站。后一个只给最终目的地。逐跳选项若出现,必须紧跟 IPv6 头,由 IPv6 头的下一个头取值 0 来标明。它不会被中途插入或删除,但路径上的节点可以检查它。RFC 8200 的注写:RFC 2460 要求所有节点都检查并处理;现在预期路径上的节点只有在明确配置时才检查。本文没有重读 RFC 2460。这是注里的预期,不是一条新的大写必须。

节点必须接受并试图处理任意顺序、任意次数的扩展头,唯独逐跳选项只能紧跟在 IPv6 头后面。建议顺序因此不是接收方可以据此丢包的清单。原文用 strongly advised 建议发送方仍遵守上面的顺序,除非以后的规范修改它。小写 must 与这句建议同时存在。本文不把「必须接受任意顺序」收成「所以顺序无所谓」。

上层头若又是一份 IPv6 头,它后面可以再跟自己的扩展头,并单独遵守同一套顺序建议。内层的 Hdr Ext Len 仍从内层那一段头起算,不因为外面多了一层封装而改写。某一封装实现会不会重写内层,本文没有测量。本文不提供改写步骤。

ESP 在第 4 节的实现清单里算扩展头,格式指向 RFC 4303。第 4.5 节划分可分片部分时又写,为了那一个目的,不把 ESP 当成扩展头。两句的范围不同。认证头和 ESP 相对扩展头的摆放,见 传输模式与隧道模式。本文不重排它们。

取值 59 表示这个头后面什么都没有。若载荷长度表明 59 之后还有字节,这些字节必须被忽略,转发时原样传递(第 4.7 节)。ESP 把 59 用作填充哑包的下一个头,是 RFC 4303 里的用法,传输模式那一篇已经分开写了。不要把「忽略 59 之后的字节」理解成「生成哑包」。

第 5 节要求每条链路的 MTU 至少 1280 个八位组。这是链路下限,不是 Hdr Ext Len 的单位。隧道把这个下限用在什么地方,见 VPN 的 MTU。

处理步骤后来有一份更新

RFC 9673 更新 RFC 8200,主题是逐跳选项的处理步骤,不是另定义一个长度字段。它的关键词按 BCP 14,只在全大写时算数。本文读了摘要、第 2 节的关键词声明、第 5.1 节里主机应当处理的那两句,以及第 5.2 节里下面这三句。其余没有读完。第 5.2 节写:路由器若不能处理某个逐跳选项,或没有配置成去处理它,应当按高两位为 00 的未识别选项来做,并应当用 Hdr Ext Len 跳过其余选项。紧接着的一句把这个字段说成「选项头的长度,以 8 个八位组为单位」,没有再写「不含前 8 个八位组」。再下一句又写:跳过一个选项之后,继续处理头里其余的选项。本文不把这三句收成对第 4.3 节的改写,也不另解释「跳过其余」和「继续处理其余」如何同时成立。

同一文件写明,主机应当处理收到的包里的逐跳选项头。目的地若不处理这个头,必须正常处理包的其余部分。这两句是 RFC 9673 的大写 SHOULD 和 MUST。路由器警告选项被写成例外,指向第 5.2.1 节。本文没有读完那一节,也没有重读 RFC 2711。

2026 年 10 月 23 日的勘误页把 RFC 8200 标成 Verified (2)、Held for Document Update (4),更新者是 RFC 9673。已读的两条已验证勘误是 5945 和 5256。5945 的对象是第 4.5 节的分片头,不是 Hdr Ext Len。Held 的 5933 位于第 4 节,本文没有读完,不把它当成已经改过的定义。其余 Held 与被拒绝的条目没有逐条读完。文件头把它标成 STD 86,并写明取代 RFC 2460。

现象对照

现象更可能先看什么
Hdr Ext Len 是 0整段仍有前 8 字节,不是「没有这个头」
用载荷长度去对某一段扩展头载荷长度含基本头之后的全部字节。Hdr Ext Len 只计自己这段,且不含前 8 字节
分片头里去找 Hdr Ext Len第 4.5 节的图没有这个字段
下一个头在扩展头里取值 0应当丢掉,并按代码 1 发 ICMP。0 只应出现在 IPv6 头里
逐跳选项不在 IPv6 头正后面与「必须紧跟」不符。别的扩展头则必须接受任意顺序
第 4.8 节把长度说成目的选项头下载到的正文仍如此。已验证勘误 5256 认为应改成扩展头

核对清单

  1. 不含前 8 字节:逐跳选项、目的选项、路由头都是 8 字节单位。0 表示整段正好 8 字节。(n + 1) × 8 是按定义推出的,原文没有印出;
  2. 分片头和认证头不用这套:分片头格式固定。认证头是 32 位字再减 2。59 表示后面没有头;
  3. Pad1 没有长度字节,PadN 的长度是 N−2。选项必须按出现顺序处理。高两位决定不认识时丢掉还是跳过;
  4. 建议顺序不是丢包条件:除逐跳选项必须紧跟 IPv6 头外,接收方必须接受任意顺序。外层封装不改内层这个字段;
  5. RFC 9673 没有重写单位。它跳过选项时没再写「不含前 8 字节」。勘误 5256 只改第 4.8 节的头名称。5933 没有读完。