vxlan协议原理简介
1. vxlan 简介
VXLAN 全称是 Virtual eXtensible Local Area Network,虚拟可扩展的局域⽹。它是⼀种 overlay 技术,通过三层的⽹络来搭建虚拟的⼆层⽹络。rfc7348 (参考资料1) 上的介绍是这样的:
A framework for overlaying virtualized layer 2 networks over lay 3 networks.
每⼀个技术出来都有它要解决的问题,VXLAN 也不例外,那么我们先看看 VXLAN 到底要解决哪些问题。
虚拟化(虚拟机和容器)的兴起使得⼀个数据中⼼会有成千上万的机器需要通信,⽽传统的 VLAN 技术只能⽀持 4096 个⽹络上限,已经满⾜不了不断扩展的数据中⼼规模
越来越多的数据中⼼(尤其是公有云服务)需要提供多租户的功能,不同⽤户之间需要独⽴地分配 ip 和 MAC 地址,如何保证这个功能的扩展性和正确性也是⼀个待解决的问题
zera云计算业务对业务灵活性要求很⾼,虚拟机可能会⼤规模迁移,并保证⽹络⼀直可⽤,也就是⼤⼆层的概念。解决这个问题同时保证⼆层的⼴播域不会过分扩⼤,也是云计算⽹络的要求
传统⼆层+三层的⽹络在应对这些要求时变得⼒不从⼼,虽然很多改进型的技术⽐如堆叠、SVF、TRILL 等能够增加⼆层的范围,努⼒改进经典⽹络,但是要做到对⽹络改动⼩同时保证灵活性⾼却⾮常困难。
为了解决这些问题,有很多⽅案被提出来,vxlan 就是其中之⼀。vxlan 是 VMware、Cisco 等⼀众⼤型企业共同推出的,⽬前标准⽂档在。
2. VXLAN 模型
vxlan 这类隧道⽹络的⼀个特点是对原有的⽹络架构影响⼩,原来的⽹络不需要做任何改动,在原来⽹络基础上架设⼀层新的⽹络。
be coolvxlan ⾃然会引⼊⼀些新的概念,这部分就讲讲它们。下⾯这张图 是 vxlan 的⼯作模型,它创建在原来的 IP ⽹络(三层)上,只要是三层可达(能够通过 IP 互相通信)的⽹络就能部署 vxlan。在每个端点上都有⼀个 vtep 负责 vxlan 协议报⽂的封包和解包,也就是在虚拟报⽂上封装 vtep 通信的报⽂头部。物理⽹络上可以创建多个 vxlan ⽹络,这些 vxlan ⽹络可以认为是⼀个隧道,不同节点的虚拟机能够通过隧道直连。每个 vxlan ⽹络由唯⼀的 VNI 标识,不同的 vxlan 可以不相互影响。
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 ⽹络的报⽂和通信流程,希望⽂章结束之后再回来看这些概念能明⽩它们的意思。
3. VXLAN 报⽂解析
前⾯说过,vxlan 在三层⽹络上构建⼀个虚拟的⼆层⽹络出来,这⼀点能够在 vxlan 的报⽂上很明显地体现出来。
下图是 vxlan 协议的报⽂,⽩⾊的部分是虚拟机发送报⽂(⼆层帧,包含了 MAC 头部、IP 头部和传输层头部的报⽂),前⾯加了 vxlan 头部⽤来专门保存 vxlan 相关的内容,在前⾯是标准的 UDP 协议头部(UDP 头部、IP 头部和 MAC 头部)⽤来在底层⽹路上传输报⽂。
短语动词从这个报⽂中可以看到三个部分:
1. 最外层的 UDP 协议报⽂⽤来在底层⽹络上传输,也就是 vtep 之间互相通信的基础
2. 中间是 VXLAN 头部,vtep 接受到报⽂之后,去除前⾯的 UDP 协议部分,根据这部分来处理 vxlan 的逻辑,主要是根据 VNI 发送
到最终的虚拟机
3. 最⾥⾯是原始的报⽂,也就是虚拟机看到的报⽂内容
报⽂各个部分的意义如下:
VXLAN header:vxlan 协议相关的部分,⼀共 8 个字节
VXLAN flags:标志位
Rerved:保留位
VNID:24 位的 VNI 字段,这也是 vxlan 能⽀持千万租户的地⽅
Rerved:保留字段
UDP 头部,8 个字节
UDP 应⽤通信双⽅是 vtep 应⽤,其中⽬的端⼝就是接收⽅ vtep 使⽤的端⼝,IANA 分配的端⼝是 4789 IP 头部:20 字节
主机之间通信的地址,可能是主机的⽹卡 IP 地址,也可能是多播 IP 地址
downtown是什么意思MAC 头部:14 字节
主机之间通信的 MAC 地址,源 MAC 地址为主机 MAC 地址,⽬的 MAC 地址为下⼀跳设备的 MAC 地址
可以看出 vxlan 协议⽐原始报⽂多 50 字节的内容,这会降低⽹络链路传输有效数据的⽐例。vxlan 头部最重要的是 VNID 字段,其他的保留字段主要是为了未来的扩展,⽬前留给不同的⼚商⽤这些字段添加⾃⼰的功能。
4. vxlan ⽹络通信过程
通过上节的内容,我们⼤致了解 vxlan 报⽂的发送过程。虚拟机的报⽂通过 vtep 添加上 vxlan 以及外部的报⽂层,然后发送出去,对⽅vtep 收到之后拆除 vxlan 头部然后根据 VNI 把原始报⽂发送到⽬的虚拟机。
上⾯的过程是双⽅已经知道所有通信信息的过程,但是在第⼀次通信之前还有很多问题有解决:
哪些 vtep 需要加到⼀个相同的 VNI 组?
高一英语教学计划发送⽅虚拟机怎么知道对⽅的 MAC 地址?
vtep 怎么知道⽬的虚拟机在哪⼀台宿主机上?
这三个问题可以归结为同⼀个问题:vxlan ⽹络怎么感知彼此的存在并选择正确的路径传输报⽂?
⽽且第⼀个问题也是不⽤回答的,因为 vtep 形成的组是虚构的概念,只有某些 vtep 能够正确地传递报⽂,它们就是在同⼀个组内。也就是说,我们只要回答后⾯两个问题就⾏。
要回答这两个问题,我们还是回到 vxlan 协议报⽂上,看看⼀个完整的 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。
vtep 建⽴的时候会通过配置加⼊到多播组(具体做法取决于实现),图中的多播组 IP 地址是 239.1.1.1。
1. 机器 A 只知道对⽅的 IP 地址,不知道 MAC 地址,因此会发送 ARP 报⽂进⾏查询,内部的 ARP 报⽂很普通,⽬标地址为全 1 的
⼴播地址
2. vtep 收到 ARP 报⽂,发现虚拟机⽬的 MAC 为⼴播地址,封装上 vxlan 协议头部之后(外层 IP 为多播组 IP,MAC 地址为多播组
的 MAC 地址),发送给多播组 239.1.1.1,⽀持多播的底层⽹络设备(交换机和路由器)会把报⽂发送给组内所有的成员
3. vtep 接收到 vxlan 封装的 ARP 请求,去掉 vxlan 头部,并通过报⽂学习到发送⽅ <;虚拟机 MAC - VNI - Vtep IP> 三元组保存起
来,把原来的 ARP 报⽂⼴播给主机
achievement4. 主机接收到 ARP 请求报⽂,如果 ARP 报⽂请求的是⾃⼰的 MAC 地址,就返回 ARP 应答
5. vtep-2 此时已经知道发送放的虚拟机和 vtep 信息,把 ARP 应答添加上 vxlan 头部(外部 IP 地址为 vtep-1 的 IP 地址,VNI 是原
来报⽂的 VNI)之后通过单播发送出去
6. vtep-1 接收到报⽂,并学习到报⽂中的三元组,记录下来。然后 vtep 进⾏解包,知道内部的 IP 和 MAC 地址,并转发给⽬的虚拟
机
7. 虚拟机拿到 ARP 应答报⽂,就知道了到⽬的虚拟机的 MAC 地址
在这个过程中,只有⼀次多播,因为 vtep 有⾃动学习的能⼒,后续的报⽂都是通过单播直接发送的。可以看到,多播报⽂⾮常浪费,每次的多播其实只有⼀个报⽂是有效的,如果某个多播组的 vtep 数量很多,这个浪费是⾮常⼤的。但是多播组也有它的实现起来⽐较简单,不需要中⼼化的控制,只有底层⽹络⽀持多播,只有配置好多播组就能⾃动发现了。
单播报⽂的发送过程就是上述应答报⽂的逻辑,应该也⾮常容易理解了。还有⼀种通信⽅式,那就是不同 VNI ⽹络之间的通信,这个需要⽤到 vxlan ⽹关(可以是物理⽹络设备,也可以是软件),它接收到⼀个 vxlan ⽹络报⽂之后解压,根据特定的逻辑添加上另外⼀个 vxlan 头部转发出去。
因为并不是所有的⽹络设备都⽀持多播,再加上多播⽅式带来的报⽂浪费,在实际⽣产中这种⽅式很少⽤到。
分布式控制中⼼
从多播的流程可以看出来,其实 vtep 发送报⽂最关键的就是知道对⽅虚拟机的 MAC 地址和虚拟机所在主机的 vtep IP 地址。如果能够事先知道这两个信息,直接告诉 vtep,那么就不需要多播了。
在虚拟机和容器的场景中,当虚拟机或者容器启动还没有进⾏⽹络通讯时,我们就可以知道它的 IP 和 MAC(可能是⽤某种⽅式获取,也有可能是事先控制这两个地址),分布式控制中⼼保存了这些信息。除此之外,控制中⼼还保存了每个 vxlan ⽹络有哪些 vtep,这些 vtep 的地址是多少。有了这些信息,vtep 就能发送报⽂时直接查询并添加头部,不需要多播去满⽹络地问了。
5172⼀般情况下,在每个 vtep 所在的节点都会有⼀个 agent,它会和控制中⼼通信,获取 vtep 需要的信息以某种⽅式告诉 vtep。具体的做法取决于具体的实现,每种实现可能会更新不同的信息给 vtep,⽐如 HER(Head End Replication)只是把多播组替换成多个单播报⽂,也就是把多播组所有的 VTEP IP 地址告诉 vtep,这样查询的时候不是发送多播,⽽是给组内每个 vtep 发送⼀个单播报⽂;有些实现只是告诉 vtep ⽬的虚拟机的 MAC 地址信息;有些实现告诉 MAC 地址对应的 vtep IP 地址。
英语竞赛试题此外,什么时候告诉 vtep 这些信息也是有区别的。⼀般有两种⽅式:常见的是⼀旦知道了虚拟机的三元组信息就告诉 vtep(即使某个vtep ⽤不到这个信息,因为它管理的虚拟机不会和这个地址通信),⼀般这时候第⼀次通信还没有发⽣;另外⼀种⽅式是在第⼀次通信时,当 vtep 需要这些信息的时候以
某种⽅式通知 agent,然后 agent 这时候才告诉 vtep 信息。
分布式控制的 vxlan 是⼀种典型的 SDN 架构,也是⽬前使⽤最⼴泛的⽅式。因为它的实现多样,⽽且每种实现都有些许差距,这⾥不便来具体的例⼦来说明,只要明⽩了上⾯的原理,不管是什么样的实现,都能很快上⼿。
5. vxlan ⽹络带来新的问题
vxlan 协议给虚拟⽹络带来了灵活性和扩展性,让云计算⽹络能够像计算、存储资源那样按需扩展,并灵活分布。和计算机领域所有技术⼀样,这也是⼀种 tradeoff,相对于经典⽹络来说,vxlan 主要的问题是它的复杂性和额外的开销。
额外的报⽂和计算
这⼀点可容易看出来,每个 vxlan 报⽂都有额外的 50 字节开销,如果加上 vlan 字段,开销要到 54 字节。这对于⼩报⽂的传输是⾮常昂贵的操作,试想如果某个报⽂应⽤数据才⼏个字节,原来的⽹络头部加上 vxlan 报⽂头部都能有 100 字节的控制信息。
额外的报⽂也带来了额外的计算量,每个 vxlan 报⽂的封包和解包操作都是必须的,如果⽤软件来实现这些步骤,额外的计算量也是不可以忽略的影响。
复杂度
vxlan 另外⼀个缺点是复杂度,虽然经典⽹络在应对云计算时捉紧见拙,但是经典⽹络模型已经发展了很久,所有的部署、监控、运维都⽐较成熟。如果使⽤ vxlan ⽹络,那么所有的这些都要重新学习,时间和⼈⼒成本必然会⼤⼤提⾼。