vxlan 协议

概念

类似VLAN的封装技术将OSI第2层以太网帧封装在第4层UDP数据报。

虚拟可扩展局域网(VXLAN)是一种网络虚拟化技术,旨在解决与大型云计算部署相关的可伸缩性问题。它使用类似VLAN的封装技术将OSI第2层以太网帧封装在第4层UDP数据报中,并使用4789作为IANA分配的默认目标UDP端口号。终端VXLAN隧道的VXLAN端点可以是虚拟或物理交换机端口,被称为VXLAN隧道端点(VTEP)。

VXLAN是对overlay封装协议进行标准化工作的演进。它最多可将扩展性提高到1600万个逻辑网络,并允许layer 2 通过IP网络邻接。具有head-end replication (HER)的多播或单播用于泛洪广播,未知单播和多播(BUM)通信。

VXLAN规范最初是由VMware,Arista Networks和Cisco创建的。 VXLAN技术的其他支持者包括 Huawei, Broadcom, Citrix, Pica8, Big Switch Networks, Cumulus Networks, Dell EMC, Ericsson, Mellanox, FreeBSD, OpenBSD,Red Hat,Joyent, and Juniper Networks。

IETF在RFC 7348中正式记录了VXLAN。VXLAN使用MAC-in-UDP数据包封装模式,该模式限制直接访问对象的某些组件。

Open vSwitch是支持VXLAN overlay网络的基于软件的虚拟网络交换机的示例。

vxlan 协议_第1张图片

工作模型

在原来的 IP 网络(三层)上,只要是三层可达(能够通过 IP 互相通信)的网络就能部署 vxlan。在每个端点上都有一个 vtep 负责 vxlan 协议报文的封包和解包,也就是在虚拟报文上封装 vtep 通信的报文头部。物理网络上可以创建多个 vxlan 网络,这些 vxlan 网络可以认为是一个隧道,不同节点的虚拟机能够通过隧道直连。每个 vxlan 网络由唯一的 VNI 标识,不同的 vxlan 可以不相互影响。

vxlan 协议_第2张图片

  • VTEP(VXLAN Tunnel Endpoints):vxlan 网络的边缘设备,用来进行 vxlan 报文的处理(封包和解包)。vtep 可以是网络设备(比如交换机),也可以是一台机器(比如虚拟化集群中的宿主机)

  • VNI(VXLAN Network Identifier):VNI 是每个 vxlan 的标识,是个 24 位整数,一共有 2^24 = 16,777,216(一千多万),一般每个 VNI 对应一个租户,也就是说使用 vxlan 搭建的公有云可以理论上可以支撑千万级别的租户

  • Tunnel:隧道是一个逻辑上的概念,在 vxlan 模型中并没有具体的物理实体想对应。隧道可以看做是一种虚拟通道,vxlan 通信双方(图中的虚拟机)认为自己是在直接通信,并不知道底层网络的存在。从整体来说,每个 vxlan 网络像是为通信的虚拟机搭建了一个单独的通信通道,也就是隧道。

报文结构

下图是 vxlan 协议的报文,白色的部分是虚拟机发送报文(二层帧,包含了 MAC 头部、IP 头部和传输层头部的报文),前面加了 vxlan 头部用来专门保存 vxlan 相关的内容,在前面是标准的 UDP 协议头部(UDP 头部、IP 头部和 MAC 头部)用来在底层网路上传输报文。

vxlan 协议_第3张图片

报文结构

从这个报文中可以看到三个部分:

  1. 最外层的 UDP 协议报文用来在底层网络上传输,也就是 vtep 之间互相通信的基础

  2. 中间是 VXLAN 头部,vtep 接受到报文之后,去除前面的 UDP 协议部分,根据这部分来处理 vxlan 的逻辑,主要是根据 VNI 发送到最终的虚拟机

  3. 最里面是原始的报文,也就是虚拟机看到的报文内容

