3.1. LOWPAN_IPHC 编码格式 (LOWPAN_IPHC Encoding Format)
本节规定 LOWPAN_IPHC 编码格式, 该格式描述 IPv6 头部如何被压缩. 基本编码长度可以为 2 个八位字节; 当存在额外上下文编码时, 长度可以为 3 个八位字节. 未被完全省略的 IPv6 头部字段会紧随 LOWPAN_IPHC 之后放置: 如果字段被部分省略, 则以压缩形式放置; 否则按字面值放置.
3.1.1. 基本格式 (Base Format)
0 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
| 0 | 1 | 1 | TF |NH | HLIM |CID|SAC| SAM | M |DAC| DAM |
+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
Figure 2: LOWPAN_IPHC 基本编码
TF: Traffic Class, Flow Label: 如 [RFC3168] 所规定, 8 bit IPv6 Traffic Class 字段被拆分为两个字段: 2 bit 显式拥塞通知 (Explicit Congestion Notification, ECN) 和 6 bit 差分服务代码点 (Differentiated Services Code Point, DSCP).
00: ECN + DSCP + 4 bit Pad + Flow Label (4 字节)01: ECN + 2 bit Pad + Flow Label (3 字节), DSCP 被省略.10: ECN + DSCP (1 字节), Flow Label 被省略.11: Traffic Class 和 Flow Label 被省略.
NH: 下一头部 (Next Header):
0: Next Header 的完整 8 bit 以内联方式携带.1: Next Header 字段被压缩, 下一头部使用 LOWPAN_NHC 编码; LOWPAN_NHC 见 Section 4.1.
HLIM: Hop Limit:
00: Hop Limit 字段以内联方式携带.01: Hop Limit 字段被压缩, hop limit 为 1.10: Hop Limit 字段被压缩, hop limit 为 64.11: Hop Limit 字段被压缩, hop limit 为 255.
CID: 上下文标识符扩展 (Context Identifier Extension):
0: 不使用额外的 8 bit Context Identifier Extension. 如果 Source Address Compression (SAC) 或 Destination Address Compression (DAC) 中指定了基于上下文的压缩, 则使用 context 0.1: 一个额外的 8 bit Context Identifier Extension 字段紧随 Destination Address Mode (DAM) 字段之后.
SAC: 源地址压缩 (Source Address Compression)
0: 源地址压缩使用无状态压缩.1: 源地址压缩使用有状态、基于上下文的压缩.
SAM: 源地址模式 (Source Address Mode):
如果 SAC=0:
00: 128 bit. 完整地址以内联方式携带.01: 64 bit. 地址的前 64 bit 被省略. 这些 bit 的值为以零填充的链路本地前缀. 剩余 64 bit 以内联方式携带.10: 16 bit. 地址的前 112 bit 被省略. 前 64 bit 的值为以零填充的链路本地前缀. 后续 64 bit 为0000:00ff:fe00:XXXX, 其中XXXX是以内联方式携带的 16 bit.11: 0 bit. 地址被完全省略. 地址的前 64 bit 为以零填充的链路本地前缀. 剩余 64 bit 按 Section 3.2.2 的规定从封装头部 (例如 802.15.4 或 IPv6 源地址) 计算.
如果 SAC=1:
00: 未指定地址 (UNSPECIFIED address),::01: 64 bit. 地址使用上下文信息和以内联方式携带的 64 bit 派生. 上下文信息覆盖的 bit 始终使用. 未被上下文信息覆盖的任何 IID bit 直接取自以内联方式携带的对应 bit. 任何剩余 bit 为零.10: 16 bit. 地址使用上下文信息和以内联方式携带的 16 bit 派生. 上下文信息覆盖的 bit 始终使用. 未被上下文信息覆盖的任何 IID bit 直接取自0000:00ff:fe00:XXXX给出的 16 bit 到 IID 映射中的对应 bit, 其中XXXX是以内联方式携带的 16 bit. 任何剩余 bit 为零.11: 0 bit. 地址被完全省略, 并使用上下文信息和封装头部 (例如 802.15.4 或 IPv6 源地址) 派生. 上下文信息覆盖的 bit 始终使用. 未被上下文信息覆盖的任何 IID bit 按 Section 3.2.2 的规定从封装头部计算. 任何剩余 bit 为零.
M: 组播压缩 (Multicast Compression)
0: 目的地址不是组播地址.1: 目的地址是组播地址.
DAC: 目的地址压缩 (Destination Address Compression)
0: 目的地址压缩使用无状态压缩.1: 目的地址压缩使用有状态、基于上下文的压缩.
DAM: 目的地址模式 (Destination Address Mode):
如果 M=0 且 DAC=0, 此情况与 SAC=0 相同, 但适用于目的地址:
00: 128 bit. 完整地址以内联方式携带.01: 64 bit. 地址的前 64 bit 被省略. 这些 bit 的值为以零填充的链路本地前缀. 剩余 64 bit 以内联方式携带.10: 16 bit. 地址的前 112 bit 被省略. 前 64 bit 的值为以零填充的链路本地前缀. 后续 64 bit 为0000:00ff:fe00:XXXX, 其中XXXX是以内联方式携带的 16 bit.11: 0 bit. 地址被完全省略. 地址的前 64 bit 为以零填充的链路本地前缀. 剩余 64 bit 按 Section 3.2.2 的规定从封装头部 (例如 802.15.4 或 IPv6 目的地址) 计算.
如果 M=0 且 DAC=1:
00: Reserved.01: 64 bit. 地址使用上下文信息和以内联方式携带的 64 bit 派生. 上下文信息覆盖的 bit 始终使用. 未被上下文信息覆盖的任何 IID bit 直接取自以内联方式携带的对应 bit. 任何剩余 bit 为零.10: 16 bit. 地址使用上下文信息和以内联方式携带的 16 bit 派生. 上下文信息覆盖的 bit 始终使用. 未被上下文信息覆盖的任何 IID bit 直接取自0000:00ff:fe00:XXXX给出的 16 bit 到 IID 映射中的对应 bit, 其中XXXX是以内联方式携带的 16 bit. 任何剩余 bit 为零.11: 0 bit. 地址被完全省略, 并使用上下文信息和封装头部 (例如 802.15.4 或 IPv6 目的地址) 派生. 上下文信息覆盖的 bit 始终使用. 未被上下文信息覆盖的任何 IID bit 按 Section 3.2.2 的规定从封装头部计算. 任何剩余 bit 为零.
如果 M=1 且 DAC=0:
00: 128 bit. 完整地址以内联方式携带.01: 48 bit. 地址采用ffXX::00XX:XXXX:XXXX形式.10: 32 bit. 地址采用ffXX::00XX:XXXX形式.11: 8 bit. 地址采用ff02::00XX形式.
如果 M=1 且 DAC=1:
00: 48 bit. 此格式旨在匹配 [RFC3306] 和 [RFC3956] 中定义的基于单播前缀的 IPv6 组播地址. 组播地址采用ffXX:XXLL:PPPP:PPPP:PPPP:PPPP:XXXX:XXXX形式. 其中 X 是以内联方式携带的半字节, 顺序与它们在此格式中出现的顺序相同. P 表示用于编码前缀本身的半字节. L 表示用于编码前缀长度的半字节. 前缀信息 P 和 L 从指定上下文取得.01: reserved10: reserved11: reserved
3.1.2. 上下文标识符扩展 (Context Identifier Extension)
本规范预期压缩分组的节点与需要展开该分组的节点之间共享一个概念上的上下文. 上下文如何共享和维护超出本规范范围. 上下文信息包含哪些信息超出本规范范围. 对未知和/或无效上下文采取何种响应动作也超出本规范范围. 本规范允许节点最多使用 16 个上下文. 用于编码源地址的上下文不必与用于编码目的地址的上下文相同.
如果 LOWPAN_IPHC 编码中的 CID 字段设置为 '1', 则在 DAM bit 之后、以内联方式携带的 IPv6 头部字段之前, 会有一个额外八位字节扩展 LOWPAN_IPHC 编码. 该额外八位字节标识压缩 IPv6 源地址和/或目的地址时要使用的一对上下文. 每个地址的上下文标识符为 4 bit, 最多支持 16 个上下文. Context 0 是默认上下文. 编码见 Figure 3.
0 1 2 3 4 5 6 7
+---+---+---+---+---+---+---+---+
| SCI | DCI |
+---+---+---+---+---+---+---+---+
Figure 3: LOWPAN_IPHC 编码
SCI: 源上下文标识符 (Source Context Identifier). 标识对 IPv6 源地址进行有状态压缩时使用的前缀.
DCI: 目的上下文标识符 (Destination Context Identifier). 标识对 IPv6 目的地址进行有状态压缩时使用的前缀.