了解 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 标头使用 Type-Length-Value (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 实例的主 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 选项

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

下图展示了如何在 ULL VPC 网络的数据包镜像中使用 Google Cloud专用 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 封装,则可能会丢弃数据包。这种情况可能发生在虚拟网络级别或操作系统中。