跳到主要内容

5.3. Tunnel Header Field Descriptions (隧道首部字段说明)

5.3. Tunnel Header Field Descriptions (隧道首部字段说明)

Inner Header (IH, 内层首部): 内层首部是源自源主机的数据报上的首部. 源与目的 IP 地址为 EID [RFC0791] [RFC2460].

Outer Header (OH, 外层首部): 外层首部是由 ITR 前置的新首部. 地址字段包含从入口路由器 EID-to-RLOC Cache 获得的 RLOC. IP 协议号为 [RFC0768] 中的 "UDP (17)". Don't Fragment (DF) 位在 Flags 字段中的设置遵循第 5.4.1 与 5.4.2 节所列规则.

UDP Header (UDP 首部): UDP 首部在封装分组时包含由 ITR 选择的源端口. 关于基于内层首部 5 元组选择源端口所用哈希算法的细节, 见第 6.5 节. 目的端口必须设置为 IANA 分配的知名端口值 4341.

UDP Checksum (UDP Checksum 字段): ITR 对 IPv4 [RFC0768] 或 IPv6 封装 [UDP-TUNNELS] [UDP-ZERO] 传输时, UDP Checksum 字段应该发送为零. 当 ETR 收到 UDP 校验和为零的分组时, ETR 必须接受该分组以进行解封装. 当 ITR 为 UDP 校验和传输非零值时, 必须在该字段发送正确计算的值. 当 ETR 收到 UDP 校验和非零的分组时, 可以选择验证校验和值. 若选择执行此类验证且验证失败, 必须静默丢弃该分组. 若 ETR 选择不执行验证, 或验证成功, 则必须接受该分组以进行解封装. 包括 LISP 在内的所有隧道协议的 UDP 校验和处理, 在 IETF 内仍在积极讨论. 当讨论结束, 将做出必要更改以使 LISP 与更广泛讨论的结果一致.

UDP Length (UDP Length 字段): 对 IPv4 封装分组, UDP Length 字段设置为内层 IPv4 Total Length 加上 UDP 与 LISP 首部长度之和. 对 IPv6 封装分组, UDP Length 字段为内层 IPv6 Payload Length, IPv6 首部大小 (40 八位组), 以及 UDP 与 LISP 首部大小之和.

N: N 位为 nonce-present 位. 当该位设为 1 时, LISP 首部前 32 位中的低序 24 位包含 Nonce. 细节见第 6.3.1 节. N 位与 V 位不得在同一分组中同时设置. 若同时设置, 解封装 ETR 必须将 Nonce/Map-Version 字段视为存在 Nonce 值.

L: L 位为 Locator-Status-Bits 字段启用位. 当该位设为 1 时, LISP 首部第二个 32 位中的 Locator-Status-Bits 处于使用状态.

x 1 x x 0 x x x

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|N|L|E|V|I|flags| Nonce/Map-Version |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Locator-Status-Bits |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

E: E 位为 echo-nonce-request 位. 当 N 位为 0 时, 必须忽略该位且无意义. 当 N 位为 1 且该位为 1 时, ITR 请求在 ITR 亦为 ETR 时, 将 Nonce 字段中的 nonce 值在 LISP 封装分组返回时回显. 细节见第 6.3.1 节.

V: V 位为 Map-Version present 位. 当该位设为 1 时, N 位必须为 0. 更多细节见第 6.6.3 节. 该位表示本例中 LISP 首部编码为:

0 x 0 1 x x x x

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|N|L|E|V|I|flags| Source Map-Version | Dest Map-Version |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Instance ID/Locator-Status-Bits |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

I: I 位为 Instance ID 位. 更多细节见第 5.5 节. 当该位设为 1 时, Locator-Status-Bits 字段缩减为 8 位, 高序 24 位用作 Instance ID. 若 L 位为 0, 则低序 8 位发送为零并在接收时忽略. LISP 首部格式如下:

x x x x 1 x x x

    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|N|L|E|V|I|flags| Nonce/Map-Version |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Instance ID | LSBs |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

flags: flags 字段为 3 位, 保留供将来标志使用. 发送时必须设为 0, 接收时必须忽略.

