VXLAN是一种将二层报文用三层协议进行封装的技术,可以对二层网络在三层范围进行扩展。每个覆盖域被称为VXLAN segment,它的ID是由位于VXLAN数据包头中的VNI标识来区分的。VNI字段包含24bits,故segments最大数量为2的24次方,并且只有在相同的VXLAN segments才能通信。
它是一种在UDP中封装MAC的简单机制,可以创建跨多个物理IP子网的虚拟2层子网(也就是在三层子网中跑2层)
其实EtherIP和GRE也可以实现在IP中封装MAC,但是它们都无法做到VLAN逻辑标记
根据VXLAN的封包模式,也可以将它看作一种隧道模式的网络覆盖技术,这种隧道是无状态的。隧道端点VTEP一般位于拥有虚机的hypervisor宿主机中,因此VNI和VXLAN隧道只有VTEP可见,对于虚机来说是透明的。那么不同的VXLAN segments就可以有相同的MAC地址的虚机。并且VTEP也可以位于物理交换机或物理主机中,甚至可以用软件来定义
VTEP之间完全是通过L3协议交互的,也就意味着VTEP之间可以由Router相连,而非类似于GRE封装模式的固定端到端隧道连接。
实例:
VM1要向VM2发送数据前,必须要知道VM2的MAC地址,其获取过程如下:
1、VM1发送ARP请求包,请求192.168.0.101[VM2_IP]的MAC地址;
2、ARP请求包被VTEP1封装成多播包,发给VNI=864的多播组;
3、所有的VTEP接收此多播包,并添加(VNI–VTEP1–VM1_MAC Address)映射关系到自己的VXLAN表中;
4、目的主机上的VTEP2接收到多播包后将其解开,并向本主机上VNI=864的所有虚拟机发送广播包;
5、VM2看到了ARP包后,回应了自己的MAC地址;
6、VTEP2再次封装回应的单播包,通过路由发给VTEP1;
7、VTEP1解包,并将包传给VM1,则最终获取了VM2的MAC地址;
8、VTEP1将(VNI–VTEP2–VM2_MAC Address)映射关系添加到自己的VXLAN表中;
VM1获知VM2的MAC地址后,发送数据包,过程如下:
1、 VM1发送IP数据包到VM2,即192.168.0.100 到 192.168.0.101;
2、 VTEP1查找自己的VXLAN表知道要发给VTEP2,然后依次封装以下数据包头;
a)VXLAN包头,VNI=864;
b)标准UDP包头,校验和checksum为0x0000,目标端口号4789;
c)标准IP包头,目标地址为VTEP2的IP地址,协议号设为0x11表面为UDP包。
d)标准MAC数据包,目标地址为下一跳设备的MAC地址00:10:11:FE:D8:D2,可路由到目标隧道端VTEP2。
3、 VTEP2接收数据包,根据UDP的destination端口找到VXLAN数据包。接着查找所有所在VXLAN的VNI为864的端口组,找到VM2的
4、 VM2接收并处理数据包,拿到Payload数据。