4.2. IPv6 扩展头部压缩 (IPv6 Extension Header Compression)
使用 LOWPAN_NHC 编码头部的一个必要属性是, 紧前一个头部必须使用 LOWPAN_IPHC 或 LOWPAN_NHC 编码. 换句话说, 所有使用本文档定义的 6LoWPAN 编码格式编码的头部都必须连续. 因此, 本文档为选定的 IPv6 扩展头部定义了一组 LOWPAN_NHC 编码, 使 Section 4.3 中定义的 UDP 头部压缩可以在存在这些扩展头部时使用.
IPv6 扩展头部的 LOWPAN_NHC 编码由单个 LOWPAN_NHC 八位字节后跟 IPv6 扩展头部组成. LOWPAN_NHC 八位字节的格式见 Figure 13. 前 7 bit 用作紧随 LOWPAN_NHC 八位字节之后的 IPv6 扩展头部的标识符. 剩余 1 bit 指示后续头部是否使用 LOWPAN_NHC 编码.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| 1 | 1 | 1 | 0 | EID |NH |
+---+---+---+---+---+---+---+---+
Figure 13: IPv6 扩展头部编码
EID: IPv6 扩展头部 ID (IPv6 Extension Header ID):
0: IPv6 Hop-by-Hop Options Header [RFC2460]1: IPv6 Routing Header [RFC2460]2: IPv6 Fragment Header [RFC2460]3: IPv6 Destination Options Header [RFC2460]4: IPv6 Mobility Header [RFC6275]5: Reserved6: Reserved7: IPv6 Header
NH: 下一头部 (Next Header):
0: Next Header 的完整 8 bit 以内联方式携带.1: Next Header 字段被省略, 下一头部使用 LOWPAN_NHC 编码; LOWPAN_NHC 见 Section 4.1.
在大多数情况下, IPv6 扩展头部会在紧随 LOWPAN_NHC 八位字节之后的字节中不加修改地携带, 但有两个重要例外: Length 字段和 Next Header 字段.
当 LOWPAN_NHC 编码八位字节中的 NH bit 被设置时, IPv6 扩展头部中包含的 Next Header 字段会被省略. 注意, 这样做可使 LOWPAN_NHC 的开销不超过未编码的 IPv6 扩展头部.
压缩 IPv6 扩展头部中包含的 Length 字段表示 Length 字段之后属于该 (压缩) 扩展头部的八位字节数量. 注意, 这改变了 [RFC2460] 中 Length 字段的定义; 后者使用 8 八位字节为单位表示头部大小, 且不包括前 8 个八位字节. 将 Length 字段改为以八位字节为单位可以消除浪费性的内部分片.
IPv6 Hop-by-Hop 和 Destination Options 头部可以使用尾随 Pad1 或 PadN 来实现 8 八位字节对齐. 当存在单个长度为 7 个八位字节或更少的尾随 Pad1 或 PadN 选项, 且包含它的头部长度为 8 八位字节的倍数时, 压缩器可以 (MAY) 省略该尾随 Pad1 或 PadN 选项. 解压缩器必须 (MUST) 确保包含它的头部被填充到长度为 8 八位字节的倍数, 必要时使用 Pad1 或 PadN 选项. 注意, 出现在末尾之外位置的 Pad1 和 PadN 选项必须 (MUST) 以内联方式携带, 因为它们用于对齐后续选项.
注意, 指定以八位字节为单位意味着, 对于压缩后 Length 字段之后超过 255 个八位字节的 IPv6 扩展头部, 禁止 (MUST NOT) 使用 LOWPAN_NHC 进行编码.
当被标识的下一头部是 IPv6 Header (EID=7) 时, LOWPAN_NHC 编码中的 NH bit 未使用, 且必须 (MUST) 设置为零. 后续字节必须 (MUST) 使用 Section 3 中定义的 LOWPAN_IPHC 进行编码.