VXLAN网络基础

简介

VXLAN 全称 Virtual eXtensible Local Area Network, 是一种基于三层网络构建虚拟的二层网络的方案。它使用 UDP 封装二层的数据帧,实现了 overlay 网络。所有处于 overlay 网络中的设备均感觉不到底层和传统网络的差别。

相关知识点

OSI七层网络模型

OSI 的七层网络模型从下到上依次是: 物理层,数据链路层,网络层,传输层、会话层、表示层、应用层

我们在简介中提到的二层、三层都是这七层中的,二层是数据链路层,它主要抽象了根据mac地址来传输数据帧这一过程。三层是网络层,典型的是ipv4, ipv6这样的网络协议,根据 ip 地址来传输 ip 数据报。

注意虽然 VXLAN 是基于 UDP 封装了数据帧,但是我们一般说它是基于三层而不是四层。因为在这里我们关注的是数据的是如何传输到指定地址的,而不是如何封装的。

overlay 的含义

overlay 字面含义就是上层的,还有一个对应的词,也就是underlay。结合在一起就好理解了,
VXLAN 是 overlay 网络,说的是它实现的二层(数据链路层)是 overlay 的,这二层是基于三层(网络层)的 underlay 网络。

单播和多播

下面的定义来源于维基百科

  • 单播: 英文 unicast, 是指数据包在计算机网络的传输中,目的地址为单一目标的一种传输方式。它是现今网络应用最为广泛,通常所使用的网络协议或服务大多采用单播传输,例如一切基于TCP的协议。

  • 多播(组播): 英文 multicast,是指把信息同时传递给一组目的地址。它使用的策略是最高效的,因为消息在每条网络链路上只需传递一次,且只有在链路分叉的时候,消息才会被复制。

数据帧

以常见的 EthernetII 帧为例,其帧格式如下:

ethernetII frame

D.MAC: 6byte,目标 MAC 地址
S.MAC: 6byte, 来源 MAC 地址
Type: 2byte, 0x0800是 IP 类型,0x0806 是 ARP 类型
Data: 数据
FCS: 为了进行差错检验而添加的冗余码。

以下是我用 wireshark 抓的 arp 帧:

arp in wireshark

我在笔记本(192.168.31.243)上 ping 了 192.168.31.133 这个地址,因为我的笔记本不知道 192.168.31.133 的mac地址,因此使用 arp 帧来查找目的mac地址。

VLAN

VLAN(Virtual Local Area Network) 和本文介绍的 VXLAN 从名称上看就很相似,中文名称叫做虚拟局域网,它们的作用也是一样的,可以用来划分子网。下面采用维基百科上关于虚拟局域网的介绍。

虚拟区域网络(Virtual Local Area Network或简写VLAN, V-LAN)是一种建构于局域网交换技术(LAN Switch)的网络管理的技术,网管人员可以借此透过控制交换机有效分派出入局域网的报文到正确的出入端口,达到对不同实体局域网中的设备进行逻辑分群(Grouping)管理,并降低局域网内大量数据流通时,因无用报文过多导致壅塞的问题,以及提升局域网的信息安全保障。

但是 VLAN 是基于二层的方案,它会在数据帧头部添加4个字节的 VLAN Tag,其中 12bit 用来标识不同的二层网络,这样总共是 4000 多个。其次 VLAN 会使用 MAC 地址表来记录 VLAN ID、 MAC 和 Port 这三者之间的关系,因此一旦网络中主机数量多起来,会导致 MAC 地址表占用很大的内存。 关于 VLAN 和 VXLAN的区别,可以参考这篇文章: VXLAN vs VLAN

VXLAN 协议

vxlan protocol

上图从整体上来看,是一个 UDP 的报文,在 UDP 的数据部分的前8位是 VXLAN Header,表明这个 UDP 封装的是 VXLAN 的数据帧,后面则是原始的2层数据帧了。在 VXLAN Header中,有下面几个字段:

  • VXLAN RRRR1RRR: VXLAN 的标记位
  • Reserved: 保留位
  • VNID: 24位的 VNI 字段
  • Reserved: 保留字段

