了解 GENEVE 格式

通用网络虚拟化封装 (GENEVE) 是一种网络 封装协议,可使用额外的 元数据封装原始数据包。借助此类额外的元数据,可以实现灵活且可扩展的网络虚拟化。

下图展示了 GENEVE 数据包的标头格式。

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |Ver|  Opt len  |O|C|   Rsvd.   |         Protocol type         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |        Virtual network identifier (VNI)       |     Rsvd.     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图中显示的 GENEVE 标头字段:

字段 说明 字段长度
Ver GENEVE 协议的版本。唯一受支持的版本是零 (0)。 如需了解详情,请参阅隧道标头字段 2 位
Opt len 选项字段的长度,以 4 字节的倍数表示,不包括 8 字节的固定隧道标头。 如需了解详情,请参阅 隧道标头字段 6 位
O 控制数据包位。如需了解详情,请参阅隧道标头字段 1 位
C 关键选项位。如需了解详情, 请参阅隧道标头字段 1 位
Rsvd 预留字段,传输时必须为零 (0),接收时必须忽略如需了解详情,请参阅 隧道标头字段 6 位
协议类型 协议类型允许使用任何以太网类型,但 Network Security Integration 仅允许使用 IPv4 (0x0800) 或 IPv6 (0x86DD)。 16 位
虚拟网络标识符 (VNI) 虚拟网络元素的唯一标识符。 Network Security Integration 不会填充此字段,这意味着 VNI 设置为零 (0)。如需了解详情, 请参阅带外集成 GENEVE 24 位
Rsvd 预留字段,传输时必须为零 (0),接收时必须忽略如需了解详情,请参阅 隧道标头字段 8 位

Google Cloud特有的 GENEVE 选项

GENEVE 标头使用 类型-长度-值 (TLV) 格式作为其选项。这意味着每个选项都使用类型标识符、指示值大小的长度字段以及值本身进行编码。这种格式具有灵活性和可扩展性,因为可以添加新选项,而不会中断现有实现。 以下部分介绍了选项的顺序和数量。请注意,随着产品的不断发展,选项的数量和顺序也会发生变化。因此,为了确保设备实现的前向兼容性,请根据 TLV 字段解析 GENEVE 标头。

特有的 GENEVE 选项如下: Google Cloud

  • 网络 ID(网络 Cookie)
  • 端点 ID(端点 Cookie)
  • 个人资料 ID

网络 ID

网络 ID 选项(也称为“网络 Cookie”)用于标识中与 GENEVE 封装流量关联的虚拟 网络。 Google Cloud 此选项由选项类 0x0132 (Google) 和类型 1(网络 ID)标识。 选项数据包含 32 位,其中前 28 位表示不透明的网络 ID。其余 4 位的用途如下图和表中所述。

下图展示了 GENEVE 数据包中的选项格式。

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |    Type=01    |R|R|R|  Len=1  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Network cookie                    |R|R|T|D|
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图中显示的选项字段:

字段 说明 字段长度
选项类 标识定义了该选项的组织或实体。 值 0x0132 将 Google 指定为定义实体。 16 位
类型 标识类中的选项类型。值 0x1 指定网络 ID 选项。 如需了解详情, 请参阅隧道选项 8 位
R 为将来使用而预留的选项控制标志。这些位在传输时必须为 零 (0),接收时必须忽略。 3 位
Len 选项的载荷长度,以 4 字节为增量。网络 ID 载荷为 32 位(4 字节),因此此 选项的长度设置为 1。 5 位
网络 Cookie 不透明的网络 Cookie,用于标识虚拟网络。 28 位
R 预留以供将来实现。传输时必须设置为零 (0) ,接收时必须忽略。 2 位
T 表示封装的数据包的 TLS 卸载。未使用。 1 位
D 表示原始数据包的方向。零 (0) 表示原始镜像虚拟机 (VM) 上的入站数据包,一 (1) 表示出站数据包。 1 位

端点 ID