报文各个部分的意义如下:

  • VXLAN header:vxlan 协议相关的部分,一共 8 个字节

    • VXLAN flags:标志位

    • Reserved:保留位

    • VNID:24 位的 VNI 字段,这也是 vxlan 能支持千万租户的地方

    • Reserved:保留字段

  • UDP 头部,8 个字节

    • UDP 应用通信双方是 vtep 应用,其中目的端口就是接收方 vtep 使用的端口,IANA 分配的端口是 4789

  • IP 头部:20 字节

    • 主机之间通信的地址,可能是主机的网卡 IP 地址,也可能是多播 IP 地址

  • MAC 头部:14 字节

    • 主机之间通信的 MAC 地址,源 MAC 地址为主机 MAC 地址,目的 MAC 地址为下一跳设备的 MAC 地址

可以看出 vxlan 协议比原始报文多 50 字节的内容,这会降低网络链路传输有效数据的比例。vxlan 头部最重要的是 VNID 字段,其他的保留字段主要是为了未来的扩展,目前留给不同的厂商用这些字段添加自己的功能。

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! ! 

通信过程

vxlan 报文的发送过程:

虚拟机的报文通过 vtep 添加上 vxlan 以及外部的报文层,然后发送出去,对方 vtep 收到之后拆除 vxlan 头部然后根据 VNI 把原始报文发送到目的虚拟机。

vxlan 报文需要哪些信息

  • 内层报文:通信的虚拟机双方要么直接使用 IP 地址,要么通过 DNS 等方式已经获取了对方的 IP 地址,因此网络层地址已经知道。同一个网络的虚拟机需要通信,还需要知道对方虚拟机的 MAC 地址,vxlan 需要一个机制来实现传统网络 ARP 的功能

  • vxlan 头部:只需要知道 VNI,这一般是直接配置在 vtep 上的,要么是提前规划写死的,要么是根据内部报文自动生成的,也不需要担心

  • UDP 头部:最重要的是源地址和目的地址的端口,源地址端口是系统生成并管理的,目的端口也是写死的,比如 IANA 规定的 4789 端口,这部分也不需要担心

  • IP 头部:IP 头部关心的是 vtep 双方的 IP 地址,源地址可以很简单确定,目的地址是虚拟机所在地址宿主机 vtep 的 IP 地址,这个也需要由某种方式来确定

  • MAC 头部:如果 vtep 的 IP 地址确定了,MAC 地址可以通过经典的 ARP 方式来获取,毕竟 vtep 网络在同一个三层,经典网络架构那一套就能直接用了

总结:

一个 vxlan 报文需要确定两个地址信息:目的虚拟机的 MAC 地址目的 vtep 的 IP 地址,如果 VNI 也是动态感知的,那么 vtep 就需要一个三元组:

内部 MAC <--> VNI <--> VTEP IP

一般分为两种方式:多播和控制中心。

多播的概念是同个 vxlan 网络的 vtep 加入到同一个多播网络,如果需要知道以上信息,就在组内发送多播来查询;

控制中心的概念是在某个集中式的地方保存了所有虚拟机的上述信息,自动化告知 vtep 它需要的信息。

多播

简单来说,每个多播组对应一个多播 IP 地址,往这个多播 IP 地址发送的报文会发给多播组的所有主机。

为什么要使用多播?因为 vxlan 的底层网络是三层的,广播地址无法穿越三层网络,要给 vxlan 网络所有 vtep 发送报文只能通过多播。

下图是在多播模式下,vxlan 的报文工作流程,位于左下方的 机器 A 要通过 vxlan 网络发送报文给右下方的机器 B。

vxlan 协议_第4张图片

因为并不是所有的网络设备都支持多播,再加上多播方式带来的报文浪费,在实际生产中这种方式很少用到。

分布式控制中心

分布式控制中心保存了 虚拟机或者容器的IP 和 MAC信息

除此之外,控制中心还保存了每个 vxlan 网络有哪些 vtep,这些 vtep 的地址是多少。有了这些信息,vtep 就能发送报文时直接查询并添加头部,不需要多播去满网络地问了。