VXLAN 的实现原理

VXLAN 将以太网数据帧封装在 UDP 内,进而在三层网络传输。VXLAN 数据的封装和解封发生在 VTEP(VXLAN Tunnel EndPoint)。VTEP 是 VXLAN 网络的边缘设备。同时每个 VXLAN 网络都有唯一的 VNI(VXLAN Network Identifier) 标识,这样在一个物理网络上可以构建多个 VXLAN 虚拟网络,满足多租户的要求。下图是 VXLAN 的网络架构示意图。

vxlan

这里面有两个比较重要的概念:

  • VTEP: VTEP 和传统交换机类似,也是基于 MAC 地址表工作,是 VXLAN 网络的边缘设备,用来对 VXLAN 报文封包和解包。VTEP 可以是网络设备(比如交换机),也可以是一台机器(比如虚拟化集群中的宿主机)。在 VTEP 中,可以认为有两个表: 一个是 VLAN 和 VXLAN 的对应关系表;另一个是 MAC 地址表,里面包含了很多 MAC 地址,VXLAN ID 和远端 VTEP IP 地址的对应关系。 VTEP 收到下面主机的网络数据帧时,会先根据 VLAN 查第一个表获取对应的 VXLAN ID,之后根据 VXLAN ID和目的 MAC 地址,查 MAC 地址表获取远端 VTEP 的 IP 地址。最后, VTEP 会剥离VLAN Tag,按照 VXLAN 格式封装数据帧,发往远端的 VTEP。远端的 VTEP 收到该数据后进行解包,根据 MAC 地址将数据帧发往其所连接的主机。

  • VNI: VNI 是每个VXLAN的标识,也就是上面说的 VXLAN ID,共24位,那么就可以表示 2^24=16777216 个 VXLAN 网络。每个 VXLAN ID 对应一个租户,那么理论上可以支撑千万级别的租户。

vxlan-vtep

图例: VXLAN VTEP

这里又引出另外一个问题, VXLAN 中的一台主机在只知道 ip 的情况下,如何获取对方的 MAC 地址。在传统网络中,ARP 请求是用来解决这个问题的。

  • VXLAN 网络中,主机发出的 ARP 请求会被 VTEP(1) 接收到,VTEP(1) 发现虚拟机目的 MAC 为广播地址,封装上 VXLAN 协议头部之后,发送给多播组,支持多播的底层网络设备会把报文发送给组内的所有成员
  • VTEP(2) 接收到 VXLAN 封装的 ARP 请求,去掉 VXLAN 头部,并通过报文学习到发送方 <虚拟机MAC-VNI-VTEP IP>这个对应关系,并把原来的 ARP 报文广播给主机。
  • 主机接受到 ARP 请求报文,如果 ARP 报文请求的是自己的 MAC 地址,就返回 ARP 应答
  • VTEP(2) 此时已经知道发送方的虚拟机 MAC 和 VTEP 信息,把 ARP 应答添加上 VXLAN 头部之后通过单播发送出去
  • VTEP(1)接收到报文,并学习到报文中的的对应关系,记录下来。然后 VTEP 进行解包,知道内部的 IP 和 MAC 地址,并转发给虚拟机。
  • 虚拟机拿到 ARP 应答报文,就知道了对方 IP 对应的 MAC 地址。

在这次多播之后,两台虚拟机之间的通信就可以通过单播了。VTEP 在这中间担任了一个代理的角色,使得虚拟机之间可以透明的进行网络通信。这和 nginx 担任反向代理的角色有点类似。同时我们可以发现,在一个大规模的 VXLAN 网络中,多播会是一件很消耗性能的事。

资料地址

VXLAN vs VLAN

VXLAN in OpenStack Neutron

VXLAN 协议原理简介

linux 上实现vxlan网络

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据