zoukankan      html  css  js  c++  java
  • Vxlan基础理解

    一 . 为什么需要Vxlan
     
    1. vlan的数量限制
       4096个vlan远不能满足大规模云计算数据中心的需求
     
    2. 物理网络基础设施的限制
       基于IP子网的区域划分限制了需要二层网络连通性的应用负载的部署
     
    3. TOR交换机MAC表耗尽
        虚拟化以及东西向流量导致更多的MAC表项
     
    4. 多租户场景
        IP地址重叠?
     
     VXLAN能解决哪些问题

    1、服务器虚拟化技术,允许在物理机上运行多个MAC地址各不相同的虚拟机,随着数量的增加,交换机上的MAC地址表将剧烈膨胀,甚至需要MAC覆盖。

    2、数据中心多以VLAN为虚拟机划分网络,但是VLAN数量受制于VLAN(802.1Q)协议4096,这远远满足不了现实的需求。

    3、多租户环境的要求,其每个租户都有自己隔离的网络环境,导致物理网络中每个租户所分配的MAC地址和VLAN ID会存在重叠的可能。

    4、Spanning Tree Protocol (STP)算法会产生大量多路路径冗余。

    5、支持远距离虚拟机迁移,避免处理复杂的L2 (VLAN)网络环境。

    6、ToR(Top of Rack) Switch链接着物理server,它记录着各个server/VM相连的MAC地址映射表。当地址映射表满时,ToR就会停止学习新的地址,
    这样就会导致网络泛洪,直到有记录过期被换出,腾出空闲表项。
     
    二. 什么是Vxlan

    VXLAN(Virtual eXtensible Local Area Network)是一种将二层报文用三层协议进行封装的技术,可以对二层网络在三层范围进行扩展。每个覆盖域
    被称为VXLAN segment,它的ID是由位于VXLAN数据包头中的VXLAN Network Identifier(VNI)标识的。VNI字段包含24
    bits,故segments最大数量为2的24次方,约合16M个。并且只有在相同VXLAN segment内的虚拟机之间才可以相互通信。

    根据VXLAN的封包方式,也可以将它看做一种隧道模式的网络覆盖技术,这种隧道是无状态的。隧道端点VTEP (VXLAN Tunnel End
    Point - an entity which originates and/or terminates VXLAN
    tunnels),它一般位于拥有虚拟机的hypervisor宿主机中,因此VNI(VXLAN Network Identifier or
    VXLAN Segment ID)和VXLAN隧道只有VTEP可见,对于虚拟机是透明的,那么不同的VXLAN
    segment中就允许具有相同MAC地址的虚拟机。并且VTEP也可以位于物理交换机或物理主机中,甚至可以使用软件来定义。VTEP
    (单播时是两个VTEP或多播时是多个VTEP)之间完全是通过L3协议交互的,这也就意味着VTEP间可以由Router相连,而非类似于GRE模式的固定端到端隧道连接。
     
    1. Vxlan报文
        vxlan(virtual Extensible LAN)虚拟可扩展局域网,是一种overlay的网络技术,使用MAC in UDP的方法进
    行封装,共50字节的封装报文头。具体的报文格式如下:
     
    (1) vxlan header
        共计8个字节,目前使用的是Flags中的一个8bit的标识位和24bit的VNI(Vxlan Network identifier),
    其余部分没有定义,但是在使用的时候必须设置为0x0000。
     
    (2) 外层的UDP报头
         目的端口使用4798,但是可以根据需要进行修改。同时UDP的校验和必须设置成全0。
     
    (3) IP报文头
         目的IP地址可以是单播地址,也可以是多播地址。单播情况下,目的IP地址是Vxlan Tunnel End Point
    (VTEP)的IP地址。在多播情况下引入VXLAN管理层,利用VNI和IP多播组的映射来确定VTEPs。???
    • 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的。
    补充:VTEP的作用?    
         用于对VXLAN报文进行封装/解封装,包括ARP请求报文和正常的VXLAN数据报文,在一段封装报文
    后通过隧道向另一端VTEP发送封装报文,另一端VTEP接收到封装的报文解封装后根据封装的MAC地址
    进行转发。VTEP可由支持VXLAN的硬件设备或软件来实现。
     
       从封装的结构上来看,VXLAN提供了将二层网络overlay在三层网络上的能力,VXLAN Header中的VNI有
    24个bit,数量远远大于4096,并且UDP的封装可以穿越三层网络,比VLAN有更好的扩展性。
     
    2. Vxlan的数据和控制平面
      (1) 数据平面---隧道机制
         已经知道,VTEP为虚拟机的数据包加上了层包头,这些新的报头之有在数据到达目的VTEP后才会被去掉。
    中间路径的网络设备只会根据外层包头内的目的地址进行数据转发,对于转发路径上的网络来说,一个Vxlan
    数据包跟一个普通IP包相比,除了个头大一点外没有区别。
         由于VXLAN的数据包在整个转发过程中保持了内部数据的完整,因此VXLAN的数据平面是一个基于隧道
    的数据平面。
     
    (2) 控制平面----改进的二层协议
         VXLAN不会在虚拟机之间维持一个长连接,所以VXLAN需要一个控制平面来记录对端地址可达情况。控制
    平面的表为(VNI,内层MAC,外层VTEP_ip)。Vxlan学习地址的时候仍然保存着二层协议的特征,节点之间不会
    周期性的交换各自的路由表,对于不认识的MAC地址,VXLAN依靠组播来获取路径信息(如果有SDN Controller,
    可以向SDN单播获取)。
        另一方面,VXLAN还有自学习的功能,当VTEP收到一个UDP数据报后,会检查自己是否收到过这个虚拟机的
    数据,如果没有,VTEP就会记录源vni/源外层ip/源内层mac对应关系,避免组播学习。
     
     
    3. VxlanARP请求
     
    (1) vxlan初始化
     
     VM1和VM2连接到VXLAN网络(VNI)100,两个VXLAN主机加入IP多播组239.119.1.1
     
    (2) ARP请求
     
       1) VM1以广播的形式发送ARP请求;
       2) VTEP1封装报文。打上VXLAN标识为100,外层IP头DA为IP多播组(239.119.1.1),SA为IP_VTEP1.
       3) VTEP1在多播组内进行多播;
       4) VTEP2解析接收到多播报文。填写流表(VNI, 内层mac地址,外层Ip地址),并在本地VXLAN标识为100的范围内
           广播(是VXLAN的用武之地)。
       5) VM2对接收到的ARP请求进行响应;
     
    (3) ARP应答

      1) VM2准备ARP响应报文后向VM1发送响应报文

      2)VTEP2接收到VM2的响应报文后把它封装在ip单播报文中(VXLAN标识依然为100),然 后向VM1发送单播

      3)VTEP1接收到单播报文后,学习内层MAC到外层ip地址的映射,解封装并根据被封装内容的目的MAC地址转发给VM1

      4)VM1接收到ARP应答报文,ARP交互结束
     
    4  数据传输
        (1)  ARP请求应答之后,VM1知道了VM2的Mac地址,并且要向VM2通信(注意,VM1是以TCP的方法向VM2发送数据的)。
    VTEP1 收到VM1发送数据包,用MAC地址从流表中检查VM1与VM2是否属于用一个VNI。两个VM不但位于同一个VNI中
    (不在同一个VNI中出网关),并且VTEP1已经知道了VM2的所有地址信息(MAC和VTEP2_IP)。VTEP1封装新的数据包。然后
    交给上联交换机。
       (2) 上联交换机收到服务器发来的UDP包,对比目的IP地址和自己的路由表,然后将数据报转发给相应的端口。
       (3) 目的VTEP收到数据包后检查器VNI,如果UDP报中VNI与VM2的VNI一致,则将数据包解封装后交给VM2进一步处理。至此
    一个数据包传输完成。整个Vxlan相关的行为(可能穿越多个网关)对虚拟机来说是透明的,虚拟机不会感受传输的过程。
     
        虽然VM1与VM2之间启动了TCP来传输数据,但数据包一路上实际是以UDP的形式被转发,两端的VTEP并不会检查数据是否
    正确或者顺序是否完整,所有的这些工作都是在VM1和VM2在接收到解封装的TCP包后完成的。也就是说如果说如果被UDP封装
    的是TCP连接,那么UDP和TCP将做为两个独立的协议栈各自工作,相互之间没有交互。
        
    5 Vxlan网关
     如果需要VXLAN网络和非VXLAN网络连接,必须使用VXLAN网关才能把VXLAN网络和外部网络进行桥接和
    完成VXLAN ID和VLAN ID之间的映射和路由,和VLAN一样,VXLAN网络之间的通信也需要三层设备的支持,
    即VXLAN路由的支持。同样VXLAN网关可由硬件和软件来实现。
     
     从封装的结构上来看,VXLAN提供了将二层网络overlay在三层网络上的能力,VXLAN Header中的VNI有
    24个bit,数量远远大于4096,并且UDP的封装可以穿越三层网络,比VLAN有更好的扩展性。
     
    6.部署
    (1) 纯VXLAN部署场景
      对于连接到VXLAN内的虚拟机,由于虚拟机的VLAN信息不再作为转发的依据,虚拟机的迁移也就
    不再受三层网关的限制,可以实现跨越三层网关的迁移。
     
     
    (2) VXLAN与VLAN混合部署
     
       为了实现VLAN和VXLAN之间互通,VXLAN定义了VXLAN网关。VXLAN网关上同时存在两种类型的端口:VXLAN端口
    和普通端口。
       当收到从VXLAN网络到普通网络的数据时,VXLAN网关去掉外层包头,根据内层的原始帧头转发到普通端口上;当有数据
    从普通网络进入到VXLAN网络时,VXLAN网关负责打上外层包头,并根据原始VLAN ID对应到一个VNI,同时去掉内层包头
    的VLAN ID信息。相应的如果VXLAN网关发现一个VXLAN包的内层帧头上还带有原始的二层VLAN ID,会直接将这个包丢弃。
    之所以这样,是VLAN ID是一个本地信息,仅仅在一个地方的二层网络上其作用,VXLAN是隧道机制,并不依赖VLAN ID进行
    转发,也无法检查VLAN ID正确与否。因此,VXLAN网关连接传统网络的端口必须配置ACCESS口,不能启用TRUNK口
     
     
    三 、VXLAN Frame Format










    (1)     Inner Ethernet Header[8+8+4]20字节


    <ignore_js_op>








       Inner Dest MAC Address:目的虚拟机的MAC地址。

       Inner Source MAC Address:源虚拟机的MAC地址。

    Optional Ethertype:可选的VLAN tag。



    (2)VXLAN Header[1+3+3+1]8字节


    <ignore_js_op>








    Flags(8 bits) :I标记位(从左到右第5个bit)必须设置为1,其余7个R标记位置0。

        VXLAN Network Identifier(VNI) :24bit的值,用来标识VXLAN覆盖网络的编号。

        Reserved fields:24 bits + 8 bits,置为0有效。



    (3)Outer UDP Header[2+2+2+2]8字节


    <ignore_js_op>








         Source端口:由VTEP提供,端口值由hash算法计算所得。

         Dest端口:为了网络的交互特性,一般设置为4789。

         UDP校验和:一般为0,非0则此包将会被丢弃。



    (4)Outer IP Header[4+4+12]20字节


    <ignore_js_op>








        Outer Source IPv4 Address:发送端VTEP(见上文介绍)的IP地址。

        Protocl:置为0x11(即17)表明包含UDP包。

    Outer Dest IPv Address:可以是单播也可以是多播地址。大多数情况是目标接收端VTEP的IP地址,如果没有则会执行ARP请求来获取,具体步骤如下:

            1:目标IP被替换为与源虚拟机具有相同VNI的多播组IP地址。

    2:所有的VTEP端都接收此多播包,VTEP查找所在主机上的全部虚拟机来匹配源虚拟机的Inner Dest MAC Address。

            3:目标VTEP上的虚拟机会回应这个多播包,从而获知目标VTEP IP地址。

    4:发送端VTEP添加(VNI -- VTEP -- 虚拟机MAC地址)映射关系到自己的VXLAN表中,避免再次组播学习过程。



        (5)Outer Ethernet Header[6+6+4+2]18字节


    <ignore_js_op>








              Outer Dest MAC Address:一般被设置为接收端VTEP设备的MAC地址,或者下一跳设备端口的MAC地 址。(纯粹的L3网络传输过程)

              Outer Source MAC Address:发送端VTEP设备的MAC地址。

              OptnlEthtype VLAN:指定Ethertype为0x8100,并且指定VLAN tag。





    四 、VXLAN网络中VM间通信过程

    在VXLAN模式的网络环境中:源虚拟机发送出去的L2数据包(Inner Ethernet Header + Payload),由send
    VTEP使用VXLAN Header (由VNI标识所属的segment)将L2数据包封装,然后依次追加UDP Header + 标准IP
    Header + 标准MAC Header;发出后由L3协议通过标准IP
    Header转发;根据UDP目的端口发现VXLAN包头,匹配VNI找到receives VTEP;最后receives
    VTEP解包,由L2数据包头找到目标虚拟机,交互Payload数据。



    VM间通信举例:




    <ignore_js_op>










    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数据。





    五 、VXLAN的部署场景

             VXLAN && VXLAN


    <ignore_js_op>








           
     VXLAN多用于数据中心的虚拟机化环境中,可以穿越机架甚至是数据中心。如上图两个宿主机Server1和Server2,它们可以位于同一个机架也可以位于不同机架,还可以位于不同的数据中心,只要直接由L3网络相连即可,其本质是VETP可以跨越L3。

    上图中有4个VXLAN覆盖网络:

    VNI=11表示为[{Server1[VM1-1]}, {Server2[VM2-4]}]

    VNI=34表示为[{Server1[VM1-2]}, {Server2[VM2-1]}]

    VNI=74表示为[{Server1[VM1-3]}, {Server2[VM2-2]}]

    VNI=98表示为[{Server1[VM1-4]}, {Server2[VM2-3]}]



             VXLAN && non-VLXAN


    <ignore_js_op>










             VXLAN网络和非VXLAN网络互连就得需要VXLAN
    gateway,非VXLAN一般为VLAN类型网络。VXLAN网关会剥去数据包的VXLAN包头,将数据包发送到端口MAC地址与Inner
    Destination MAC Address相同的端口完成数据传输。如果non-VXLAN网络环境使用的VLAN协议,则应该注意Inner
    Ethernet Header中的VLAN ID设置,总之无论数据是进还是出,VLAN
    ID不用时可以丢弃不管,使用时必须正确指定。值得说明的是:VXLAN网关可用硬件实现,也可以用软件实现
  • 相关阅读:
    石子归并
    【性能测试工具】- ApacheBench
    如何提问
    HTTP 0.9 / 1.0 / 1.1
    【NO.3-1】Jmeter
    【有意思的BUG】未名
    【FlashPlayer】-Debug版本-开发人员推荐
    【NO.1】Jmeter-安装JDK- 配置Jmeter运行的环境
    【IP限制】验证是否限制了境外IP访问权限
    【有意思的BUG】视频连接超时
  • 原文地址:https://www.cnblogs.com/gzxbkk/p/7999925.html
Copyright © 2011-2022 走看看