vxlan 协议

vxlan 协议原理简介

1. vxlan 简介

VXLAN 全称是 Virtual eXtensible Local Area Network,虚拟可扩展的局域网。它是一种 overlay 技术,经过三层的网络来搭建虚拟的二层网络。rfc7348 (参考资料1) 上的介绍是这样的:php

A framework for overlaying virtualized layer 2 networks over lay 3 networks.html

每个技术出来都有它要解决的问题,VXLAN 也不例外,那么咱们先看看 VXLAN 到底要解决哪些问题。git

  • 虚拟化(虚拟机和容器)的兴起使得一个数据中心会有成千上万的机器须要通讯,而传统的 VLAN 技术只能支持 4096 个网络上限,已经知足不了不断扩展的数据中心规模
  • 愈来愈多的数据中心(尤为是公有云服务)须要提供多租户的功能,不一样用户之间须要独立地分配 ip 和 MAC 地址,如何保证这个功能的扩展性和正确性也是一个待解决的问题
  • 云计算业务对业务灵活性要求很高,虚拟机可能会大规模迁移,并保证网络一直可用,也就是大二层的概念。解决这个问题同时保证二层的广播域不会过度扩大,也是云计算网络的要求

传统二层+三层的网络在应对这些要求时变得力不从心,虽然不少改进型的技术好比堆叠、SVF、TRILL 等可以增长二层的范围,努力改进经典网络,可是要作到对网络改动小同时保证灵活性高却很是困难。github

为了解决这些问题,有不少方案被提出来,vxlan 就是其中之一。vxlan 是 VMware、Cisco 等一众大型企业共同推出的,目前标准文档在 RFC7348markdown

2. VXLAN 模型

vxlan 这类隧道网络的一个特色是对原有的网络架构影响小,原来的网络不须要作任何改动,在原来网络基础上架设一层新的网络。网络

vxlan 天然会引入一些新的概念,这部分就讲讲它们。下面这张图 是 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 头部)用来在底层网路上传输报文。post

从这个报文中能够看到三个部分:

  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 字段,其余的保留字段主要是为了将来的扩展,目前留给不一样的厂商用这些字段添加本身的功能。

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 报文广播给主机
  4. 主机接收到 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 就能发送报文时直接查询并添加头部,不须要多播去满网络地问了。

通常状况下,在每一个 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 网络,那么全部的这些都要从新学习,时间和人力成本必然会大大提升。

6. 参考资料

相关文章
相关标签/搜索