一般情况下,在每个 vtep 所在的节点都会有一个 agent,它会和控制中心通信,获取 vtep 需要的信息以某种方式告诉 vtep。具体的做法取决于具体的实现,每种实现可能会更新不同的信息给 vtep,比如 HER(Head End Replication)只是把多播组替换成多个单播报文,也就是把多播组所有的 VTEP IP 地址告诉 vtep,这样查询的时候不是发送多播,而是给组内每个 vtep 发送一个单播报文;有些实现只是告诉 vtep 目的虚拟机的 MAC 地址信息;有些实现告诉 MAC 地址对应的 vtep IP 地址。

分布式控制的 vxlan 是一种典型的 SDN 架构,也是目前使用最广泛的方式。

解决的问题

  • 更大的规模

VXLAN header有8个字节,有24bit用来标识不同的二层网络,这样总共是1600多万个。

而VLAN Tag总共4个字节,其中有12bit用来标识不同的二层网络,这样总共是4000多个。

  • 通过封装减少交换机上的MAC地址

vxlan 协议_第5张图片

交换机通过MAC地址表实现转发

交换机是根据MAC地址表实现二层转发。如上图所示,交换机在收到一个数据帧之后,根据VLAN和目的MAC地址,查找到相应的交换机端口,再将数据帧从相应的端口发出。

转发时可能遇到的两种情况:

  • 查找到相关的数据,按照mac表转发。

  • 未查到表,会flood到所有的端口。(应尽量避免)

现状:

因为虚拟化,整个数据中心的MAC地址多了几十倍,那相应的交换机里面的MAC地址表也需要扩大几十倍,会造成上面未查到表,flood到所有的端口。

vxlan的解决方式:

虚拟机的Ethernet Frame被VTEP封装UDP里面,一个VTEP可以被一个物理主机上的所有虚拟机共用。从交换机的角度,交换机看到的是VTEP之间传递UDP数据。通常,一个物理主机对应一个VTEP,所以交换机的MAC地址表,只需要记录与物理主机数量相当条目就可以了。

  • 灵活的虚机部署和部署

vlan现状:

不存在overlay网络。虚拟机的网络数据,被打上VLAN Tag之后,直接在物理网络上传输,与物理网络上的VLAN是融合在一起的。不同的VLAN网络,会被分配不同的IP地址段,通过路由器或者其他的三层设备连接在一起。

优点:

虚拟机能直接访问到物理网络的设备

缺点:

不能打破物理网络的限制,不是大二层的概念。

vxlan 协议_第6张图片

vxlan的解决方法

VXLAN通过UDP传输Ethernet Frame,那相应的可以在一个L3网络上,传递L2的数据。又或者用官方的说法,在一个L3网络上构建了L2网络。物理网络的二层边界还存在,但是现在虚机的网络数据在三层网络传输,可以跨越物理二层网络的限制。

vxlan 协议_第7张图片

不管物理网络的二层还是三层,虚拟机现在已经感知不到了。通过VXLAN的封装,虚拟机现在走的是一套独立于物理网络(underlay network)的overlay network。

  • 更好的使用多链路

VLAN协议使用STP(Spanning Tree Protocol)来管理多条线路,STP根据优先级和cost,只会选出一条线路来工作,这样可以避免数据传递的环路。这种主备(active-passive)的模式,比只连接一条线路肯定是有优势,但是对于用户来说,相当于花了N倍的钱,却只用到了1倍的服务。当网络流量较大的时,也不能通过增加线路来提升性能。

而VXLAN因为是通过UDP封装,在三层网络上传输。虽然传递的还是二层的Ethernet Frame,但是VXLAN可以利用一些基于三层的协议来实现多条线路共同工作(active-active),以实现负载均衡,例如ECMP,LACP。现在对于用户来说,花了N倍的钱,也用到了N倍的服务。当网络流量较大时,现在可以通过增加线路来减轻现有线路的负担。这在提升数据中心网络性能,尤其是东西向流量的性能时,尤其重要。

参考文献:

  1. https://en.wikipedia.org/wiki/Virtual_Extensible_LAN.

  2. https://cizixs.com/2017/09/25/vxlan-protocol-introduction/.

  3. VXLAN vs VLAN - 知乎(很棒).

原文链接:https://zhuanlan.zhihu.com/p/109349917 

你可能感兴趣的:(c++,DPDK,linux,udp,linux,服务器,后台开发,网络协议)