LISP Nonce: LISP Nonce 字段为 24 位值, 在 N 位设为 1 时由 ITR 随机生成. Nonce 生成算法是实现细节, 但要求向不同目的发送时生成不同 nonce. 然而, 对同一目的可在一段时期内使用相同 nonce. 当 E 位设为 1 时, nonce 还用于请求在分组返回时由对端回显 nonce 值. 当 E 位清除但 N 位设置时, 远端 ITR 要么回显先前请求的 echo-nonce, 要么提供随机 nonce. 更多细节见第 6.3.1 节.

LISP Locator-Status-Bits (LSB): 当 L 位亦设置时, LISP 首部中的 Locator-Status-Bits 字段由 ITR 设置, 向 ETR 指示源站点中 Locator 的 up/down 状态. Map-Reply 中每个 RLOC 被赋予从 0 到 n-1 的序数值 (映射项中有 n 个 RLOC). Locator-Status-Bits 从字段最低有效位起编号为 0 到 n-1. 当 I 位为 0 时字段为 32 位, 当 I 位为 1 时字段为 8 位. 当某 Locator-Status-Bit 设为 1 时, ITR 向 ETR 指示与该位序数关联的 RLOC 处于 up 状态. 关于 ITR 如何确定同站点 ETR 状态的细节见第 6.3 节. 当站点有多个 EID-Prefix 从而产生多个映射 (每个可有不同 Locator-Set) 时, 封装分组中的 Locator-Status-Bits 设置必须反映与内层首部源 EID 地址匹配的 EID-Prefix 的映射. 若任意播 Locator 的 LSB 设为 1, 则至少存在一个具有该地址的 RLOC, 且认为 ETR 为 up.

进行 ITR/PITR 封装时:

o 外层首部的 Time to Live 字段 (IPv6 情况下为 Hop Limit 字段) 应该从内层首部的 Time to Live 字段复制.

o 外层首部的 Type of Service 字段 (IPv6 情况下为 Traffic Class 字段) 应该从内层首部的 Type of Service 字段复制 (有一例外, 见下文).

进行 ETR/PETR 解封装时:

o 当外层首部的 Time to Live 值小于内层首部的 Time to Live 值时, 内层首部的 Time to Live 字段 (IPv6 情况下为 Hop Limit 字段) 应该从外层首部的 Time to Live 字段复制. 若不执行此检查, 可能导致内层首部 Time to Live 在封装/解封装循环中递增. 当分组到达 ITR 或 PITR 且目的为 LISP 站点时, 初始封装亦执行此检查.

o 内层首部的 Type of Service 字段 (IPv6 情况下为 Traffic Class 字段) 应该从外层首部的 Type of Service 字段复制 (有一例外, 见下文).

注意, 若 ETR/PETR 亦为 ITR/PITR 并选择在解封装后重新封装, 则净效果是新的外层首部将携带与旧外层首部相同的 Time to Live 减 1.

复制 Time to Live (TTL) 有两个目的: 首先, 保留主机意图让分组传输的距离, 其次, 更重要的是, 在因错误配置而存在串联隧道环路时抑制循环分组. 关于 traceroute 分组的 TTL 例外处理见第 9.3 节.

Explicit Congestion Notification (ECN) 字段占用 IPv4 Type of Service 字段与 IPv6 Traffic Class 字段的第 6 与第 7 位 [RFC3168]. 为避免丢弃拥塞指示, ECN 字段需要特殊处理 [RFC3168]. ITR 封装必须将 2 位 ECN 字段从内层首部复制到外层首部. 重新封装必须将 2 位 ECN 字段从剥离的外层首部复制到新的外层首部. 若 ECN 字段包含拥塞指示码点 (值为 11, 即 Congestion Experienced (CE) 码点), 则 ETR 解封装必须将 2 位 ECN 字段从剥离的外层首部复制到用于在 ETR 之外转发所用的幸存内层首部. 这些要求在采用 ECN 的分组穿越 LISP 隧道并因隧道端点间拥塞而被标记 CE 指示时保留 CE 指示.