端点 ID 选项(也称为“端点 Cookie”)用于唯一标识 捕获点,该捕获点是虚拟机上的 Google Cloud 网络接口控制器。此选项由选项类 0x0132 (Google) 和类型 2(端点 ID)标识。选项数据是一个 128 位的不透明值。

下图展示了 GENEVE 数据包中的选项格式。

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |     Type=02   |R|R|R|  Len=4  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                                                               +
      |                                                               |
      +                        Endpoint cookie                        +
      |                                                               |
      +                                                               +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图中显示的选项字段:

字段 说明 字段长度
选项类 标识定义了该选项的组织或实体。 值 0x0132 将 Google 指定为定义实体。 16 位
类型 标识类中的选项类型。值 0x2 指定端点 ID 选项。 如需了解详情, 请参阅隧道选项 8 位
R 为将来使用而预留的选项控制标志。这些位在传输时必须为 零 (0),接收时必须忽略。 3 位
Len 载荷长度,以 4 字节为增量。端点 ID 载荷为 128 位(16 字节),因此此选项的长度设置为 4。 5 位
端点 Cookie 捕获点(虚拟机 NIC)的不透明标识符。 128 位

个人资料 ID

个人资料 ID 选项用于标识应用于流量的镜像 安全配置文件组 。此选项由 选项类 0x0132 (Google) 和类型 3(个人资料 ID)标识。选项数据是一个 64 位标识符,对应于安全配置文件组中的 data_path_id 字段。目标设备可能会根据配置文件组标识符强制执行安全政策。

下图展示了 GENEVE 数据包中的选项格式。

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |    Type=03    |R|R|R|  Len=2  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                           Profile ID                          +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图中显示的选项字段:

字段 说明 字段长度
选项类 标识定义了该选项的组织或实体。 值 0x0132 将 Google 指定为定义实体。 16 位
类型 标识类中的选项类型。值 0x3 指定个人资料 ID 选项。 如需了解详情, 请参阅隧道选项 8 位
R 为将来使用而预留的选项控制标志。这些位在传输时必须为 零,接收时必须忽略。 3 位
Len 选项的载荷长度,以 4 字节为增量。个人资料 ID 载荷为 64 位(8 字节),因此此选项的长度设置为 2。 5 位
个人资料 ID 镜像安全配置文件组的标识符。 64 位

Network Security Integration 的 GENEVE 标头格式

本部分介绍了 Network Security Integration 服务使用的 GENEVE 标头格式。

IPv4 标头

GENEVE 数据包格式在基于 IPv4 的 UDP 中封装了一个紧凑的隧道标头。小型固定隧道标头提供控制信息以及基本功能和互操作性。

下图展示了 GENEVE 数据包的 IPv4 标头字段。

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |Version|  IHL  |Type of service|          Total length         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |         Identification        |Flags|     Fragment offset     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Time to live | Proto=17 (UDP)|        Header checksum        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                         Source address                        |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                      Destination address                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图中显示的 IPv4 标头字段:

字段 说明
Proto=17(对于 GENEVE,始终为 UDP) 表示封装的载荷使用 UDP 协议。
源地址 本地子网的网关 IP 地址。
目标地址 客户拥有的负载均衡器的 VIP。

UDP 标头

UDP RFC 0768 标头 封装了数据,同时保留了以太网和 IP 地址的无连接 语义。它还为执行等价多路径 (ECMP) 的路由器提供熵。

下图展示了封装在 UDP 中的 Geneve 数据包的标头格式。

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |      Source port = <hash>     |   Dest port = 6081 (Geneve)   |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |           UDP length          |          UDP checksum         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了上图中显示的 UDP 标头字段:

字段 说明
来源端口 整个 16 位范围内的不透明哈希。对于属于单个封装流(双向)的所有数据包,该值均相同。
目标端口 为 GENEVE 流量指定的目标端口号,设置为 6081。
UDP 长度 UDP 数据报的总长度,包括 UDP 标头和 封装的 GENEVE 数据包。
UDP 校验和 UDP 数据报的校验和值,用于错误检测。

