跳到主要内容

4. Geneve 帧格式 (Geneve Frame Format)

4. Geneve 帧格式 (Geneve Frame Format)

Geneve 使用 UDP 协议 [RFC768] 作为传输. Geneve 数据包被封装在 UDP 数据包中, 而 UDP 数据包又被封装在 IP 数据包 (IPv4 或 IPv6) 中.

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
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Outer Ethernet Header (Optional) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Outer IP Header (IPv4 or IPv6) |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Outer UDP Header |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Ver | Opt Len |O|C| Rsvd. | Protocol Type |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Virtual Network Identifier (VNI) | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
~ Variable Length Options ~
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| Inner Packet (Ethernet Frame, IP Packet, etc.) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

4.1. 标准 UDP 头部 (Standard UDP Header)

Geneve 运行在 UDP 之上. UDP 头部字段设置如下:

  • Source Port (源端口): 由实现定义. 推荐 (RECOMMENDED) 使用内部数据包头部 (例如 5 元组) 的哈希来计算源端口, 以便为底层网络中的 ECMP 提供熵.
  • Destination Port (目标端口): IANA 为 Geneve 分配的端口是 6081.
  • Length (长度): UDP 数据包的长度, 包括 UDP 头部和 Geneve 负载.
  • Checksum (校验和): UDP 校验和. 可以 (MAY) 设置为零, 参见第 4.6 节.

4.2. 隧道头部字段 (Tunnel Header Fields)

Geneve 头部长度为 8 bytes, 另加可变长度选项.

  • Ver (2 bits): 版本. 当前版本为 0.
  • Opt Len (6 bits): 选项长度. 选项字段长度, 以 4-byte 倍数表示. 如果没有选项, 此字段为 0. 最大长度为 63 * 4 = 252 bytes.
  • O (1 bit): 控制数据包. 如果置位, 数据包包含控制消息, 参见第 4.5 节. 如果清零, 数据包包含数据.
  • C (1 bit): 存在关键选项. 如果置位, 选项列表中至少存在一个设置了 Critical bit 的选项, 参见第 4.4 节.
  • Rsvd. (6 bits): 保留字段. 发送时必须为零, 接收时忽略.
  • Protocol Type (16 bits): 内部协议的类型. 对于 Ethernet 帧, 该值为 0x6558 (Ethernet Bridging). 该字段使用 EtherType 值.
  • VNI (24 bits): 虚拟网络标识符 (Virtual Network Identifier). 用于标识唯一的虚拟网络.
  • Reserved (8 bits): 发送时必须为零, 接收时忽略.

4.3. 隧道选项 (Tunnel Options)

可变长度选项紧随基础头部之后. 每个选项都是一个 TLV (Type-Length-Value) 字段.

   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 | Type |R|R|R| Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
~ Variable Option Data ~
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Option Class (16 bits): Option Type 的命名空间. 允许不同组织独立定义选项. IANA 注册表管理 Option Class.
  • Type (8 bits): 给定 Option Class 内的选项类型. 最高有效位 (bit 0) 是 "Critical" bit.
  • R (3 bits): 保留字段. 发送时必须为零, 接收时忽略.
  • Length (5 bits): 选项数据长度, 以 4-byte 倍数表示. 不包括 4-byte 选项头部. 长度 0 表示只有 4 bytes 头部且没有数据.
  • Variable Option Data (可变选项数据): 选项的内容.

4.3.1. 类型 (Type)

Type 字段指示选项中所含数据的格式. 高位 bit (0x80) 是 "Critical" bit.

  • Critical Bit (Type & 0x80): 如果置位, 该选项为关键选项. 接收方必须处理该选项, 如果无法识别则丢弃数据包. 如果清零, 该选项为非关键选项, 接收方在无法识别时可以忽略.

4.4. 选项约束 (Constraints on Options)

Geneve 选项被设计为灵活机制, 但仍适用若干约束:

  • Total Length (总长度): 选项总长度受基础头部中的 Opt Len 字段限制, 最大为 252 bytes.
  • Processing (处理): 端点必须按照选项在数据包中出现的顺序处理选项.

4.4.1. 选项处理顺序 (Option Processing Order)

选项必须按照其在数据包中出现的顺序处理. 对于可能修改后续选项处理方式的选项, 这一点很重要.

4.5. 控制消息 (Control Messages)

如果基础头部中的 'O' bit 被置位, 该数据包就是控制消息. 控制消息用于 OAM 和信令. 控制消息的负载由 Protocol Type 字段决定.

4.5.1. 环回 (Loopback)

控制消息的一种用途是用于测试连通性的环回.

4.5.2. Ping

Ping 消息可用于验证路径连续性.

4.6. UDP 校验和 (UDP Checksum)

外层 UDP 校验和覆盖外层 IP 伪头部, UDP 头部, Geneve 头部和负载. 它为封装数据包提供完整性保护.

IPv4: UDP 校验和可以为零. IPv6: UDP 校验和不应为零, 但隧道存在某些例外, 参见 [RFC6935] 和 [RFC768]. 如果校验和为零, 接收方必须接受.