了解 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 位
协议类型 协议类型允许使用以太网类型:IPv4 (0x0800) 或 IPv6 (0x86DD)。 16 位
虚拟网络标识符 (VNI) 虚拟网络元素的唯一标识符。 VNI 设置为零 (0)。如需了解详情, 请参阅 GENEVE 选项。 24 位
Rsvd 预留字段,传输时必须为零 (0),接收时必须忽略 接收时。如需了解详情,请参阅 隧道标头字段。 8 位

ULL VPC 网络中数据包镜像的 GENEVE 选项

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

特定于 ULL 数据包镜像的 GENEVE 选项如下:

  • 网络 ID(网络 Cookie)
  • 时间戳
  • 网络稳定 ID
  • 主要 IP 地址

网络 ID

网络 ID 选项(也称为“网络 Cookie”)用于标识与 ULL 数据包镜像中 GENEVE 封装的流量关联的虚拟网络。此选项由选项类 0x0132 (Google) 和类型 0x1(网络 ID)标识。

对于 ULL 数据包镜像,网络 Cookie 设置为零 (0)。选项数据包含 32 位;前 31 位是预留位,最后一位表示原始数据包的方向。

ULL 数据包镜像使用修改后的网络 ID 选项。在此版本中,除了方向位和预留位之外的所有位都设置为 0。如需详细了解捕获点,请参阅网络稳定 ID。

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

       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  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                            Reserved                         |D|
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

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

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

时间戳

时间戳选项表示捕获点(捕获或镜像数据包的 Compute Engine 实例)的原始数据包捕获时间。 此选项由选项类 0x0132 (Google) 和类型 0x0f(时间戳)标识。

下图展示了 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=0x0f   |R|R|R|  Len=2  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                           Timestamp                           +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

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

字段 说明 字段长度
选项类 标识定义了该选项的组织或实体。 值 0x0132 将 Google 指定为定义实体。 16 位
类型 标识类中的选项类型。值 0x0f指定时间戳选项。 如需了解详情, 请参阅隧道选项。 8 位
R 为将来使用而预留的选项控制标志。这些位在传输时必须为 零 (0),接收时必须忽略。 3 位
Len 选项的载荷长度,以 4 字节为增量。时间戳载荷为 64 位(8 字节),因此此选项的长度设置为 2。 5 位
时间戳 原始数据包的捕获时间,以自纪元以来的纳秒数表示。纳秒级粒度并不能保证纳秒级准确性。 64 位

网络稳定 ID

网络稳定 ID 选项用于标识镜像实例的网络。此选项由选项类 0x0132 (Google) 和类型 0x10(网络稳定 ID)标识。

下图展示了 GENEVE 数据包中的选项格式。网络稳定 ID 包含项目编号和网络 ID。

       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=0x10   |R|R|R|  Len=4  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                       Project Number                          +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                         Network ID                            +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

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

字段 说明 字段长度
选项类 标识定义了该选项的组织或实体。 值 0x0132 将 Google 指定为定义实体。 16 位
类型 标识类中的选项类型。值 0x10 指定网络稳定 ID 选项。 如需了解详情, 请参阅隧道选项。 8 位
R 为将来使用而预留的选项控制标志。这些位在传输时必须为 零 (0),接收时必须忽略。 3 位
Len 选项的载荷长度,以 4 字节为增量。网络 ID 载荷为 64 位(8 字节),因此此选项的长度设置为 4。 5 位
项目编号 项目的 Google Cloud 项目编号。 64 位
网络 ID ULL VPC 网络的 ID。 64 位

主要 IP 地址

主要 IP 地址选项用于标识捕获点(捕获或镜像数据包的 Compute Engine 实例)的 IP 地址。此选项由选项类 0x0132 (Google) 和类型 0x11(主要 IP 地址)标识。

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

       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=0x11   |R|R|R|  Len=1  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                       Primary IP Address                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

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

字段 说明 字段长度
选项类 标识定义了该选项的组织或实体。 值 0x0132 将 Google 指定为定义实体。 16 位
类型 标识类中的选项类型。值 0x11指定主要 IP 地址选项。 8 位
R 为将来使用而预留的选项控制标志。这些位在传输时必须为 零 (0),接收时必须忽略。 3 位
Len 选项的载荷长度,以 4 字节为增量。IP 地址载荷为 32 位(4 字节),因此此选项的长度设置为 1。 5 位
主要 IP 地址 捕获点(捕获或镜像数据包的 Compute Engine 实例 NIC)的主要 IP 地址。 32 位

GENEVE 标头格式

本部分介绍了数据包镜像用于 ULL VPC 网络的 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                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

下表介绍了 Google Cloud特定于 IPv4 的标头字段 上图所示。如需了解有关常见 IPv4 标头字段的信息, 请参阅 RFC 8926。

字段 说明
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 选项

Google Cloud特定于 GENEVE 的选项用于数据包镜像,适用于 ULL VPC 网络,包括网络 Cookie、时间戳、 网络稳定 ID、主要 IP 地址和公平订单处理时间戳。如需了解详情,请参阅 ULL VPC 网络中数据包镜像的 GENEVE 选项。

下图展示了 Google Cloud数据包镜像用于 ULL VPC 网络的特定于 GENEVE 的选项的 使用方式。

       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                     |D|
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option Class=0x0132 (Google) |   Type=0x0f   |R|R|R|  Len=2  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                           Timestamp                           +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option Class=0x0132 (Google) |    Type=0x10   |R|R|R|  Len=4  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                         Project Number                        +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                           Network ID                          +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option Class=0x0132 (Google) |   Type=0x11   |R|R|R|  Len=1  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                       Primary IP Address                      |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |  Option Class=0x0132 (Google) |   Type=0x13   |R|R|R|  Len=2  |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
      |                                                               |
      +                Fair order processing timestamp                +
      |                                                               |
      +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   

上图中的 Opt len 表示选项字段的长度,以 4 字节的倍数表示。此长度不包括 8 字节的固定隧道标头。如需了解详情,请参阅隧道标头 字段。

GENEVE 封装和 MTU 要求

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

ULL VPC 网络的最大 MTU 为 1500 字节。不过,ULL 数据包镜像需要 308 字节的 GENEVE 封装开销。为确保镜像的流量能够无分片地到达收集器实例,收集器所在的网络的 MTU 必须至少为 1808 字节(标准流量为 1500 字节,GENEVE 封装开销为 308 字节)。

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