带外集成 GENEVE

本部分介绍了 Network Security Integration 服务(尤其是带外集成)使用的 GENEVE 标头格式。 带外集成使用 GENEVE 隧道封装和传送镜像数据包。这些数据包的目标地址是收集器的内部负载均衡器 虚拟 IP 地址 (VIP),并使用 Google Cloud-特有的 元数据(例如网络 Cookie)进行注解。

带外集成中使用的 Google Cloud特有的 GENEVE 选项包括 网络 Cookie、端点 Cookie 和个人资料 ID。如需了解详情,请参阅 Google Cloud特有的 GENEVE 选项

下图展示了带外集成中如何使用特有的 GENEVE 选项。 Google Cloud

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |V=0|  Opt len  |O|C|   Rsvd    |         Protocol type         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |        Virtual network identifier (VNI) = 0   |     Rsvd.     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |    Type=01    |R|R|R|  Len=1  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Network cookie                    |R|R|T|D|
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |    Type=02    |R|R|R|  Len=4  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                                                               +
      |                                                               |
      +                        Endpoint cookie                        +
      |                                                               |
      +                                                               +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option class=0x0132 (Google) |    Type=03    |R|R|R|  Len=2  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                           Profile ID                          +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

带内集成 GENEVE

带内集成使用 GENEVE 隧道封装和传送拦截的数据包。生产者的内部负载均衡器虚拟 IP 地址 (VIP) 接收使用 Google Cloud-特有的元数据(例如 网络 Cookie)进行注解的数据包。

带内集成使用以下 Google Cloud特有的 GENEVE 选项: 网络 Cookie、端点 Cookie 和个人资料 ID。如需了解详情,请参阅 Google Cloud特有的 GENEVE 选项

带内集成支持使用逻辑双向 GENEVE 隧道(由两个单向 GENEVE 隧道组成)将数据包重新注入到原始端点。生产者网络设备拦截并检查数据包后,可以选择丢弃或重新注入数据包。如需重新注入数据包,设备会执行以下操作:

  • 使用原始 GENEVE 标头(相同的选项)重新封装数据包。
  • 交换外部 IP 标头中的源地址和目标地址。
  • 确保校验和正确无误。

下图展示了带内集成中如何使用特有的 GENEVE 选项。 Google Cloud

       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
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |V=0|  Opt len  |O|C|   Rsvd    |         Protocol type         |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |        Virtual network identifier (VNI) = 0   |     Rsvd.     |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option Class=0x0132 (Google) |    Type=01    |R|R|R|  Len=1  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                     Network Cookie                    |R|R|T|D|
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option Class=0x0132 (Google) |    Type=02    |R|R|R|  Len=4  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                                                               +
      |                                                               |
      +                        Endpoint Cookie                        +
      |                                                               |
      +                                                               +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option Class=0x0132 (Google) |    Type=03    |R|R|R|  Len=2  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                           Profile ID                          +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

GENEVE 封装和 MTU 要求

最大传输单元 (MTU) 是指以太网帧内可容纳的包括 IP 报头、第 4 层协议报头和第 4 层数据在内的最大 IP 数据包的大小(以字节为单位)。如需了解详情, 请参阅最大传输单元

在 Google Cloud 网络中,允许的 MTU 为 8896 字节。但是,对于 Network Security Integration,需要为 GENEVE 封装开销保留 308 字节。此保留需求对使用者网络和生产者网络都有影响:

  • 使用者网络 MTU:使用者网络的 MTU 不得超过 8588 字节。此限制可确保有足够的空间用于 GENEVE 开销,而不会超出最大 MTU。

  • 生产者网络 MTU:生产者网络的 MTU 必须比使用者网络的 MTU 多至少 308 字节。此允许量可容纳额外的 GENEVE 封装。

如果没有足够的 MTU 限制来容纳 GENEVE 封装,则可能会丢弃数据包。这种情况可能会发生在虚拟网络级别或虚拟机的操作系统中。

后续步骤