深入浅出 VXLAN


概述

如果大家有做网络或者云计算相关的,大家应该都知道VXLAN以及SDN技术,在之前VPC相关技术、概念和一些技术方案。今天着重来记录一下博主对VXLAN新的理解和知识总结。任何一个技术的出现都不是偶然的,都是需要用它来解决技术问题。 VxLan

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

为什么需要vxlan

因为在虚拟化技术没有出现之前,默认采用的三层数据中心的架构。为了应付客户端-服务器应用程序的纵贯式大流量,同时使网络管理员能够对流量流进行管理test。在该架构下通常采用STP(生成树协议),来优化客户端到服务器的路径和支持连接冗余,将二层网络的范围限制在网络接入层以下,避免出现大范围的二层广播域。随着云计算概念的提出和虚拟化技术的出现,有几个最典型的技术和业务需求:

  • 虚拟机动态迁移:客户要求虚拟机迁移的范围越来越大,甚至是跨越不同地域、不同机房之间的迁移。大二层网络环境
  • 客户虚拟机数量的增多,网络隔离能力的限制(多租户的隔离)。主流的网络隔离技术是VLAN或VPN(Virtual Private Network),但是有以下缺陷: 1.VLAN Tag域只有12比特,仅能表示4096个VLAN,无法满足大二层网络中标识大户群的需求。 2.传统二层网络中的VLAN/VPN无法满足网络动态调整的需求。

为什么需要在大二层网络环境处理?为什么保证IP和MAC不变? 业务角度:对业务透明且不能中断,对用户来说是无感知的。 技术角度:由于要保证MAC和IP不变才能使得业务会话保持不变,由于MAC地址是二层网络,即依据mac地址进行寻址。 成本角度:vxlan 这类隧道网络的一个特点是对原有的网络架构影响小,原来的网络不需要做任何改动,在原来网络基础上架设一层新的网络

针对上述的问题,vxlan是如何解决的呢? 1.解决虚拟机规模受网络规格限制 VXLAN将虚拟机发出的数据包封装在UDP中,并使用物理网络的IP/MAC地址作为外层头进行封装,对网络只表现为封装后的参数。因此,极大降低了大二层网络对MAC地址规格的需求。 2.解决针对网络隔离能力限制 VXLAN引入了类似VLAN ID的用户标识,称为VXLAN网络标识VNI(VXLAN Network ID),由24比特组成,支持多达16M((2^24-1)/1024^2)的VXLAN段,从而满足了大量的用户标识。 3.针对虚拟机迁移范围受网络架构限制 通过VXLAN构建大二层网络,保证了在虚拟迁移时虚拟机的IP地址、MAC地址等参数保持不变,具体标准文档vxlan

vxlan模型

下图我取自网络来源的基本的VxLan模型,

  • VXLAN(Virtual eXtensible Local Area Network) 一种网络虚拟化技术,通过将VM或物理服务器发出的数据包封装在UDP中,并使用物理网络的IP/MAC作为报文头进行封装,然后在IP网络上传输,到达目的地后由隧道终结点解封装并将数据发送给目标虚拟机或物理服务器。
  • NVE(Network Virtual Endpoint) 网络虚拟边缘节点NVE,是实现网络虚拟化功能的网络实体。报文经过NVE封装转换后,NVE间就可基于三层基础网络建立二层虚拟化网络。
  • VTEP(VXLAN Tunnel Endpoints) VTEP是VXLAN隧道端点,封装在NVE中,用于VXLAN报文的封装和解封装。
  • VNI(VXLAN Network Identifier) VNI 是每个 vxlan 的标识,是个 24 位整数,一共有 2^24 = 16,777,216(一千多万),一般每个 VNI既可以对应一个租户也可以对应一个subnet,不同VXLAN段的虚拟机不能直接二层相互通信。

