跳到主要内容

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]. 如果校验和为零, 接收方必须接受.