VXLAN通过在以太网帧外添加UDP封装和VXLAN头部,实现了网络的可扩展性和灵活性,支持多租户环境下的大规模二层网络扩展。本文将详细介绍VXLAN的报文格式、各个字段的具体含义。
VXLAN基于MAC-in-UDP的封装机制,即将原始以太网帧封装在UDP报文中,并通过IP网络进行传输。VXLAN报文的发送和接收由VTEP(VXLAN Tunnel Endpoint)完成。VTEP负责在物理网络和虚拟网络之间进行封装和解封装操作。VXLAN通过IP网络建立隧道,实现跨物理网络的二层网络扩展。
VXLAN报文格式
VXLAN报文格式是在传统以太网帧的基础上,通过添加额外的VXLAN头部、UDP头部、IP头部和外层以太网头部来实现的。
VXLAN报文结构
+------------------------+
| Outer Ethernet Header |
+------------------------+
| Outer IP Header |
+------------------------+
| Outer UDP Header |
+------------------------+
| VXLAN Header |
+------------------------+
| Inner Ethernet Frame |
+------------------------+
如上图所示,VXLAN报文主要由五个部分组成:外层以太网头部、外层IP头部、外层UDP头部、VXLAN头部以及内层以太网帧。每个部分都有其特定的功能,以下分别进行详细说明。
外层以太网头部(Outer Ethernet Header)
外层以太网头部是VXLAN报文的最外层封装,用于在物理网络中传输报文。其结构与传统以太网帧头部相同,主要包含以下字段:
目的MAC地址(Destination MAC Address,MAC DA):这是报文的目标MAC地址,通常是下一跳设备(如交换机或路由器)的MAC地址。在VTEP之间传输时,目的MAC地址指向远端VTEP的MAC地址。
源MAC地址(Source MAC Address,MAC SA):这是报文的源MAC地址,通常是当前VTEP设备的MAC地址。
802.1Q标签(802.1Q Tag):这是一个可选字段,用于在报文中携带VLAN Tag信息。VLAN Tag用于在多租户环境中实现网络隔离。
以太网类型(Ethernet Type):该字段指示帧的上层协议类型,例如IPv4、IPv6等。
外层以太网头部的主要作用是确保VXLAN报文能够在物理网络中被正常传输和路由。
外层IP头部(Outer IP Header)
外层IP头部是用于在IP网络中传输VXLAN报文的封装部分。其结构与传统的IP头部相同,主要包括以下字段:
版本(Version):指定IP协议的版本,通常为IPv4(值为4)或IPv6(值为6)。
头部长度(Header Length):指示IP头部的长度。
服务类型(Type of Service,ToS):用于指示报文的服务质量。
总长度(Total Length):表示整个IP报文的长度,包括IP头部和数据部分。
标识(Identification):用于标识IP分片。
标志(Flags):控制和指示IP分片。
片偏移(Fragment Offset):指示分片的位置。
生存时间(Time to Live,TTL):该字段指定报文在网络中可以存在的最大跳数。每经过一个网络设备,TTL值减1,当TTL值为0时,报文将被丢弃。
协议类型(Protocol Type):该字段指定上层协议类型,对于VXLAN报文,该值通常为
17
,表示UDP协议。头部校验和(Header Checksum):用于检测IP头部在传输过程中是否发生了错误。
源IP地址(Source IP Address,IP SA):这是报文的源IP地址,通常是VTEP的IP地址。
目的IP地址(Destination IP Address,IP DA):这是报文的目标IP地址,通常是远端VTEP的IP地址。
外层IP头部的主要作用是通过IP网络对VXLAN报文进行路由和转发。
外层UDP头部(Outer UDP Header)
外层UDP头部用于封装VXLAN头部和内层以太网帧。其结构与传统的UDP头部相同,主要包括以下字段:
源端口号(Source Port):这是UDP报文的源端口号,通常通过哈希算法计算得到。源端口号用于实现负载均衡和多路径传输。
目的端口号(Destination Port):这是UDP报文的目标端口号,对于VXLAN报文,该端口号固定为
4789
,这是VXLAN的标准端口。长度(Length):该字段表示整个UDP报文的长度,包括头部和数据部分。
校验和(Checksum):该字段用于检测UDP报文在传输过程中是否发生了错误。
外层UDP头部的主要作用是将VXLAN头部和内层以太网帧封装为UDP数据,并通过IP网络进行传输。
VXLAN头部(VXLAN Header)
VXLAN头部是VXLAN报文的核心部分,用于标识和区分不同的VXLAN网络。VXLAN头部结构如下:
+----------------------+----------------------+----------------------+----------------------+
| 8-bit Flags | Reserved (24 bits) | VXLAN Network Identifier (VNI) (24 bits) | Reserved (8 bits) |
+----------------------+----------------------+----------------------+----------------------+
VXLAN标志位(VXLAN Flags):该字段占8位,表示VXLAN的标志。当前仅使用第3位,固定为
1
,其余位设置为0
。VNI(VXLAN Network Identifier):VNI是24位的VXLAN网络标识符,用于区分不同的VXLAN网络。通过VNI,VTEP可以将来自不同虚拟网络的流量进行隔离和标识。
保留字段(Reserved):其余的32位均为保留字段,必须设置为
0
,以备将来扩展使用。
VXLAN头部的主要作用是通过VNI标识不同的虚拟网络,实现大规模网络虚拟化和多租户隔离。
内层以太网帧(Inner Ethernet Frame)
内层以太网帧是来自虚拟机或物理机的原始以太网帧,其结构与传统以太网帧相同,主要包括以下字段:
目的MAC地址(Destination MAC Address,MAC DA):目标设备的MAC地址。
源MAC地址(Source MAC Address,MAC SA):源设备的MAC地址。
VLAN标签(VLAN Tag):可选字段,用于在虚拟网络中携带VLAN信息。
以太网类型(Ethernet Type):指示上层协议类型,如IPv4、IPv6等。
数据字段(Data Field):包括上层协议数据,如IP报文、TCP/UDP数据等。
内层以太网帧在VXLAN报文中的作用是携带实际的用户数据,通过VTEP之间的隧道进行传输。
VXLAN报文传输流程
在VXLAN网络中,报文的传输主要依赖于VTEP的封装和解封装操作。下面我们详细介绍VXLAN报文的传输流程。
报文发送过程
当虚拟机(VM)发送数据时,报文首先生成内层以太网帧。然后,位于虚拟机所在主机上的VTEP会对该帧进行VXLAN封装,具体过程如下:
封装内层以太网帧:VTEP接收到虚拟机发送的内层以太网帧,并确定该帧应通过VXLAN隧道传输。
添加VXLAN头部:VTEP根据虚拟机所在的虚拟网络,为内层以太网帧添加VXLAN头部。具体操作包括设置VXLAN Flags、分配或检索VNI,并将其填充到VXLAN头部中。
添加UDP头部:在VXLAN头部前添加UDP头部。源端口号通过哈希算法计算得到,以支持负载均衡和多路径传输;目的端口号固定为
4789
,即VXLAN的标准端口。添加IP头部:在UDP头部前添加IP头部。源IP地址为本地VTEP的IP地址,目的IP地址为目标VTEP的IP地址。IP头部还包括TTL值、协议类型等信息。
添加外层以太网头部:最后,在IP头部前添加外层以太网头部。源MAC地址为本地VTEP的MAC地址,目的MAC地址为目标VTEP的MAC地址。如果需要,802.1Q VLAN标签也会被添加到外层以太网头部中。
发送报文:封装完成后,报文通过物理网络传输到目标VTEP。
报文接收过程
目标VTEP收到封装后的VXLAN报文后,会对其进行解封装,具体过程如下:
接收外层以太网报文:目标VTEP首先接收到外层以太网报文,解析出外层以太网头部、IP头部和UDP头部。
解析IP头部:目标VTEP解析IP头部,验证目标IP地址是否与本地VTEP匹配,并检查TTL值。
解析UDP头部:目标VTEP解析UDP头部,验证目的端口号是否为
4789
,以确保报文是VXLAN报文。解析VXLAN头部:目标VTEP解析VXLAN头部,提取VNI,确定报文所属的虚拟网络。
提取内层以太网帧:根据VXLAN头部中的VNI,目标VTEP将内层以太网帧提取出来,并根据内层以太网帧的目的MAC地址,将其转发到目标虚拟机或物理机。
转发内层报文:内层以太网帧被送到目标虚拟机或物理机,完成数据的传输。
VXLAN各字段详细解析
为了深入理解VXLAN报文格式,下面将对各个字段进行更详细的解析,解释其具体作用和配置要求。
VXLAN头部详细解析
VXLAN头部在整个报文中起到核心作用,它的设计使得VXLAN能够有效地支持大规模的虚拟网络。VXLAN头部由以下几个部分组成:
VXLAN Flags
字段大小:8位
描述:VXLAN Flags用于指示VXLAN报文的特定特性。当前,只有第3位(最低位从0开始编号)被定义,用于表示该报文是否包含有效的VNI信息。其余位目前未定义,必须设置为
0
。取值:
- 第3位设置为
1
:表示VXLAN报文包含有效的VNI信息。 - 其余位设置为
0
。
- 第3位设置为
作用:通过VXLAN Flags,VTEP可以快速识别报文是否为VXLAN封装的报文,并根据标志位决定是否解析VNI字段。
VXLAN Network Identifier (VNI)
字段大小:24位
描述:VNI是VXLAN网络标识符,用于区分不同的VXLAN段或虚拟网络。通过VNI,VTEP能够将来自不同虚拟网络的流量进行隔离和标识。
取值范围:0 到 16,777,215(2^24 - 1)
作用:VNI允许在同一物理网络上创建多达16,777,216个逻辑隔离的虚拟网络,极大地扩展了传统VLAN的限制(4096个VLAN)。
配置要求:
- 每个VXLAN段需要唯一的VNI。
- VTEP之间需要共享相同的VNI映射关系,确保正确的流量隔离和转发。
Reserved字段
字段大小:32位(包括24位和8位)
描述:这部分字段目前未被定义,必须设置为
0
,保留以备将来使用。作用:保留字段为将来VXLAN协议的扩展提供了空间,确保当前协议的向后兼容性。
外层UDP头部详细解析
外层UDP头部在VXLAN报文中起到将VXLAN报文封装在UDP报文中的作用,使其能够通过现有的IP网络进行传输。下面对UDP头部的各个字段进行详细解析:
源端口号(Source Port)
字段大小:16位
描述:源端口号由发送VTEP根据特定的哈希算法计算得到。该端口号用于支持负载均衡和多路径传输。
取值范围:0 到 65535
作用:
- 不同的源端口号可以用于区分不同的VXLAN隧道,增强流量的分散性。
- 源端口号的变化有助于在物理网络中实现负载均衡,通过不同的路径分发流量,提高网络的带宽利用率。
配置要求:
- 发送VTEP需要实现一种策略来动态分配和管理源端口号,以确保不同隧道的端口号分布均匀。
目的端口号(Destination Port)
字段大小:16位
描述:目的端口号固定为
4789
,这是VXLAN的标准端口号,用于标识VXLAN报文。作用:
- 通过固定的目的端口号,网络设备能够快速识别并处理VXLAN报文。
- 保证了VXLAN报文的一致性和可预测性,方便VTEP之间的互操作。
取值:
4789
配置要求:
- 网络设备(如防火墙、路由器)需要允许目的端口号为
4789
的UDP流量通过,以确保VXLAN报文能够正常传输。
- 网络设备(如防火墙、路由器)需要允许目的端口号为
长度(Length)
字段大小:16位
描述:该字段表示整个UDP报文的长度,包括UDP头部和数据部分。
取值范围:8 到 65535
作用:
- 确保接收端能够正确解析整个UDP报文的长度,避免报文截断或溢出。
- 支持不同大小的VXLAN报文,提高协议的灵活性。
配置要求:
- 在发送和接收端,确保UDP报文长度的正确性,防止由于长度字段错误导致的报文处理问题。
校验和(Checksum)
字段大小:16位
描述:校验和用于检测UDP报文在传输过程中是否发生了错误。
取值范围:0 到 65535
作用:
- 提供基本的数据完整性检查,确保UDP报文在传输过程中未被篡改或损坏。
- 增强了报文传输的可靠性。
配置要求:
- 校验和必须被正确计算和验证,以确保数据的完整性。
- 在某些情况下,校验和可以被禁用(值为0),但这会降低报文传输的可靠性。
外层IP头部详细解析
外层IP头部用于将VXLAN报文在IP网络中进行路由和转发。以下是对外层IP头部各字段的详细解析:
版本(Version)
字段大小:4位
描述:指定IP协议的版本,通常为IPv4(值为4)或IPv6(值为6)。
取值:
4
:IPv46
:IPv6
作用:
- 确定IP头部的格式和解析方式。
- 影响后续IP报文处理的步骤和方法。
配置要求:
- VTEP需要根据网络环境选择合适的IP版本,确保与网络中的其他设备兼容。
头部长度(Header Length)
字段大小:4位
描述:指示IP头部的长度,以4字节为单位。
取值范围:最小值为5(20字节),最大值取决于IP版本。
作用:
- 确定IP头部的实际长度,帮助接收端正确解析IP报文。
配置要求:
- 确保IP头部长度字段正确反映实际的头部长度,防止报文解析错误。
服务类型(Type of Service,ToS)
字段大小:8位
描述:用于指示报文的服务质量,包括优先级和延迟敏感性等。
作用:
- 影响IP报文在网络中的转发优先级。
- 支持不同类型流量的服务质量管理。
配置要求:
- 网络设备可以根据ToS字段实现流量分类和优先级调度。
总长度(Total Length)
字段大小:16位
描述:表示整个IP报文的长度,包括IP头部和数据部分。
取值范围:20(IPv4最小)到 65535 字节
作用:
- 确保接收端能够正确解析整个IP报文的长度,避免报文截断或溢出。
配置要求:
- 确保发送端和接收端对报文长度的处理一致,避免因长度字段错误导致的报文处理问题。
标识(Identification)
字段大小:16位
描述:用于标识IP分片,帮助接收端将分片重新组装。
作用:
- 在报文被分片传输时,确保分片能够被正确识别和组装。
配置要求:
- 在分片传输场景下,确保标识字段的一致性,以避免分片重组错误。
标志(Flags)
字段大小:3位
描述:控制和指示IP分片。
作用:
- 控制报文是否可以被分片。
- 指示是否存在更多的分片。
配置要求:
- 根据网络需求和MTU配置,适当设置标志字段,优化报文传输效率。
片偏移(Fragment Offset)
字段大小:13位
描述:指示分片的位置,用于帮助接收端重新组装报文。
作用:
- 确保分片报文能够被正确排序和组装。
配置要求:
- 在分片传输场景下,确保片偏移字段的准确性,以避免分片重组错误。
生存时间(Time to Live,TTL)
字段大小:8位
描述:指定报文在网络中可以存在的最大跳数。每经过一个网络设备,TTL值减1,当TTL值为0时,报文将被丢弃。
作用:
- 防止报文在网络中无限循环。
- 控制报文在网络中的生命周期。
配置要求:
- 根据网络拓扑和需求,合理设置TTL值,平衡报文到达目的地的概率和网络资源的消耗。
协议类型(Protocol Type)
字段大小:8位
描述:指定上层协议类型,对于VXLAN报文,该值通常为
17
,表示UDP协议。作用:
- 确保接收端能够正确解析和处理上层协议数据。
- 支持多种上层协议的传输和解析。
配置要求:
- VTEP需要正确设置协议类型,以确保UDP报文能够被正确识别和处理。
头部校验和(Header Checksum)
字段大小:16位
描述:用于检测IP头部在传输过程中是否发生了错误。
作用:
- 提供IP头部的基本数据完整性检查。
- 确保报文在传输过程中未被篡改或损坏。
配置要求:
- 确保发送端和接收端正确计算和验证校验和,以提高报文传输的可靠性。
源IP地址(Source IP Address,IP SA)
字段大小:
- IPv4:32位
- IPv6:128位
描述:这是报文的源IP地址,通常是VTEP的IP地址。
作用:
- 标识报文的发送端,支持路由和转发。
- 支持源IP地址过滤和安全策略的实施。
配置要求:
- 确保源IP地址的准确性和唯一性,避免地址冲突和路由错误。
目的IP地址(Destination IP Address,IP DA)
字段大小:
- IPv4:32位
- IPv6:128位
描述:这是报文的目标IP地址,通常是远端VTEP的IP地址。
作用:
- 确保报文能够正确路由到目标VTEP。
- 支持目标IP地址过滤和安全策略的实施。
配置要求:
- 确保目的IP地址的准确性,避免报文传输到错误的目标。
外层以太网头部详细解析
外层以太网头部用于在物理网络中传输VXLAN报文,其结构与传统以太网帧头部相同,但在VXLAN环境下具有特定的配置和作用。
目的MAC地址(Destination MAC Address,MAC DA)
字段大小:48位
描述:这是报文的目标MAC地址,通常是下一跳设备(如交换机或路由器)的MAC地址。在VTEP之间传输时,目的MAC地址指向远端VTEP的MAC地址。
作用:
- 确保报文能够在物理网络中被正确路由到目标VTEP。
- 支持基于MAC地址的转发和过滤。
配置要求:
- 确保目的MAC地址的准确性,避免报文传输到错误的设备。
- 在多路径和负载均衡场景下,可能需要动态更新目的MAC地址。
源MAC地址(Source MAC Address,MAC SA)
字段大小:48位
描述:这是报文的源MAC地址,通常是当前VTEP设备的MAC地址。
作用:
- 标识报文的发送端,支持源MAC地址过滤和安全策略的实施。
- 影响基于MAC地址的流量统计和监控。
配置要求:
- 确保源MAC地址的准确性和唯一性,避免地址冲突和网络冲突。
802.1Q标签(802.1Q Tag)
字段大小:32位(可选)
描述:这是一个可选字段,用于在报文中携带VLAN Tag信息。VLAN Tag用于在多租户环境中实现网络隔离。
作用:
- 支持多租户环境中的VLAN隔离,确保不同租户的流量互不干扰。
- 允许在物理网络中通过VLAN进行流量分类和管理。
配置要求:
- 在需要VLAN隔离的场景下,启用802.1Q标签。
- 确保VLAN ID的一致性和正确性,避免跨租户的流量泄漏。
以太网类型(Ethernet Type)
字段大小:16位
描述:该字段指示帧的上层协议类型,例如IPv4、IPv6等。
取值示例:
0x0800
:IPv40x86DD
:IPv60x0806
:ARP
作用:
- 确保报文能够被正确解析和处理。
- 支持多种上层协议的传输和解析。
配置要求:
- 根据实际应用场景,正确设置以太网类型字段,以确保上层协议能够被正确识别和处理。
内层以太网帧详细解析
内层以太网帧是VXLAN报文中的实际用户数据,其结构与传统以太网帧相同,但在VXLAN环境下,内层以太网帧的处理和传输具有特定的要求和优化。
目的MAC地址(Destination MAC Address,MAC DA)
字段大小:48位
描述:目标设备的MAC地址,指向接收端的设备。
作用:
- 确保内层以太网帧能够被正确转发到目标设备。
- 支持基于MAC地址的流量分类和安全策略。
配置要求:
- 确保目标MAC地址的准确性,避免流量传输错误。
- 在多租户和大规模环境下,动态管理MAC地址表,防止地址冲突和资源浪费。
源MAC地址(Source MAC Address,MAC SA)
字段大小:48位
描述:源设备的MAC地址,指向发送端的设备。
作用:
- 标识内层以太网帧的发送端,支持源MAC地址过滤和安全策略的实施。
- 影响基于MAC地址的流量统计和监控。
配置要求:
- 确保源MAC地址的准确性和唯一性,避免地址冲突和网络冲突。
VLAN标签(VLAN Tag)
字段大小:32位(可选)
描述:可选字段,用于在内层以太网帧中携带VLAN信息,支持网络的逻辑隔离。
作用:
- 支持多租户环境中的VLAN隔离,确保不同租户的流量互不干扰。
- 允许在虚拟网络中通过VLAN进行流量分类和管理。
配置要求:
- 在需要VLAN隔离的场景下,启用内层VLAN标签。
- 确保VLAN ID的一致性和正确性,避免跨租户的流量泄漏。
以太网类型(Ethernet Type)
字段大小:16位
描述:指示内层以太网帧的上层协议类型,如IPv4、IPv6等。
取值示例:
0x0800
:IPv40x86DD
:IPv60x0806
:ARP
作用:
- 确保内层以太网帧的上层协议能够被正确解析和处理。
- 支持多种上层协议的传输和解析。
配置要求:
- 根据实际应用场景,正确设置内层以太网类型字段,以确保上层协议能够被正确识别和处理。
数据字段(Data Field)
字段大小:46到1500字节(可变)
描述:包括上层协议数据,如IP报文、TCP/UDP数据等,是内层以太网帧的实际用户数据。
作用:
- 传输实际的应用数据和网络流量。
- 支持多种协议和应用场景。
配置要求:
- 确保数据字段的完整性和准确性,避免数据损坏和传输错误。
- 根据网络需求,优化数据字段的大小和分段,以提高传输效率和性能。
VXLAN报文封装和解封装流程
为了更好地理解VXLAN报文格式,下面将详细介绍VXLAN报文的封装和解封装流程,说明各个字段在实际操作中的作用和配置要求。
报文封装流程
当虚拟机(VM)发送数据时,VTEP需要对内层以太网帧进行封装,以便通过物理网络传输到目标VTEP。具体的封装流程如下:
接收内层以太网帧:VTEP从虚拟机接收到内层以太网帧,包含源MAC地址、目的MAC地址、VLAN标签(如果有)和数据字段。
添加VXLAN头部:
- 设置VXLAN Flags字段的第3位为
1
,其余位为0
。 - 分配或检索VNI,以标识该帧所属的VXLAN网络。
- 填充保留字段为
0
。 - 将VXLAN头部添加到内层以太网帧之前。
- 设置VXLAN Flags字段的第3位为
添加UDP头部:
- 计算源端口号,通常通过哈希算法基于源IP地址、目的IP地址、源端口号等信息生成。
- 设置目的端口号为
4789
。 - 计算UDP校验和,确保报文的完整性。
- 将UDP头部添加到VXLAN头部之前。
添加IP头部:
- 设置源IP地址为本地VTEP的IP地址。
- 设置目的IP地址为目标VTEP的IP地址。
- 设置TTL值,根据网络拓扑选择合适的值(例如64)。
- 设置协议类型为
17
,表示UDP。 - 计算IP校验和,确保报文的完整性。
- 将IP头部添加到UDP头部之前。
添加外层以太网头部:
- 设置源MAC地址为本地VTEP的MAC地址。
- 设置目的MAC地址为目标VTEP的MAC地址,通过查找路由表或MAC地址表获得。
- 如需,添加802.1Q VLAN标签以支持多租户隔离。
- 设置以太网类型字段为
0x0800
(IPv4)或0x86DD
(IPv6),根据IP版本选择。 - 将外层以太网头部添加到IP头部之前。
发送报文:封装完成后,VTEP通过物理网络将报文发送到目标VTEP。
报文解封装流程
目标VTEP接收到封装后的VXLAN报文后,需要对其进行解封装,以提取内层以太网帧并将其转发到目标虚拟机或物理机。具体的解封装流程如下:
接收外层以太网报文:目标VTEP从物理网络接收到外层以太网报文,包含外层以太网头部、IP头部、UDP头部、VXLAN头部和内层以太网帧。
解析外层以太网头部:
- 检查目的MAC地址是否匹配本地VTEP的MAC地址。
- 如需,解析802.1Q VLAN标签以支持多租户隔离。
- 验证以太网类型字段,确保报文为IP协议(
0x0800
或0x86DD
)。
解析IP头部:
- 验证目的IP地址是否匹配本地VTEP的IP地址。
- 检查TTL值,确保报文未超出允许的跳数。
- 验证协议类型字段为
17
,表示UDP协议。
解析UDP头部:
- 验证目的端口号为
4789
,确保报文为VXLAN报文。 - 校验UDP校验和,确保报文在传输过程中未被篡改或损坏。
- 验证目的端口号为
解析VXLAN头部:
- 检查VXLAN Flags字段的第3位是否为
1
,确认VNI字段有效。 - 提取VNI,确定报文所属的VXLAN网络。
- 验证保留字段为
0
,确保报文格式正确。
- 检查VXLAN Flags字段的第3位是否为
提取内层以太网帧:
- 根据VNI,将内层以太网帧提取出来,准备转发到目标虚拟机或物理机。
- 如有必要,移除内层VLAN标签,确保内层以太网帧的正确性。
转发内层报文:将提取的内层以太网帧发送到目标虚拟机或物理机,完成数据传输。