vxlan介绍

 一、什么是vxlan
        vxlan(Virtual eXtensible Local Area Network)从字面来看是vlan的扩展协议。vxlan对于vlan都扩展了哪些特性呢?
        1)、支持的网络数量。由于vlan Header头部限长是12bit, 导致vlan的限制个数是2^12=4096个,无法满足日益增长的需求,尤其是在公有云中。目前 VXLAN 的报文 Header 内有 24 bit,可以支持 2^24次方的 VNI (VXLAN Network Identifier)个数(VXLAN中通过 VNI 来识别,相当于VLAN ID)。
       2)、overlay网络。overlay网络就是叠加网络,是指在物理网络之上,通过某种技术再构建一张网络,这张网络可以看成是逻辑的网络,但它具有物理网络的所有特性。vlan只是单纯的对物理网络进行划分、隔离,ip、mac在整个物理网络(所有vlan)内部必须是唯一的。vxlan是在物理网络之上构建出的网络,这个网络通过vxlan来划分。ip、mac只需要在某个vxlan网络内部唯一即可。
       3)、隧道技术。vxlan和vlan一样提供的是二层服务。vlan报文只能在二层网络之间传播,不能跨三层网络,而vxlan报文可以跨越三层网络,实现大二层网络。vxlan跨越三层网络的技术就是在VETP(VXLAN Tunnel End Point)之间建立vxlan隧道。vxlan隧道是基于IP创建的。vxlan报文在vxlan隧道传输时是采用mac in udp方式,即vxlan报文外面封装了ether/IP/UDP三层报文,使用UDP协议进行传输。下图是vxlan网络中dhcp request报文在vxlan隧道中传输时的包结构。
         
vxlan介绍_第1张图片
                
二、vxlan报文格式
vxlan介绍_第2张图片

        1)vxlan header
        共计8个字节,目前使用的是Flags中的一个8bit的标识位和24bit的VNI(Vxlan Network identifier),其余部分没有定义,但是在使用的时候必须设置为0x0000。
        2)外层的UDP报头
         目的端口使用4798,但是可以根据需要进行修改。同事UDP的校验和必须设置成全0。
        3) IP报文头
        目的IP地址可以是单播地址,也可以是多播地址。单播情况下,目的IP地址是VTEP的IP地址。在多播情况下引入VXLAN管理层。    
        protocol:设置值为0x11,显示说明这是UDP数据包
        Source ip: 源vTEP_IP;
        Destination ip: 目的VTEP IP。
        4) Ethernet Header
        Destination Address:目的VTEP的Mac 地址,即为本地下一跳的地址(通常是网关Mac 地址);
        VLAN: VLAN Type被设置为0x8100, 并可以设置Vlan Id tag(这就是vxlan的vlan 标签)。
        Ethertype:设置值为0x8000,指明数据包为IPv4的。

三、VETP
        VETP(VXLAN Tunnel End Point),vxlan隧道的终点,用于对VXLAN报文进行封装/解封装,包括ARP请求报文和正常的VXLAN数据报文,在一段封装报文后通过隧道向另一端VTEP发送封装报文,另一端VTEP接收到封装的报文解封装后根据封装的MAC地址进行封装。
        VXLAN不会在虚拟机之间维持一个长连接,所以VXLAN需要一个控制平面来记录对端地址可达情况。控制平面的表为(VNI,内层MAC,外层vtep_ip)。Vxlan学习地址的时候仍然保存着二层协议的特征,节点之间不会周期性的交换各自的路由表,对于不认识的MAC地址,VXLAN依靠组播来获取路径信息(如果有SDN Controller,可以向SDN单播获取)。
        另一方面,VXLAN还有自学习的功能,当VTEP收到一个UDP数据报后,会检查自己是否收到过这个虚拟机的数据,如果没有,VTEP就会记录源vni/源外层ip/源内层mac对应关系,避免组播学习。 
 
四、vxlan网络vm间通信

vxlan介绍_第3张图片

        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的出端口,将数据包发给VM2
        4)、  VM2接收并处理数据包,拿到Payload数据。
五、vxlan性能
        1)l2 population
        从上一章节VM间通信可以知道,VM1想要知道VM2的mac地址时,会发送多播包,发给VNI=864的vxlan网络,如果有多台VM同事发送多播包,或造成广播风暴。

        L2 Population 的作用是在 VTEP 上提供 Porxy ARP 功能,使得 VTEP 能够预先获知 VXLAN 网络中如下信息: 
            a). VM IP – MAC 对应关系 
            b). VM – VTEP 的对应关系

        当 VM1需要与 VM2通信时: 
            a). VTEP1直接响应 VM1的 APR 请求,告之VM2 的MAC 地址。 
            b). 因为VTEP1知道 VM2位于VTEP2,会将封装好的 VXLAN 数据包直接发送给VTEP2。 

        2)mtu
        由于vxlan报文封装较多,vxlan隧道传输的报文会大于1500(即网卡的默认mtu值),会造成数据包分片,降低传输速率。所以,在实际传输中需要调大网卡的mtu值。
         另外,部分网卡驱动已经实现对vxlan数据包的处理,可以直接应用在vxlan网络中,提升vxlan的传输性能。

六、vxlan间通信
        vxlan提供的是二层服务,不同的vxlan网络之间通信需要使用路由器或者vxlan网关。
 

参考资料:
1、 http://www.aboutyun.com/thread-11189-1-1.html
2、 http://www.cnblogs.com/hbgzy/p/5279269.html
3、 http://blog.csdn.net/freezgw1985/article/details/16354897




你可能感兴趣的:(linux,network)