了解 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 封装,则可能会丢弃数据包。这种情况可能会在虚拟网络级别或操作系统中发生。