标识符定位器寻址 (ILA)

引言

标识符定位器寻址 (ILA) 是一种用于 IPv6 的技术,它区分网络节点的位置和身份。地址的一部分表示节点不可变的身份,另一部分表示节点可动态变化的位置。标识符定位器寻址可用于高效实现网络虚拟化中的叠加网络以及移动性用例的解决方案。

ILA 可以被认为是无需封装即可实现叠加网络的一种方式。这是通过在数据包遍历网络时对目的地址执行网络地址转换来实现的。对网络而言,经过 ILA 转换的数据包与任何其他 IPv6 数据包无异。例如,如果传输协议是 TCP,则经过 ILA 转换的数据包看起来就像另一个 TCP/IPv6 数据包。这样做的优点是 ILA 对网络是透明的,因此网络中的优化,如 ECMP、RSS、GRO、GSO 等,都可以正常工作。

ILA 协议在 Internet-Draft draft-herbert-intarea-ila 中有描述。

ILA 术语

  • 标识符

    一个数字,用于标识网络中可寻址节点,与其位置无关。ILA 标识符是六十四位的值。

  • 定位器

    路由到物理主机的网络前缀。定位器提供被寻址节点的拓扑位置。ILA 定位器是六十四位的前缀。

  • ILA 映射

    ILA 标识符到定位器(或到定位器和元数据)的映射。ILA 域维护一个数据库,其中包含域中所有目的地的映射。

  • SIR 地址

    由 SIR 前缀(高六十四位)和标识符(低六十四位)组成的 IPv6 地址。SIR 地址对应用程序可见,并为它们提供了一种独立于位置寻址节点的方式。

  • ILA 地址

    由定位器(高六十四位)和标识符(低六十四位)组成的 IPv6 地址。ILA 地址永远不会对应用程序可见。

  • ILA 主机

    能够进行发送或接收端 ILA 转换的终端主机。

  • ILA 路由器

    执行 ILA 转换并转发转换后数据包的网络节点。

  • ILA 转发缓存

    一种 ILA 路由器,仅维护映射的工作集缓存。

  • ILA 节点

    能够执行 ILA 转换的网络节点。可以是 ILA 路由器、ILA 转发缓存或 ILA 主机。

操作

ILA 有两个基本操作

  • 将 SIR 地址转换为 ILA 地址。这在进入 ILA 叠加层时执行。

  • 将 ILA 地址转换为 SIR 地址。这在从 ILA 叠加层出站时执行。

ILA 既可以部署在终端主机上,也可以部署在网络中的中间设备上;分别由“ILA 主机”和“ILA 路由器”提供。这两种部署点的配置和数据路径有所不同。

