标识符定位器寻址(ILA)

简介

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

ILA可以被认为是实现无需封装的覆盖网络的一种手段。这是通过在数据包遍历网络时对目标地址执行网络地址转换来实现的。对于网络而言,经过ILA转换的数据包看起来与任何其他IPv6数据包没有什么不同。例如,如果传输协议是TCP,则经过ILA转换的数据包看起来就像另一个TCP/IPv6数据包。这样做的好处是,ILA对网络是透明的,因此网络中的优化(例如ECMP、RSS、GRO、GSO等)可以正常工作。

ILA协议在Internet-Draft draft-herbert-intarea-ila中进行了描述。

ILA术语

  • 标识符

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

  • 定位器

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

  • ILA映射

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

  • SIR地址

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

  • ILA地址

    由定位器(高64位)和标识符(低64位)组成的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转换地址时,伪头中包含已转换地址的封装传输校验和可能在网络上呈现不正确。这对于处理校验和的中间设备(包括NIC中的校验和卸载)来说是一个问题。有三种选择来处理这个问题

  • 无操作 允许校验和在网络上不正确。之前

    接收器验证校验和时,必须完成ILA到SIR地址的转换。

  • 调整传输校验和

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

  • 校验和中性映射

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

请注意,校验和中性调整会影响标识符的低16位。当在出口处完成ILA到SIR地址转换时,低位将恢复为原始值,从而恢复最初发送的标识符。

标识符类型

ILA为不同的用例定义了不同的标识符类型。

定义的类型是

0:接口标识符

1:本地唯一标识符

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

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

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

5:非本地地址标识符

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

标识符格式

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

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

如果C位存在,则将其用作已完成校验和中性映射的指示。C位只能在ILA地址中设置,而不能在SIR地址中设置。

在最简单的格式中,标识符类型、C位和校验和调整值不存在,因此标识符被认为是无结构的64位值

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

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

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

C位可用于显式指示已将校验和中性映射应用于ILA地址。格式为

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

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

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

如果标识符类型和C位可以同时存在,那么标识符格式将是

+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 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是覆盖目标地址高64位的64位定位器(格式为W:X:Y:Z)。校验和MODE是“no-action”、“adj-transport”、“neutral-map”和“neutral-map-auto”之一。如果设置了neutral-map,则C位将存在。标识符类型TYPE为“luid”或“use-format”之一。在use-format的情况下,标识符类型字段存在,并且有效类型取自该字段。

ila_xlat的用法是

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

MATCH指示必须匹配以应用转换的传入定位器。LOC是覆盖目标地址高64位的定位器。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