vlan的应用在网络项目中是非常广泛的,基本上大部分的项目都需要划分vlan,前几天我们讲到vlan的配置,有朋友就提到有没有更基础一些的内容,今天我们就从基础的vlan的知识开始,了解vlan的划分原理。
一、为什么需要VLAN
1、什么是VLAN?
VLAN(Virtual LAN),翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。
简单来说,同一个VLAN中的用户间通信就和在一个局域网内一样,同一个VLAN中的广播只有VLAN中的 成员才能听到,而不会传输到其他的VLAN中去,从而控制不必要的广播风暴的产生。同时, 若没有路由,不同VLAN之间不能相互通信,从而提高了不同工作组之间的信息安全性。网络 管理员可以通过配置VLAN之间的路由来全面管理网络内部不同工作组之间的信息互访。
2、未分割VLAN时将会发生什么?
那么,为什么需要分割VLAN(广播域)呢?那是因为,如果仅有一个广播域,有可能会影响到网络整体的传输性能。具体原因,请参看附图加深理解。
![](https://pics5.baidu.com/feed/ca1349540923dd549b70907b9bdf3ada9d8248f8.jpeg?token=dce315284b4354186f94a629dd5c9f7b&s=8910C412595A44C840D034D30000C0B2)
图中,是一个由5台二层交换机(交换机1~5)连接了大量客户机构成的网络。假设这时,计算机A需要与计算机B通信。在基于以太网的通信中,必须在数据帧中指定目标MAC地址才能正常通信,因此计算机A必须先广播“ARP请求(ARP Request)信息”,来尝试获取计算机B的MAC地址。
交换机1收到广播帧(ARP请求)后,会将它转发给除接收端口外的其他所有端口,也就是泛滥了。接着,交换机2收到广播帧后也会泛滥。交换机3、4、5也还会泛滥。最终ARP请求会被转发到同一网络中的所有客户机上,这也就是网络风暴。
我们分析下,这个计算A的ARP请求原本是为了获得计算机B的MAC地址而发出的。也就是说:只要计算机B能收到就万事大吉了。可是事实上,数据帧却传遍整个网络,导致所有的计算机都收到了它。如此一来,一方面广播信息消耗了网络整体的带宽,另一方面,收到广播信息的计算机还要消耗一部分CPU时间来对它进行处理。造成了网络带宽和CPU运算能力的大量无谓消耗,可能会造成网络瘫痪。
二、VLAN的原理
1、实现VLAN的机制
在理解了“为什么需要VLAN”之后,接下来让我们来了解一下交换机是如何使用VLAN分割广播域的。
首先,在一台未设置任何VLAN的二层交换机上,任何广播帧都会被转发给除接收端口外的所有其他端口上泛滥。例如,计算机A发送广播信息后,会被转发给端口2、3、4。
这时,如果在交换机上生成红、蓝两个VLAN;
同时设置端口1、2属于红色VLAN、端口3、4属于蓝色VLAN。
再从A发出广播帧的话,交换机就只会把它转发给同属于一个VLAN的其他端口——也就是同属于红色VLAN的端口2,不会再转发给属于蓝色VLAN的端口。
同样,C发送广播信息时,只会被转发给其他属于蓝色VLAN的端口,不会被转发给属于红色VLAN的端口。
就这样,VLAN通过限制广播帧转发的范围分割了广播域。上图中为了便于说明,以红、蓝两色识别不同的VLAN,在实际使用中则是用“VLAN的ID”来区分的。
但是,VLAN生成的逻辑上的交换机是互不相通的。因此,在交换机上设置VLAN后,如果未做其他处理,VLAN间是无法通信的。
2、需要VLAN间通信时怎么办?
那么,当我们需要在不同的VLAN间通信时又该如何是好呢?
VLAN是广播域。而通常两个广播域之间由路由器连接,广播域之间来往的数据包都是由路由器中继的。因此,VLAN间的通信也需要路由器提供中继服务,这被称作“VLAN间路由”。
VLAN间路由,可以使用普通的路由器,也可以使用三层交换机。大家可以记住不同VLAN间互相通信时需要用到路由功能。
二、VLAN的划分方式
1、静态VALN
静态VLAN也叫做基于端口的VLAN。从意思也能理解,它是固定不变的,就是明确指定交换机各端口属于哪个VLAN的设定方法。
基于端口的vlan这种方法,主要的优点就是定议vlan的成员很简单明了,思路清楚,直接针对交换机现有的端口设置vlan,哪些端口属于同一个vlan,很清楚的理解。
那么它的缺点呢?
由于需要一个个端口地指定,因此当网络中的计算机数目超过一定数字(比如数百台)后,设定操作就会变得烦杂无比。并且,计算机每次变更所连端口,都必须同时更改该端口所属VLAN的设定——这显然静态VLAN不适合那些需要频繁改变拓补结构的网络和大型网络。
2、动态VLAN
动态VLAN则是根据每个端口所连的计算机,随时改变端口所属的VLAN。这就可以避免上述的更改设定之类的操作。动态VLAN可以大致分为3类:
● 基于MAC地址的VLAN(MAC Based VLAN)
● 基于子网的VLAN(Subnet Based VLAN)
● 基于用户的VLAN(User Based VLAN)
①、基于MAC地址的VLAN,就是通过查询并记录端口所连计算机上网卡的MAC地址来决定端口的所属。假定有一个计算机的MAC地址为“A”被交换机设定为属于VLAN“10”,那么不论MAC地址为“A”这台计算机连在交换机哪个端口,该端口都会被划分到VLAN10中去。
例如:计算机连在端口1时,端口1属于VLAN10;而计算机连在端口2时,则是端口2属于VLAN10。
②、基于子网的VLAN,则是通过所连计算机的IP地址,来决定端口所属VLAN的。不像基于MAC地址的VLAN,即使计算机因为交换了网卡或是其他原因导致MAC地址改变,只要它的IP地址不变,就仍可以加入原先设定的VLAN。
说白了,只要电脑ip地址不变,那么它的vlan就不变,很方便,计算机可以换交换机端口,也可以MAC地址了,都不影响。
③、基于用户的VLAN,则是根据交换机各端口所连的计算机上当前登录的用户,来决定该端口属于哪个VLAN。这里的用户识别信息,一般是计算机操作系统登录的用户,比如可以是Windows域中使用的用户名。这些用户名信息,属于OSI第四层以上的信息。
3、总结
综上所述,vlan的设定手法有静态VLAN和动态VLAN两种,其中动态VLAN又可以继续细分成几个小类。
其中基于子网的VLAN和基于用户的VLAN有可能是网络设备厂商使用独有的协议实现的,不同厂商的设备之间互联有可能出现兼容性问题;因此在选择交换机时,一定要注意事先确认。
三、交换机之间的连接方式
那么,如果需要设置跨越多台交换机的VLAN时又如何呢?
1、方法一
在规划企业级网络时,很有可能会遇到隶属于同一部门的用户分散在同一座建筑物中的不同楼层的情况,这时可能就需要考虑到如何跨越多台交换机设置VLAN的问题了。假设有如下图所示的网络,且需要将不同楼层的A、C和B、D设置为同一个VLAN。
如下图:
这时最关键的就是“交换机1和交换机2该如何连接才好呢?”
最简单的方法,自然是在交换机1和交换机2上各设一个红、蓝VLAN专用的接口并互联了。但是,这个办法从扩展性和管理效率来看都不好。例如,在现有网络基础上再新建VLAN时,为了让这个VLAN能够互通,就需要在交换机间连接新的网线。建筑物楼层间的纵向布线是比较麻烦的,一般不能由基层管理人员随意进行。并且,VLAN越多,楼层间(严格地说是交换机间)互联所需的端口也越来越多,交换机端口的利用效率低是对资源的一种浪费、也限制了网络的扩展。
2、方法2
为了避免上面这种低效率的连接方式,人们想办法让交换机间互联的网线集中到一根上,这时使用的就是汇聚链接(Trunk Link)。
何谓汇聚链接?
汇聚链接(Trunk Link)指的是能够转发多个不同VLAN的通信的端口。
汇聚链路上流通的数据帧,都被附加了用于识别分属于哪个VLAN的特殊信息。
现在再让我们回过头来考虑一下刚才那个网络如果采用汇聚链路又会如何呢?用户只需要简单地将交换机间互联的端口设定为汇聚链接就可以了。这时使用的一根网线还是普通的UTP线,而不是什么其他的特殊布线。图例中是交换机间互联,因此需要用交叉线来连接。
接下来,让我们具体看看汇聚链接是如何实现跨越交换机间的VLAN的。
A发送的数据帧从交换机1经过汇聚链路到达交换机2时,在数据帧上附加了表示属于红色VLAN的标记。
交换机2收到数据帧后,经过检查VLAN标识发现这个数据帧是属于红色VLAN的,因此去除标记后根据需要将复原的数据帧只转发给其他属于红色VLAN的端口。这时的转送,是指经过确认目标MAC地址并与MAC地址列表比对后只转发给目标MAC地址所连的端口。只有当数据帧是一个广播帧、多播帧或是目标不明的帧时,它才会被转发到所有属于红色VLAN的端口。
蓝色VLAN发送数据帧时的情形也与此相同。
四、VLAN间通信的原理
1、同一VLAN内的通信
接下来,我们继续学习使用汇聚链路连接交换机与路由器时,VLAN间路由是如何进行的。如下图所示,为各台计算机以及路由器的子接口设定IP地址。
红色VLAN(VLANID=1)的网络地址为192.168.1.0/24,蓝色VLAN(VLANID=2)的网络地址为192.168.2.0/24。各计算机的MAC地址分别为A/B/C/D,路由器汇聚链接端口的MAC地址为R。交换机通过对各端口所连计算机MAC地址的学习,生成如下的MAC地址列表。
首先考虑计算机A与同一VLAN内的计算机B之间通信时的情形。
计算机A发出ARP请求信息,请求解析B的MAC地址。交换机收到数据帧后,检索MAC地址列表中与收信端口同属一个VLAN的表项。结果发现,计算机B连接在端口2上,于是交换机将数据帧转发给端口2,最终计算机B收到该帧。收发信双方同属一个VLAN之内的通信,一切处理均在交换机内完成。
2、不同VLAN间通信时数据的流程
接下来是这一讲的核心内容,不同VLAN间的通信。让我们来考虑一下计算机A与计算机C之间通信时的情况。
过程1、计算机A从通信目标的IP地址(192.168.2.1)得出C与本机不属于同一个网段。因此会向设定的默认网关(Default Gateway,GW)转发数据帧。在发送数据帧之前,需要先用ARP获取路由器的MAC地址。
过程2、得到路由器的MAC地址R后,接下来就是按图中所示的步骤发送往C去的数据帧。①的数据帧中,目标MAC地址是路由器的地址R、但内含的目标IP地址仍是最终要通信的对象C的地址。
过程3、交换机在端口1上收到①的数据帧后,检索MAC地址列表中与端口1同属一个VLAN的表项。由于汇聚链路会被看作属于所有的VLAN,因此这时交换机的端口6也属于被参照对象。这样交换机就知道往MAC地址R发送数据帧,需要经过端口6转发。
过程4、从端口6发送数据帧时,由于它是汇聚链接,因此会被附加上VLAN识别信息。由于原先是来自红色VLAN的数据帧,因此如图中②所示,会被加上红色VLAN的识别信息后进入汇聚链路。路由器收到②的数据帧后,确认其VLAN识别信息,由于它是属于红色VLAN的数据帧,因此交由负责红色VLAN的子接口接收。
过程5、接着,根据路由器内部的路由表,判断该向哪里中继。
由于目标网络192.168.2.0/24是蓝色VLAN,,且该网络通过子接口与路由器直连,因此只要从负责蓝色VLAN的子接口转发就可以了。这时,数据帧的目标MAC地址被改写成计算机C的目标地址;并且由于需要经过汇聚链路转发,因此被附加了属于蓝色VLAN的识别信息。这就是图中③的数据帧。
过程6、交换机收到③的数据帧后,根据VLAN标识信息从MAC地址列表中检索属于蓝色VLAN的表项。由于通信目标——计算机C连接在端口3上、且端口3为普通的访问链接,因此交换机会将数据帧除去VLAN识别信息后(数据帧④)转发给端口3,最终计算机C才能成功地收到这个数据帧。
进行VLAN间通信时,即使通信双方都连接在同一台交换机上,也必须经过:发送方——交换机——路由器——交换机——接收方
这样一个流程。
二、VXLAN
VXLAN,Virtual eXtensible Local Area Network,表面的理解,是对 VLAN 的扩展。我们知道,VLAN ID,12 bits,最大4K(4096),在当前云时代,已经不足以承担租户隔离的重任了(太少了)。而 VXLAN,简单地说,将 12 bits 扩展到 24 bits,这样其数值就达到了 1600 万(16777216,4096 * 4096) ,暂时应该够用了。当然,VXLAN 可不是如此简单,我们下文会描述,这里先暂时不用纠结。
VXLAN,由 Storvisor,Cumulus Networks,Arista,Broadcom,Cisco,VMware,Intel,Red Hat 等8家公司,于 2014.8 提交草案“ draft-mahalingam-dutt-dcops-vxlan”(RFC7348,2011.8 启动,2014.8 发布 1.0 版本)
按照 RFC7348的说法,VXLAN 的提出,期望解决三个问题:
(1)Limitations Imposed by Spanning Tree and VLAN Ranges;
(2)Multi-tenant Environments;
(3)Inadequate Table Sizes at ToR Switch。
我们暂且不深究这三个问题,就当作只有一个问题:VLAN 数量不够了,需要扩展。等我们掌握了 VXLAN 的基本知识,再回头看这三个问题,就会事半功倍!
VXLAN 从报文结构上来讲,可以理解为 MAC in UDP。我们这里暂时只给一个示意,待到后面再详细描述这个报文结构,如下图所示:
如图,我们看到,VXLAN 就是在原来的报文头前面封装上一个新的“UDP Header”再加上一个 VXLAN Header。(UDP Header 包括 链路层 Header, IP 层 Header, UDP 层Header,可不要误解了)。由于链路层 Header 最主要的字段就是 MAC 地址,所以,我们有时候也称 VXLAN 为“MAC in UDP”。
3.8.2 VXLAN 概念模型
直接上图:
按道理来说,概念模型图应该画得抽象一点,可是这个图画的一点都不抽象。且听笔者一一道来:
DC:图中画了三个 DC(Data Center,数据中心),但是 VXLAN 可以在一个 DC 内,也可以在不同的 DC 间。从抽象的角度讲,VXLAN 不是说一定要跨越 DC。在一个 DC 内和跨越 DC,各有不同的场景。
L3 Network:只能说这是一个三层网络,不能说这个 L3 就一定是 Internet,也可以就是一个 DC 内的网络。
VM:VM(Visual Machine,虚拟机),图中只是一个示意,画出了一个 Host 内的 VM。实际 VM,当然会有很多。另外,从抽象的角度来讲,不是 VM,就仅仅是 Host,也未尝不可。只是,从使用场景来说,现在大家都说云,不谈 VM,好像不合适,^_^
VTEP:VTEP(VXLAN Tunnel End Point,VXLAN 隧道终结点,An entity that originates and/or terminates VXLAN tunnels,是一个 VXLAN 隧道的发起或终结点。),从实现角度来讲,是 VXLAN 里最重要的模型。前面的模型,都是使用场景相关,这个模型,承载了 VXLAN 的实现。图中,VTEP 体现在了 HOST 中的 vSWitch(OVS,Open Visual Switch),在实际使用场景中,VTEP 也可以由 ToR(Top of Rack,机架交换机,一般位于机架顶部,所以称为 ToR)实现。
VNI:VNI(VXLAN Network Identifier (or VXLAN Segment ID)),标识一个 VXLAN 网段(可以对比理解为 VLAN ID),24 bits,最大值是16777216(16 M)。
VSI:VSI(Virtual Switching Instance,虚拟交换实例),VTEP上为一个VXLAN网络提供二层交换服务的虚拟交换实例。VSI可以看作是VTEP上的一台基于VXLAN进行二层转发的虚拟交换机。
一个 VTEP 上可以创建多个 VSI。一个 VSI 与一个 VXLAN 网段(VNI)一一对应。不过我们在以后的描述中,为了叙述的方便,如无特别说明,VTEP 指的是 一个 VTEP 上对应的 VSI。
下面我们重点描述一下 VTEP。
VTEP,有几个功能,如图所示:
图3 VTEP 功能示意图
图中,VM1,VM2,属于同一个 VXLAN,VNI = 100;VM3,VM4 属于 VNI = 200。VM1 发送报文给 VM2。
当 VM1 发送的报文到达 VTEP1 后,VTEP1 会做两件事情:
(1)封装为 VXLAN 报文
(2)三层转发到 VTEP2
当 VTEP2 接收到 VTEP1 发送过来的报文后,VTEP2 会做两件事情:
(1)解封装,还原为原始报文(VM1 发送的原始报文)
(2)转发到 VM2。
所以我们总结一下 VTEP 的几个功能:
l 封装/解封装 VXLAN
l VXLAN 报文转发(图中对应的是“普通 L3 接口(UDP)”)
l 普通二层报文转发(图中对应的是“普通 L2 接口(比如 VLAN)”)
这里特别说明一下,“普通二层转发”,通过 VLAN 转发也可以,没有 VLAN,就是普通的 MAC 转发也可以,只是现在好像都习惯添加一个 VLAN。
具体到 OVS(或者其他 VTEP 应该也是这样的),这个 VLAN 是 OVS 自己分配的(需要给 OVS 分配一个 VLAN 范围),它只是把一个 HOST 内的 VM,属于同一个 VNI 的,分配为相同的 VLAN ID 即可。前段时间,有童鞋问我:VNI 的范围是 16M,而 VLAN ID 的范围只有 4K,这也没法映射啊。我们讲,在一个 HOST 内的 VM 是有限的,至少目前的技术来讲,远远小于 4K,所以这个映射是可以的。
在上述的介绍中,我们忽略了几个问题:(1)具体的报文格式到底是什么?(2)VM1 发送报文给 VM2,它是如何知道 VM2 的 MAC 地址的?(3)VTEP1 怎么知道是将报文转发给 VTEP2 的,而不是其他 VTEP?
这些问题,我们将在下面的章节讲述。
3.8.3 VXLAN 的转发
转发有两个重要的步骤:转发表的查找(决定从哪个接口转发出去),报文的封装和转发。转发表的查找本身并不复杂,但是转发表涉及控制层面(转发表如何构建),所以这个我们放到下一小节再讲述。这一小节主要讲述报文的封装(即 VXLAN 报文格式)和转发。
3.8.3.1 VXLAN 报文格式
前面 VXLAN 概念模型中,简单讲述了 VXLAN 报文格式,我们这里重贴一下:
图4 VXLAN 报文结构示意图
这里面这些外层的“链路层 Header、IP 层 Header、UDP Header”,其报文结构就是普通的 TCP/IP 报文结构,没有什么特别的,关键是里面的字段的赋值,应该赋何值。
为了能更清晰的讲述,我们先给出一个简化的 VXLAN 转发示意图:
图5 VXLAN 转发示意图
我们基于这张图,分别描述 VXLAN 封装的几个报文结构:Outer 链路层 Header、Outer IP 层 Header、Outer UDP Header、VXLAN Header。
3.8.3.1.1 Outer Ethernet Header
直接上图:
字段 |
位数(bit) |
含义 |
备注 |
Dst. MAC Addr. |
48 |
目的 MAC 地址,在图中,就是路由器 R 的 MAC 地址。 |
|
Src. MAC Addr. |
48 |
源 MAC 地址,在图中,就是 VTEP1 的 MAC 地址。 |
|
TPID |
16 |
Tag Protocol ID,标签协议标识,其值为0x8100时表示802.1Q/802.1P的帧 |
|
User Priority |
3 |
User Priority,表示帧的优先级,取值范围0~7,值越大优先级越高,用于802.1P |
图中用“U”标识 |
CFI |
1 |
CFI,值为0代表MAC地址是以太帧的MAC,值为1代表MAC地址是FDDI、令牌环网的帧。 |
图中用“C”标识 |
VID |
12 |
表示VLAN的值。12bit共可以表示4096个VLAN,实际上,由于VID 0和4095被802.1Q协议保留,所以VLAN的最大个数是4094(1-4094)个 |
|
Ethernet Type |
16 |
部分 Ethernet Type 枚举如下: 0x080: IPv4 0x0806:ARP 0x8100:EEE 802.1Q 0x86DD:IPv6 0x 8864:PPPoE |
表1 Outer Ethernet Header 报文结构
说明:VLAN TAG:4字节,包含2个字节的标签协议标识(TPID)和2个字节的标签控制信息(TCI),TCI字段具体又分为: User Priorty、CFI、Vlan ID。VLAN TAG 是可选字段。
3.8.3.1.2 Outer IPv4 Header
是的,这是 IPv4,不是 IPv6!我们直接上图:
字段 |
位数(bit) |
含义 |
备注 |
Version |
4 |
IP 版本号,0100表示IPv4,0110表示IPv6 |
|
IHL |
4 |
Internet Header Length,就是这个 IPv4 Header 的长度(长度单位是 4 byte)。如果 IPv4 Header 没有可选项(图中没有画出可选项),那么 IHL = 5(即 5 * 4 = 20 bytes。您可以数一数,上图中的长度,就是 20 bytes) |
|
TOS |
8 |
Type of Servcie,服务类型,表明服务质量特征。笔者不再啰嗦,读者如果感兴趣,可以参阅后面笔者给出的参考资料。 |
|
Total Length |
16 |
整个 IP 数据报的长度(含 IP Header,不含前面的 Ethernet Header),长度单位是 byte |
|
Identification |
16 |
唯一地标识主机发送的每一份数据报文 |
|
Flags |
3 |
感兴趣的童鞋,请阅读参考资料,笔者在这里就不刷屏了 |
|
Fragment Offset |
13 |
同上 |
|
TTL |
8 |
同上 |
|
Protocol |
8 |
指明IP层所封装的上层协议类型,如ICMP(1)、IGMP(2) 、TCP(6)、UDP(17)等。 |
|
Header Checksum |
16 |
是根据IP头部计算得到的校验和码 |
|
Src. IP |
32 |
源 IP,这里指的是 VTEP1 的 IP 地址(1.1.1.1) |
|
Dst. IP |
32 |
目的 IP,这里指的是 VTEP2 的 IP 地址(2.2.2.1) |
表2 Outer IPv4 Header 报文结构
3.8.2.1.3 Outer UDP Header
直接上图:
字段 |
位数(bit) |
含义 |
备注 |
Src. Port |
16 |
源端口号。RFC7348 推荐了这个源端口号的赋值(计算)方法,笔者不以为然,觉得太啰嗦。不过笔者还是把这一段贴出来吧,请您字节判断:It is recommended that the UDP source port number be calculated using a hash of fields from the inner packet --one example being a hash of the inner Ethernet frame's headers. This is to enable a level of entropy for the ECMP/load-balancing of the VM-to-VM traffic across the VXLAN overlay. When calculating the UDP source port number in this manner, it is RECOMMENDED that the value be in the dynamic/private port range 49152-65535 |
|
Dst. Port |
16 |
这个是专门向 IANA(The Internet Assigned Numbers Authority,互联网数字分配机构) 申请的一个端口号 4789,专门标识是 VXLAN。 |
|
UDP Length |
16 |
UDP 报文长度(含 UDP Header, 不包含前面的 Ethernet Header 和 IP Header),长度单位是 byte。 |
|
UDP Checksum |
16 |
简单理解,直接填0即可。也可以真的计算这个校验和,具体请参考 RFC7348 |
3.8.2.1.4 VXLAN Header
直接上图:
字段 |
位数(bit) |
含义 |
备注 |
RI |
8 |
RRRRIRRR:I 必须为1,表示 VNI 字段是一个有效的 VNI;R 必须为0,暂时没啥用。 |
|
Reserved |
24 |
保留字段,必须为0 |
|
VNI |
24 |
费了半天劲,就是为了这个字段,表示一个 VXLAN 网段。 |
|
Reserved |
8 |
保留字段,必须为0 |
3.8.2.1.5 VXLAN 报文格式小结
前面介绍了 VXLAN 报文的封装,这些报文封装,可以简单地理解(不是很精确,但是方便记忆)为:源 IP 是本端 VTEP,目的 IP 是对端 VTEP,再加上一个 VNI,欧了!
VXLAN 报文封装以后,再把原来的报文放在后面,即可。
3.8.3.2 VXLAN 的报文转发
我们前面已经介绍过 VXLAN 的报文转发,这里再简单重复一下,如下图所示:
VTEP1 接到 VM1 发送给 VM2 的报文后,做几件事情:
(1)查表(图中,给出了 VTEP 二层转发表的一个事宜):(a)判断两个家伙(VM1,VM2)是不是属于一个 VNI(不是的话,就 drop 这个报文);(b)查到对端 VTEP 的 IP 地址
(2)封装:如图所示,封装为 VXLAN 报文
(3)转发:根据对端 VTEP IP 地址,走三层转发(这个时候还需要查找路由表,不过这个不在本章节范围内,略过不表)
VTEP2 接到 VTEP1 转发过来(中间经过了 L3 Network)的报文后,做几件事情:
(1)解封装
(2)根据普通的二层转发(MAC/VLAN 转发),转发给 VM2。
3.8.4 VXLAN 的“控制面”
我们在上一小节提到了查表:查找二层转发表。这个二层转发表是如何构建的呢?这就涉及到了VXLAN 的“控制面”:“控制面”负责构建这个二层转发表。
但是,我将这个“控制面”打了引号,那是因为,VXLAN 构建这个二层转发表的方法有几种,并不完全都是经过控制面(这个时候,控制面没有打引号)来构建的。这些方法有:
(1)通过数据面学习(这就不是控制面板)
(2)通过 MP-BGP(EVPN)通告,这个是独立的控制面。不过抱歉,这个我们不在本章介绍,留待下一章“EVPN”再介绍
(3)通过那个啥都能“SDN”,这个也是一个独立的控制面。同样抱歉,这个放到以后相关章节再介绍。
本文只介绍 VXLAN 如何通过数据面进行二层转发表的构建。我们以一个具体的例子来讲述这个过程。例子的组网图,如下图所示:
图中,VM1,VM2,VM3,分别通过 VTEP1,VTEP2,VTEP3,构建为一个 VXLAN 网段,VNI = 100。三个虚拟机的 IP 地址如图所示,都在一个 subnet(10.1.1.0/24)。现在 VM1 要与 VM2 通信。
另外补充说明:VTEP知道自己都在一个 VNI = 100 的 VXLAN 网段中,并且 VTEP 知道它下挂的哪些 VM 在这个 VNI 中,这些都是靠“人工”配置的(有的通过命令行,有的通过函数调用,不细究,反正是“人工”配置,没办法自己学习。)
VM1 要与 VM2 通信,前提条件:VM1 知道 VM2 的 IP地址——IP 地址都不知道,那就不聊了。
VM1 与 VM2 通信的第一个问题是:VM2 的 MAC 地址是啥?呵呵,一上来就懵逼,^_^。
VM1 解决这个问题的方法,就是采用正常的 ARP。
(1)VM1 把这个 ARP 报文发给 VTEP1,VTEP1 做两件事情:
l VTEP1 通过这个 ARP 报文,学习到了 VM1 的 MAC 地址(呵呵,很鸡贼啊,^_^)
l VTEP1 将这个 ARP 报文,进行 VXLAN 封装(参见前面章节),分别转发到 VTEP2 和 VTEP3(这种行为叫头端复制)。
上述两个过程如下图所示:
(2)VTEP3 接到 VTEP1 转发过来的 ARP(经过 VXLAN 封装) 报文后,做如下几件事情:
l 解封装
l 发现是 ARP 报文,顺便学习一下 VM1 的 MAC 地址,^_^
l 将原始的 ARP 报文转发给其下挂的虚拟机,VM3
(3)VM3 收到进过千山万水转发过来的原始 ARP 报文后:
l 发现是 ARP 报文,顺便学习一下 VM1 的 MAC 地址,^_^
l 发现 IP 地址不是自己,丢弃这个报文
(4)VTEP2 接到 VTEP1 转发过来的 ARP(经过 VXLAN 封装) 报文后,做如下几件事情:
l 解封装
l 发现是 ARP 报文,顺便学习一下 VM1 的 MAC 地址,^_^
l 将原始的 ARP 报文转发给其下挂的虚拟机,VM2
(5)VM2 收到进过千山万水转发过来的原始 ARP 报文后:
l 发现是 ARP 报文,顺便学习一下 VM1 的 MAC 地址,^_^
l 发现 IP 地址是自己,应答这个 ARP
(6)VTEP2 收到这个 ARP 应答报文后,做如下几件事情:
l 学习到 VM2 的 MAC 地址
l 封装,转发给 VTEP1
以上过程,如下图所示:
(7) VTEP1 收到 VTEP2 转发过来的 ARP reply 报文后,做如下几件事情:
l 解封装
l 发现是 ARP Reply报文,顺便学习一下 VM2 的 MAC 地址,^_^
l 将原始的 ARP Reply 报文转发给其下挂的虚拟机,VM1
(8)VM1 收到 转发过来的 VM2 的 ARP Reply 报文,就学习到了 VM2 的 MAC 地址。
以上过程,如下图所示:
通过以上过程,我们看到:
l VTEP1,VTEP2,VTEP3,学习到了 VM1 的 MAC 地址
l VTEP2,VTEP3,学习到了 VM1 MAC 地址所对应的 VTEP(VTEP1)
l VTEP1,VTEP2 学习到了 VM2 的 MAC 地址
l VTEP1 学习到了 VM2 MAC 地址所对应的 VTEP(VTEP2)
l VM2,VM3 学习到了 VM1 的 MAC 地址
l VM1 学习到了 VM2 的 MAC 地址
这就是 VXLAN 通过数据面的学习(也叫 flood & learning,也叫 source mac learning),而达到“控制面”的功能
最后补一句,或者补一刀:很多数据中心,都不允许这种方式进行 MAC 地址学习!不允许!
所以,SDN 或者 MP-BGP(EVPN) 还是必要的,这个我们留待后面的章节描述!