zoukankan      html  css  js  c++  java
  • Vxlan 原理

    openstack understand neutron 

    https://www.gitbook.com/book/yeasy/openstack_understand_neutron/details

    linux 上实现 vxlan 网络 (英文版

    自己总结一下:

    分析 VTEP的情况, 即Vxlan跟VXLAN通信的情况(非SDN的情况下)。

    VXLAN 在linux下可以使用 ovs支持,也可以使用linux-bridge支持。


    张华的博客 http://blog.csdn.net/quqi99/article/details/9170109, 好像也是IBMer, 写了很多网络相关的博客。 

    基本原理: L2 in L4的原理。

    先做个实验(组播方式):

    host1:

    创建vtep(vxlan的tunnel)及其bridge

    NIC=ens3
    sudo brctl addbr br1  # sudo ifconfig br1 192.169.0.6/24
    sudo ip link set br1 up
    sudo ip link add vxlan100 type vxlan id 100 group 239.1.1.1 dev $NIC
    # sudo ip link add vxlan100 type vxlan id 100 remote 10.0.0.28 dstport 4789 dev $NIC   # 单播 
    sudo ip link set vxlan100 up
    sudo brctl addif br1 vxlan100

    模拟一个VM的nic

    1 sudo ip link add type veth
    2 sudo ifconfig veth0 192.167.0.6/24 up
    3 sudo ifconfig veth0 mtu 1450
    4 sudo ifconfig veth1 up
    5 sudo ifconfig veth1 mtu 1450
    6 sudo brctl addif br1 veth1
    $ sudo ip link
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
        link/ether fa:16:3e:05:aa:28 brd ff:ff:ff:ff:ff:ff
    3: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP mode DEFAULT group default qlen 1000
        link/ether 62:d2:a5:91:6a:8c brd ff:ff:ff:ff:ff:ff
    4: vxlan100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue master br1 state UNKNOWN mode DEFAULT group default qlen 1000
        link/ether 62:d2:a5:91:6a:8c brd ff:ff:ff:ff:ff:ff
    5: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default qlen 1000
        link/ether aa:e6:2e:9b:62:0c brd ff:ff:ff:ff:ff:ff
    6: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br1 state UP mode DEFAULT group default qlen 1000
        link/ether 8e:a5:ec:e4:7f:0d brd ff:ff:ff:ff:ff:ff
    $ ip add show ens3  |grep inet
        inet 10.0.0.32/24 brd 10.0.0.255 scope global ens3
    $ route
    Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
    default         localhost       0.0.0.0         UG    0      0        0 ens3
    10.0.0.0        *               255.255.255.0   U     0      0        0 ens3
    169.254.169.254 localhost       255.255.255.255 UGH   0      0        0 ens3
    192.167.0.0     *               255.255.255.0   U     0      0        0 veth0
    192.169.0.0     *               255.255.255.0   U     0      0        0 br1
    sudo netstat -ulp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
    udp        0      0 *:bootpc                *:*                                 923/dhclient
    udp        0      0 *:8472                  *:*                                 -

    host2:

    创建vtep(vxlan的tunnel)及其bridge

    NIC=ens3
    sudo brctl addbr br1  # sudo ifconfig br1 192.169.0.7/24
    sudo ip link set br1 up
    sudo ip link add vxlan100 type vxlan id 100 group 239.1.1.1 dev $NIC 
    # sudo ip link add vxlan100 type vxlan id 100 remote 10.0.0.32 dstport 4789 dev $NIC
    sudo ip link set vxlan100 up
    sudo brctl addif br1 vxlan100

    模拟一个VM的nic

    1 sudo ip link add type veth
    2 sudo ifconfig veth0 192.167.0.7/24 up
    3 sudo ifconfig veth0 mtu 1450
    4 sudo ifconfig veth1 up
    5 sudo ifconfig veth1 mtu 1450
    6 sudo brctl addif br1 veth1
    $ sudo ip link
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
        link/ether fa:16:3e:72:0e:58 brd ff:ff:ff:ff:ff:ff
    3: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UP mode DEFAULT group default qlen 1000
        link/ether 5a:8e:c9:5f:53:d6 brd ff:ff:ff:ff:ff:ff
    4: vxlan100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue master br1 state UNKNOWN mode DEFAULT group default qlen 1000
        link/ether 5a:8e:c9:5f:53:d6 brd ff:ff:ff:ff:ff:ff
    5: veth0@veth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP mode DEFAULT group default qlen 1000
        link/ether 2a:b4:c1:16:6e:47 brd ff:ff:ff:ff:ff:ff
    6: veth1@veth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue master br1 state UP mode DEFAULT group default qlen 1000
        link/ether e2:21:11:b3:9d:73 brd ff:ff:ff:ff:ff:ff
    $  ip add show ens3  |grep inet
        inet 10.0.0.28/24 brd 10.0.0.255 scope global ens3

    网络测试:

    host2 $ ping 192.167.0.6

    host1 $ sudo tcpdump -i veth0 -vvv

    tcpdump: listening on veth0, link-type EN10MB (Ethernet), capture size 262144 bytes
    17:33:55.276520 IP (tos 0x0, ttl 64, id 27270, offset 0, flags [DF], proto ICMP (1), length 84)
    192.167.0.7 > 192.167.0.6: ICMP echo request, id 12626, seq 1, length 64
    17:33:55.276633 IP (tos 0x0, ttl 64, id 56736, offset 0, flags [none], proto ICMP (1), length 84)
    192.167.0.6 > 192.167.0.7: ICMP echo reply, id 12626, seq 1, length 64

    host1 $ sudo tcpdump -i vxlan100 -vvv
    tcpdump: listening on vxlan100, link-type EN10MB (Ethernet), capture size 262144 bytes
    17:48:32.437673 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 192.167.0.7 tell 192.167.0.6, length 28
    17:48:32.439064 ARP, Ethernet (len 6), IPv4 (len 4), Reply 192.167.0. is-at 2a:b4:c1:16:6e:47 (oui Unknown), length 28

    host1 $ sudo tcpdump -i ens3 -vvv -p udp -w eth0_vxlan.cap

    $ sudo tcpdump host 10.0.0.28 -i ens3 -vv
    15:35:30.857397 IP (tos 0x0, ttl 64, id 19875, offset 0, flags [none], proto UDP (17), length 134)
        localhost.55482 > localhost.8472: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 100
    IP (tos 0x0, ttl 64, id 14017, offset 0, flags [DF], proto ICMP (1), length 84)
        192.167.0.7 > 192.167.0.6: ICMP echo request, id 12933, seq 187, length 64
    15:35:30.857589 IP (tos 0x0, ttl 64, id 23656, offset 0, flags [none], proto UDP (17), length 134)
        localhost.58224 > localhost.8472: [no cksum] OTV, flags [I] (0x08), overlay 0, instance 100
    IP (tos 0x0, ttl 64, id 1851, offset 0, flags [none], proto ICMP (1), length 84)
        192.167.0.6 > 192.167.0.7: ICMP echo reply, id 12933, seq 187, length 64

     删除创建的接口

    sudo ip link set veth1 down
    sudo ip link delete veth1 type veth
    sudo ip link set vxlan100 down
    sudo ip link delete vxlan100
    sudo ip link set br1 down
    sudo ip link delete br1

    原理

    在不同host上的VM 通信, ARP通过所在的host的VTEP(用来封包解包记录流表)封包(UDP)完之后, 进行IP组播, 整个网络中,在同一IP组播内的VTEP收到广播后,解包。

    然后发给VM,VM 进行ARP响应。

    流表格式 【(VNI,内层MAC1,外层vtep_ip),(VNI,内层MAC2,外层vtep_ip)】。

    以后的通信,通过流表,根据 目地VM的MAC地址,源VETP找到对应目的VTEP的IP地址 行封包, 目的VTEP进行解包。

    具体查看。

    http://network.51cto.com/art/201312/425388.htm

    VTEP负责原始以太报文的VXLAN封装和解封装,可以是虚拟交换机,也可以是物理交换机. 在openstack中, 通常是ovs提供该功能。

    VXLAN GW除了具备VTEP的功能外,还负责VLAN报文与VXLAN报文之间的映射和转发,主要以物理交换机为主。

    VXLAN IP GW具有VXLAN GW的所有功能,此外,还负责处理不同VXLAN之间的报文通信,同时也是数据中心内部服务向往发布业务的出口,主要以高性能物理交换机为主。

     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交互结束

    四:数据传输

    (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将做为两个独立的协议栈各自工作,相互之间没有交互。

    五:Vxlan网关

    如果需要VXLAN网络和非VXLAN网络连接,必须使用VXLAN网关才能把VXLAN网络和外部网络进行桥接和完成VXLAN ID和VLAN ID之间的映射和路由,和VLAN一样,VXLAN网络之间的通信也需要三层设备的支持,即VXLAN路由的支持。同样VXLAN网关可由硬件和软件来实现。从封装的结构上来看,VXLAN提供了将二层网络overlay在三层网络上的能力,VXLAN Header中的VNI有24个bit,数量远远大于4096,并且UDP的封装可以穿越三层网络,比VLAN有更好的扩展性。

  • 相关阅读:
    Flash 报表之 LineChart & PieChart
    TVS二极管的选型和应用测试计算实例
    中兴招聘面试问题:有源晶振输出串个电阻做啥用?
    EPCS 无法配置FPGA的解决方法以及JTAG、AS调试总结
    ADS8364 VHDL程序正式版
    TVS二极管选型指南
    PID整定方法
    TVS瞬态电压抑制二极管(钳位二极管)原理参数
    高边和低边电流检测技术分析
    灵活使用示波器触发功能,帮助大大提高测量效率
  • 原文地址:https://www.cnblogs.com/shaohef/p/4667429.html
Copyright © 2011-2022 走看看