下图说明了数据包通过 ILA 的流程,并展示了 ILA 主机和路由器。

 +--------+                                                +--------+
 | Host A +-+                                         +--->| Host B |
 |        | |              (2) ILA                   (')   |        |
 +--------+ |            ...addressed....           (   )  +--------+
            V  +---+--+  .  packet      .  +---+--+  (_)
(1) SIR     |  | ILA  |----->-------->---->| ILA  |   |   (3) SIR
 addressed  +->|router|  .              .  |router|->-+    addressed
 packet        +---+--+  .     IPv6     .  +---+--+        packet
                /        .    Network   .
               /         .              .   +--+-++--------+
 +--------+   /          .              .   |ILA ||  Host  |
 |  Host  +--+           .              .- -|host||        |
 |        |              .              .   +--+-++--------+
 +--------+              ................

传输校验和处理

当地址被 ILA 转换时,伪首部中包含转换后地址的封装传输校验和在传输过程中可能会变得不正确。这对于处理校验和的中间设备(包括网卡中的校验和卸载)来说是个问题。有三种处理方法:

  • 不采取任何措施 允许校验和在传输过程中不正确。在接收方验证校验和之前,

    必须完成 ILA 到 SIR 地址的转换。

  • 调整传输校验和

    执行 ILA 转换时,会解析数据包,如果发现传输层校验和,则会根据转换后的地址进行调整,以反映正确的校验和。

  • 校验和中性映射

    当地址被转换时,其差异可以通过数据包中被校验和覆盖的其他部分进行抵消。使用标识符的低十六位。此方法是首选,因为它不需要解析 IP 头之外的数据包,并且在大多数情况下,调整可以预先计算并随映射保存。

请注意,校验和中性调整会影响标识符的低十六位。当在出口处进行 ILA 到 SIR 地址转换时,低位会恢复到原始值,从而恢复标识符的原始发送状态。

标识符类型

ILA 定义了用于不同用例的各种标识符类型。

定义的类型有

0: 接口标识符

1: 本地唯一标识符

2: IPv4 地址的虚拟网络标识符

3: IPv6 单播地址的虚拟网络标识符

4: IPv6 组播地址的虚拟网络标识符

5: 非本地地址标识符

在当前内核 ILA 实现中,只支持本地唯一标识符 (LUID)。LUID 允许使用通用、无格式的 64 位标识符。

标识符格式

内核 ILA 支持标识符中两个可选的格式化字段:“C-bit”和“标识符类型”。这些字段的存在由配置决定,如下所示。

如果标识符类型存在,它占据标识符的三个最高位。可能的值在上表中给出。

如果 C-bit 存在,它用于指示已完成校验和中性映射。C-bit 只能在 ILA 地址中设置,不能在 SIR 地址中设置。

在最简单的格式中,标识符类型、C-bit 和校验和调整值都不存在,因此标识符被视为一个无结构的六十四位值。

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Identifier                         |
+                                                               +
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

可以使用 neutral-map-auto 配置校验和中性调整始终存在。在这种情况下,没有 C-bit,但校验和调整位于低 16 位。标识符仍为六十四位。

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                            Identifier                         |
|                               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |  Checksum-neutral adjustment  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

C-bit 可用于明确指示已对 ILA 地址应用校验和中性映射。格式为:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     |C|                    Identifier                         |
|     +-+                       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |  Checksum-neutral adjustment  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

标识符类型字段可以存在以指示标识符类型。如果不存在,则根据映射配置推断类型。校验和中性调整可以自动与标识符类型一起使用,如下图所示:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type|                      Identifier                         |
+-+-+-+                         +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |  Checksum-neutral adjustment  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

如果标识符类型和 C-bit 可以同时存在,则标识符格式将是:

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type|C|                    Identifier                         |
+-+-+-+-+                       +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                               |  Checksum-neutral adjustment  |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

配置

配置 ILA 映射有两种方法。一种是使用 LWT 路由,另一种是 ila_xlat(从 NFHOOK PREROUTING 钩子调用)。ila_xlat 旨在用于 ILA 主机的接收路径。

ILA 路由器也已在 XDP 中实现。其描述超出了本文档的范围。

ILA LWT 路由的用法是:

ip route add DEST/128 encap ila LOC csum-mode MODE ident-type TYPE via ADDR

目的地 (DEST) 可以是 SIR 地址(用于 ILA 主机或入口 ILA 路由器)或 ILA 地址(出口 ILA 路由器)。LOC 是六十四位定位器(格式为 W:X:Y:Z),它覆盖目的地地址的高六十四位。校验和模式 (Checksum MODE) 是“no-action”、“adj-transport”、“neutral-map”和“neutral-map-auto”之一。如果设置了 neutral-map,则 C-bit 将存在。标识符类型 (Identifier TYPE) 是“luid”或“use-format”之一。在 use-format 的情况下,标识符类型字段存在,并且有效类型从中获取。

ila_xlat 的用法是:

ip ila add loc_match MATCH loc LOC csum-mode MODE ident-type TYPE

MATCH 指示必须匹配的传入定位器才能应用转换。LOC 是覆盖目的地址高六十四位的定位器。MODE 和 TYPE 的含义与上述相同。

一些示例

# Configure an ILA route that uses checksum neutral mapping as well
# as type field. Note that the type field is set in the SIR address
# (the 2000 implies type is 1 which is LUID).
ip route add 3333:0:0:1:2000:0:1:87/128 encap ila 2001:0:87:0 \
     csum-mode neutral-map ident-type use-format

# Configure an ILA LWT route that uses auto checksum neutral mapping
# (no C-bit) and configure identifier type to be LUID so that the
# identifier type field will not be present.
ip route add 3333:0:0:1:2000:0:2:87/128 encap ila 2001:0:87:1 \
     csum-mode neutral-map-auto ident-type luid

ila_xlat configuration

# Configure an ILA to SIR mapping that matches a locator and overwrites
# it with a SIR address (3333:0:0:1 in this example). The C-bit and
# identifier field are used.
ip ila add loc_match 2001:0:119:0 loc 3333:0:0:1 \
    csum-mode neutral-map-auto ident-type use-format

# Configure an ILA to SIR mapping where checksum neutral is automatically
# set without the C-bit and the identifier type is configured to be LUID
# so that the identifier type field is not present.
ip ila add loc_match 2001:0:119:0 loc 3333:0:0:1 \
    csum-mode neutral-map-auto ident-type use-format