VM之间的通信模式主要有3种:同VNI下的不同VM,不同VNI下的跨网访问,VXLAN和非VXLAN之间的访问。介于此,VXLAN网关分为二层网关和三层网关。

  • 位于同一网段的终端用户通信,二层网关收到用户报文后,根据报文中包含的目的MAC类型。 1.MAC地址为(broadcast&unknown-unicast&multicast,广播&未知单播&组播)地址,按照 BUM报文转发流程进行处理。 2.MAC地址为已知单播地址,按照已知单播报文转发流程进行处理。
  • 三层网关,用于非同一网段的终端用户通信或VXLAN和非VXLAN用户间的通信。 L3网关分为集中式网关和分布式网关。集中式网关,南北向/东西向的流量都需要经过网关,本地跨子网流量也通过集中式网关进行转发,流量迂回。分布式网关,跨子网流量也是最优路径转发,只有南北向的流量压力,没有东西向的流量压力。

详细内容请看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:标志位
    • 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 报文需要如下信息:

  • 内层报文:通信的虚拟机双方要么直接使用 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协议比原始报文多50字节的内容,这会降低网络链路传输有效数据的比例。vxlan头部最重要的是VNID字段,其他的保留字段主要是为了未来的扩展,目前留给不同的厂商用这些字段添加自己的功能。

vxlan 通信

多播

每个多播组对应一个多播IP地址,往这个多播IP地址发送的报文会发给多播组的所有主机。为什么要使用多播?因为vxlan的底层网络是三层的,广播地址无法穿越三层网络,要给vxlan 网络所有vtep发送报文只能通过多播。 比如机器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 所在的节点都会有一个 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 架构,也是目前使用最广泛的方式。

总结

由于在做VPC产品时,VPC产品也是我一个人从需求调研、技术调研、实现以及发布等,本人对云计算网络还有些不足和认知少些,文章中的内容大多为博主通过网络收集整理而来,主要是记录自己的学习和提高自己的认知,主要是为了学习。 参考

华为vxlan技术介绍,华为vxlan写的一篇不错的文章,建议大家都可以看一下。 vxlan协议概述,部分截图和内容也来源于该篇博客,图中的例子也是照搬下来的个人觉得对理解vxlan通信非常有帮助,特别是vxlan的报文协议概述,简单明了对我理解vxlan帮助很大,可以看出博主内功深厚。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android机动车

计算机网络概念和结构

11410
来自专栏前端黑板报

HTTP2基础教程-读书笔记(一)

《HTTP/2基础教程》到手之后,用了两天时间把它粗略的看完了,大致知道了HTTP/2中的一些概念以及诞生的背景,现在再重读一遍同时做一些笔记。此书适合作为自己...

39070
来自专栏FreeBuf

基于bro的计算机入侵取证实战分析

什么是计算机入侵取证 计算机取证是运用计算机及其相关科学和技术的原理和方法获取与计算机相关的证据以证明某个客观事实的过程。它包括计算机证据的确定、收集、保护、分...

53030
来自专栏SDNLAB

你所了解的三层交换机,是这样工作的

为什么我们说三层交换机的三层转发性能要比路由器的效率要高的多?有时候在很多书里会提及到现在路由器的软件做的也非常强大,几乎也能够达到限速转发的能力;但是软件能够...

43780
来自专栏java 成神之路

路由器 和 交换机 傻傻分不清楚

31420
来自专栏Youngxj

评论框加上勾勾防止垃圾评论-emlog

17540
来自专栏aCloudDeveloper

从 Bridge 到 OVS,探索虚拟交换机

Linux Bridge 和物理网络一样,虚拟网络要通信,必须借助一些交换设备来转发数据。因此,对于网络虚拟化来说,交换设备的虚拟化是很关键的一环。 上文「网络...

49260
来自专栏进击的程序猿

The Clean Architecture in PHP 读书笔记(九)

这是clean architecture的第9篇,也是具体案例的第一篇,本篇开始将会运用之前学到的知识,来构建一个小型的php应用。

9920
来自专栏DeveWork

JGulp: 利用Gulp 配置的前端项目自动化工作流

商业竞争时代的Web 开发,效率越来越成为其中决胜的关键因素之一。在前几年的时候,前端是一片荒芜的待开垦之地,开发者更多考虑开阔更多技术疆域;而最近几年,在前端...

239100
来自专栏Golang语言社区

IM即时通讯实现原理

即时通讯(Instant Messenger,简称IM)软件多是基于TCP/IP和UDP进行通讯的,TCP/IP和UDP都是建立在更低层的IP协议上的两种通讯传...

2K80

扫码关注云+社区

领取腾讯云代金券