7. 子头的压缩 (Compression of subheaders)
7. 子头的压缩 (Compression of subheaders)
本节描述 IPv6 基础头、IPv6 扩展头、IPv4 头、UDP 头和 TCP 头中各个字段在压缩时所采用的处理方式。每个字段被归入以下类别之一:
- NOCHANGE(不变):字段在压缩头中发送,且其值被推断为与上下文中的值相同。如果推断错误,则需要通过发送完整头或头更新来修复。
- INFERRED(推断):字段的值可以由其他信息推断得出(例如链路层帧的长度),因此不在头中发送。
- DEF(定义字段):该字段是"定义字段"(见第 4.1 节),其值用于识别分组流。定义字段在完整头中发送,并存储到上下文(模板)中。
- SAME(相同):与 NOCHANGE 类似,但仅当该字段包含的位全部相同时才成立。
- DELTA(增量):压缩头中携带该字段与上下文值的差值。接收方将此差值加到上下文中的值上以重建字段。
- RANDOM(随机):该字段在压缩头中原样发送,因为它不可预测。
IPv6 基础头和 IPv6 扩展头的每个字段都根据上述类别进行处理,详见本章末尾的分类表(7.1、7.11、7.12、7.13 各节表格)。
7.1 IPv6 头 (IPv6 Header)
IPv6 基础头和 IPv6 扩展头的每个字段都根据下表进行处理。表中的各列含义如下:
Field(字段):IPv6 头或扩展头中字段的名称。
Size(大小):字段的长度(以位为单位)。
DEF:如果字段是定义字段(见第 4.1 节),则标记为 Yes。
Tmpl(模板):如果字段在完整头中发送并存储到上下文(模板)中,则标记为 Yes。
C(压缩):如果字段在压缩头中发送,则标记为 Yes。
Tmpl & C:如果字段在完整头和压缩头中都被发送,则标记为 Yes。此类字段不会成为上下文的一部分。
Inferred(推断):说明该字段是否可由其他信息(例如链路层帧的大小)推断得出。
Notes(注释):字段的备注。
| Field | Size | DEF | Tmpl | C | Tmpl & C | Inferred | Notes |
|---|---|---|---|---|---|---|---|
| Version | 4 | No | Yes | No | No | No | 常量 (6) |
| Traffic Class | 8 | No | Yes | Yes | No | No | 可能改变 |
| Flow Label | 20 | Yes | Yes | No | No | No | 定义字段 |
| Payload Length | 16 | No | No | No | No | Yes | 从帧长度推断 |
| Next Header | 8 | No | Yes | Yes | No | No | 可能改变 |
| Hop Limit | 8 | No | Yes | Yes | No | No | 可能改变 |
| Source Address | 128 | Yes | Yes | No | No | No | 定义字段 |
| Destination Address | 128 | Yes | Yes | No | No | No | 定义字段 |
7.2 IPv6 扩展头 (IPv6 Extension Headers)
哪些扩展头存在以及它们的相对顺序,在一条分组流中预期不会改变。一旦发生变化,就必须发送完整分组头。IPv6 基础头和所有 IPv6 扩展头中的 Next Header 字段均为 NOCHANGE。
7.3 选项 (Options)
逐跳选项头和目的地选项头的内容采用 TLV(类型-长度-值)"选项"编码(见 [IPv6]):
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
| Option Type | Opt Data Len | Option Data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
Option Type 和 Opt Data Len 字段对于给定分组流假定为固定不变,因此分类为 NOCHANGE。Option Data 为 RANDOM,除非下文另有说明。
填充(Padding)
- Pad1 选项
+-+-+-+-+-+-+-+-+
| 0 |
+-+-+-+-+-+-+-+-+
整个选项为 NOCHANGE。
- PadN 选项
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
| 1 | Opt Data Len | Option Data
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- - - - - - - - -
所有字段均为 NOCHANGE。
7.4 逐跳选项头 (Hop-by-Hop Options Header)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +
| |
. .
. Options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Next Header NOCHANGE
Hdr Ext Len NOCHANGE
Options TLV 编码的值与填充。
按上文 7.3 分类,除非是下列
Jumbo Payload 选项(见下)。
Jumbo Payload 选项
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Option Type = 0xC2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Opt Data Len = 4 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Jumbo Payload Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
前两个字段为 NOCHANGE,Jumbo Payload Length 为 INFERRED。
7.5 路由头 (Routing Header)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Routing Type | Segments Left |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. type-specific data (路由类型相关数据) .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Routing Header 的所有字段均为 NOCHANGE。
如果不识别 Routing Type,则无法确定所有字段,因此整个 Routing Header 被分类为 RANDOM。
在 Type 0 Routing Header 中,最后一个地址在 (Segments Left > 0) 时为 DEF。
Routing Header 被完全压缩掉。这对于移动 IP(Mobile IP)而言是一个很大的收益。
7.6 分片头 (Fragment Header)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | Reserved | Fragment Off. |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Fragment Offset | Res | M | Identification |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
一个分组的首个分片其 Fragment Offset = 0,且分片链在到达压缩点之前可能已被重新排序。由于分组可能被重新排序,首个分片的 Fragment Header 无法被检查以确定 Identification 字段,因此 Fragment Header 的字段分类如下:
Next Header NOCHANGE
Hdr Ext Len NOCHANGE(必须为 0)
Reserved NOCHANGE
Fragment Offset NOCHANGE(必须为 0)
M (More Fragments) NOCHANGE(必须为 0)
Identification RANDOM
该分类意味着一个 Fragment Header 被压缩到只剩 Next Header 和 Hdr Ext Len(均为 NOCHANGE),其余全部推断得出(Fragment Offset 和 M 必须为 0,Identification 为 RANDOM)。
根据第 4.1 节的可选准则,可以对分片进行分组。
7.7 目的地选项头 (Destination Options Header)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Hdr Ext Len | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
. .
. Options .
. .
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
[IPv6] 中定义的唯一 Destination Options 是填充选项,其处理方式见 7.3。
整个 Destination Options Header 按"IPv6 扩展头的规则"(7.2)处理。
7.8 身份验证头 (Authentication Header, AH)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Next Header | Payload Len | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Security Parameters Index (SPI) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number (序列号) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| Authentication Data (可变长度) |
. .
. .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
AH 头的所有字段均为 NOCHANGE,但 Authentication Data 是 RANDOM。
这意味着 AH 头在压缩后仍会保留 SPI 和序列号(均为 NOCHANGE 且在压缩头中发送),而 Authentication Data 作为 RANDOM 字段原样发送。
7.9 封装安全有效载荷头 (Encapsulating Security Payload, ESP)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Security Parameters Index (SPI) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number (序列号) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Payload Data (可变长度) |
. .
. Integrity Check Value (ICV) .
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
该头意味着后续分组部分是加密的。SPI 和序列号是 NOCHANGE(在压缩头中发送),但在 ESP 隧道模式下,整个 IP 分组被加密,因此压缩点必须能够区分 ESP 头与其后的加密数据。
这意味着必须能够将 IP 分组及其 ESP 头交给压缩器处理,而 ESP 之后的加密数据不予压缩。
SPI 之后的所有内容都是加密的,因此不予压缩。
7.10 扩展头的顺序 (Order of Extension Headers)
IPv6 扩展头必须按 [IPv6] 中规定的顺序出现。当压缩器遇到期望顺序之外的扩展头时,必须发送完整头。
7.11 UDP 头 (UDP Header)
UDP 头在 [RFC-768] 中描述。IPv6 中的 Next Header 字段或 IPv4 中的 Protocol 字段用于指示其后的协议是否为 UDP。
下面是 UDP 头字段的分类:
| Field | Size | DEF | Tmpl | C | Tmpl & C | Inferred | Notes |
|---|---|---|---|---|---|---|---|
| Source Port | 16 | Yes | Yes | No | No | No | 定义字段 |
| Destination Port | 16 | Yes | Yes | No | No | No | 定义字段 |
| Length | 16 | No | No | No | No | Yes | 从帧长度推断 |
| Checksum | 16 | No | No | Yes | No | No | 随机改变 |
UDP 头的 Length 字段必须与 IP 头和 UDP 头本身的 Length 字段相匹配,因此可以推断得出(INFERRED)。
UDP 头通常被压缩为 2 个字节,即 UDP 校验和(RANDOM)原样携带,其余字段被压缩掉。
7.12 TCP 头 (TCP Header)
TCP 头在 [RFC-793] 中描述。IPv6 中的 Next Header 字段或 IPv4 中的 Protocol 字段用于指示其后的协议是否为 TCP。
下面是 TCP 头字段的分类:
| Field | Size | DEF | Tmpl | C | Tmpl & C | Inferred | Notes |
|---|---|---|---|---|---|---|---|
| Source Port | 16 | Yes | Yes | No | No | No | 定义字段 |
| Destination Port | 16 | Yes | Yes | No | No | No | 定义字段 |
| Sequence Number | 32 | No | Yes | Yes | No | No | 差分编码 |
| Acknowledgment Number | 32 | No | Yes | Yes | No | No | 差分编码 |
| Data Offset | 4 | No | Yes | Yes | No | No | 选项改变时改变 |
| Reserved | 4 | No | Yes | No | No | No | 通常为零 |
| Flags | 8 | No | Yes | Yes | No | No | 可能改变 |
| Window | 16 | No | Yes | Yes | No | No | 按原样发送 |
| Checksum | 16 | No | No | Yes | No | No | 按原样发送 |
| Urgent Pointer | 16 | No | Yes | Yes | No | No | 很少使用 |
| Options | var | No | Yes | Yes | No | No | 很少改变 |
压缩 TCP 头有两种方式。其字段分类如下:
Source Port NOCHANGE (DEF)
Destination Port NOCHANGE (DEF)
Sequence Number DELTA
Acknowledgment Number DELTA
Offset NOCHANGE
Reserved DELTA (if differs from context,
otherwise NOCHANGE)
Urg, Psh RANDOM (placed in flag octet)
Ack INFERRED to be 1
Rst, Syn, Fin INFERRED to be 0
Window DELTA (if change in Window,
otherwise NOCHANGE)
Checksum RANDOM
Urgent Pointer DELTA (if Urg is set, send
otherwise NOCHANGE)
Options, Padding DELTA (if change in Options,
otherwise NOCHANGE)
这种方法本质上是 [RFC-1144] 中 Jacobson 所描述的差分编码技术,不同之处在于标志字节的放置位置以及如何处理 Window 等字段的变化。
7.13 IPv4 头 (IPv4 Header)
IPv4 头在 [RFC-791] 中描述。下面是 IPv4 头字段的分类:
| Field | Size | DEF | Tmpl | C | Tmpl & C | Inferred | Notes |
|---|---|---|---|---|---|---|---|
| Version | 4 | No | Yes | No | No | No | 常量 (4) |
| IHL | 4 | No | Yes | No | No | No | 常量 (通常为 5) |
| Type of Service | 8 | No | Yes | Yes | No | No | 可能改变 |
| Total Length | 16 | No | No | No | No | Yes | 从帧长度推断 |
| Identification | 16 | No | No | Yes | No | No | 随机改变 |
| Flags | 3 | No | Yes | Yes | No | No | 可能改变 |
| Fragment Offset | 13 | No | Yes | Yes | No | No | 分片时改变 |
| Time to Live | 8 | No | Yes | Yes | No | No | 可能改变 |
| Protocol | 8 | Yes | Yes | No | No | No | 定义字段 |
| Header Checksum | 16 | No | No | Yes | No | No | 每跳重新计算 |
| Source Address | 32 | Yes | Yes | No | No | No | 定义字段 |
| Destination Address | 32 | Yes | Yes | No | No | No | 定义字段 |
| Options | var | No | Yes | Yes | No | No | 很少使用 |
前一 IPv4 头中的 Identification 字段为 RANDOM。
当 IPv4 头后紧跟 TCP 头时,IPv4 和 TCP 头必须作为一个单元一起压缩(见第 6 节)。此时 Type of Service 字段的第 6、7 位(第一个字的第 14、15 位)可通过 R 标志传递(见第 6 a 节)。
压缩 IPv4 头有两种情形:
a) 如果 IPv4 头不是分片(MF 位未置位且 Fragment Offset 为 0),且没有选项(IHL = 5),则各字段分类如下:
Version NOCHANGE (DEF)
IHL NOCHANGE (DEF, must be 5)
Type of Service NOCHANGE (might be DEF, see sect 4.1)
(see also 6 a)
Total Length INFERRED (from link-layer implementation
or encapsulating IP header)
Identification DELTA/ (If the Protocol field has the
(value corresponding to TCP)
RANDOM (otherwise)
Flags NOCHANGE (MF flag must not be set)
Fragment Offset NOCHANGE (must be zero)
Time to Live NOCHANGE (might be DEF, see sect 4.1)
Protocol NOCHANGE
Header Checksum INFERRED (calculated from other fields)
Source Address NOCHANGE (DEF)
Destination Address NOCHANGE (DEF)
Options, Padding (not present)
注意:当其后紧跟 TCP 头时,IPv4 和 TCP 头必须按第 6 节所述作为一个单元压缩。此时 Type of Service 字段的第 6、7 位(第一个字的第 14、15 位)可通过 R 标志传递(见第 6 a 节)。
b) 如果 IPv4 头用于分片(MF 位置位或 Fragment Offset 非零),或者存在选项(IHL > 5),则所有字段均为 RANDOM(即,如果压缩该头,所有字段均原样发送,不进行压缩)。这种分类允许在分片被隧道传输时压缩隧道头,但不能压缩分片头。如果 IPv4 头用于分片,则它结束可压缩子头链,即它必须是被压缩的最后一个子头。如果 IPv4 头有选项但不是分片,则它不结束可压缩子头链,因此后续子头仍可被压缩。
遵循第 4.1 节可选准则的压缩器,在情形 a) 中会使用 Version、Source Address 和 Destination Address 来定义分组流,外加"没有 IPv4 选项且不是分片"这一事实。
情形 b) 可以根据 IPv4 头是否用于分片定义两类分组流。
如果情形 b) 中的 IPv4 头用于分片,遵循可选准则的压缩器将使用该事实,连同 Version、Source Address 和 Destination Address 来确定分组流。
如果情形 b) 中的 IPv4 头不是分片,则它必然带有选项。遵循可选准则的压缩器将使用该事实(但不使用选项的大小),连同 Version、Source Address 和 Destination Address 来确定分组流。
7.14 最小封装头 (Minimal Encapsulation Header)
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Protocol |S| reserved | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Original Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: (if present) Original Source Address :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Protocol NOCHANGE
Original Source Address Present (S) NOCHANGE
reserved NOCHANGE
Header Checksum INFERRED(由其他值计算)
Original Destination Address NOCHANGE
Original Source Address NOCHANGE(仅当 S=1 时存在)
该头很可能被移动 IP(Mobile IP)使用。