热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Overlay技术之VXLAN详解(二)

一、VXLAN的基础概念图1VXLAN转发模型看图我们可以看到出现了几个传统网络中并没有的元素:1、VTEP(VXLANTunnelEndpoints

一、VXLAN的基础概念

图1 VXLAN转发模型
在这里插入图片描述
看图我们可以看到出现了几个传统网络中并没有的元素:
1、VTEP(VXLAN Tunnel Endpoints,VXLAN隧道端点)
VTEP是VXLAN隧道端点,封装在NVE中,用于VXLAN报文的封装和解封装。
VTEP是在Underlay网络创建的,是一个IP地址,一般是Loopback地址。
VXLAN报文中源IP地址为本节点的VTEP地址,VXLAN报文中目的IP地址为对端节点的VTEP地址,一对VTEP地址就对应着一个VXLAN隧道。

2、VNI(VXLAN Network Identifier,VXLAN 网络标识符)
VXLAN网络标识VNI类似VLAN ID,用于区分VXLAN段,不同VXLAN段的虚拟机不能直接二层相互通信。
一个VNI表示一个租户,即使多个终端用户属于同一个VNI,也表示一个租户。VNI由24比特组成,支持多达16M的租户。
在分布式网关部署场景下,VNI分为二层VNI和三层VNI:
二层VNI是普通的VNI,以1:1方式映射到广播域BD,实现VXLAN报文同子网的转发。
三层VNI和VPN实例进行关联,用于VXLAN报文跨子网的转发。

3、VXLAN隧道
“隧道”是一个逻辑上的概念,它并不新鲜,比如大家熟悉的GRE。说白了就是将原始报文“变身”下,加以“包装”,好让它可以在承载网络(比如IP网络)上传输。从主机的角度看,就好像原始报文的起点和终点之间,有一条直通的链路一样。而这个看起来直通的链路,就是“隧道”。顾名思义,“VXLAN隧道”便是用来传输经过VXLAN封装的报文的,它是建立在两个VTEP之间的一条虚拟通道。


二、 建立VXLAN隧道


1、 哪些VTEP间需要建立VXLAN隧道

图2-1 建立VXLAN隧道示意图

【华为悦读汇】技术发烧友:认识VXLAN-1347521-6

如图2-1所示,网络中存在多个VTEP,那么这其中哪些VTEP间需要建立VXLAN隧道呢?

如前所述,通过VXLAN隧道,“二层域”可以突破物理上的界限,实现大二层网络中VM之间的通信。所以,连接在不同VTEP上的VM之间如果有“大二层”互通的需求,这两个VTEP之间就需要建立VXLAN隧道。换言之,同一大二层域内的VTEP之间都需要建立VXLAN隧道。

例如,假设图3-1中VTEP_1连接的VM、VTEP_2连接的VM以及VTEP_3连接的VM之间需要“大二层”互通,那VTEP_1、VTEP_2和VTEP_3之间就需要两两建立VXLAN隧道,如图2-2所示。

图2-2 建立VXLAN隧道示意图

【华为悦读汇】技术发烧友:认识VXLAN-1347521-7


2、 什么是“同一大二层域”

前面提到的“同一大二层域”,就类似于传统网络中VLAN(虚拟局域网)的概念,只不过在VXLAN网络中,它有另外一个名字,叫做Bridge-Domain,简称BD。

我们知道,不同的VLAN是通过VLAN ID来进行区分的,那不同的BD是如何进行区分的呢?其实前面已经提到了,就是通过VNI来区分的。对于CE系列交换机而言,BD与VNI是1:1的映射关系,这种映射关系是通过在VTEP上配置命令行建立起来的。配置如下:


bridge-domain 10 //表示创建一个“大二层广播域”BD,其编号为10

vxlan vni 5000 //表示在BD 10下,指定与之关联的VNI为5000


VTEP会根据以上配置生成BD与VNI的映射关系表,该映射表可以通过命令行查看,如下所示:
在这里插入图片描述

有了映射表后,进入VTEP的报文就可以根据自己所属的BD来确定报文封装时该添加哪个VNI。那么,报文根据什么来确定自己属于哪个BD呢?


3、 如何确定报文属于哪个BD

这里要先澄清下,VTEP只是交换机承担的一个角色而已,只是交换机功能的一部分。也就是说,并非所有进入到交换机的报文都会走VXLAN隧道(也可能报文就是走普通的二三层转发流程)。所以,我们在回答“如何确定报文属于哪个BD”之前,必须先要回答“哪些报文要进入VXLAN隧道”。

3.1 哪些报文要进入VXLAN隧道
回答这个问题之前,不妨先让我们想下VLAN技术中,交换机对于接收和发送的报文是如何进行处理的。我们知道,报文要进入交换机进行下一步处理,首先得先过接口这一关,可以说接口掌控着对报文的“生杀大权”。传统网络中定义了三种不同类型的接口:Access、Trunk、Hybrid。这三种类型的接口虽然应用场景不同,但他们的最终目的是一样的:一是根据配置来检查哪些报文是允许通过的;二是判断对检查通过的报文进行怎样的处理。

其实在VXLAN网络中,VTEP上的接口也承担着类似的任务,只不过在CE系列交换机中,这里的接口不是物理接口,而是一个叫做“二层子接口”的逻辑接口。类似的,二层子接口主要做两件事:一是根据配置来检查哪些报文需要进入VXLAN隧道;二是判断对检查通过的报***怎样的处理。下面我们就来看下,二层子接口是如何完成这两件事的。

在二层子接口上,可以根据需要定义不同的流封装类型(类似于传统网络中不同的接口类型)。CE系列交换机目前支持三种不同的流封装类型,分别是dot1q、untag和default,它们各自对报文的处理方式如表3-1所示。有了这张表,你就能明白哪些报文要进VXLAN隧道了。

表3-1 不同流封装类型的接口对报文的处理方式

在这里插入图片描述
注: VXLAN隧道两端二层子接口的配置并不一定是完全对等的。正因为这样,才可能实现属于同一网段但是不同VLAN的两个VM通过VXLAN隧道进行通信。

3.2 二层子接口加入BD

看了上面的描述,再来回答“如何确定报文属于哪个BD”就非常简单了。其实,只要将二层子接口加入指定的BD,然后根据二层子接口上的配置,就可以确定报文属于哪个BD啦!

比如图3-1所示的组网,我们可以分别在VTEP的两个物理接口10GE 1/0/1和10GE 1/0/2上配置不同流封装类型的二层子接口并将其分别加入不同的BD。

图3-1 二层子接口加入BD

【华为悦读汇】技术发烧友:认识VXLAN-1347521-9

基于二层物理接口10GE 1/0/1,分别创建二层子接口10GE 1/0/1.1和10GE 1/0/1.2,且分别配置其流封装类型为dot1q和untag。配置如下:


interface 10GE1/0/1.1 mode l2 //创建二层子接口10GE1/0/1.1

encapsulation dot1q vid 10 //只允许携带VLAN Tag 10的报文进入VXLAN隧道

bridge-domain 10 //报文进入的是BD 10


interface 10GE1/0/1.2 mode l2 //创建二层子接口10GE1/0/1.2

encapsulation untag //只允许不携带VLAN Tag的报文进入VXLAN隧道

bridge-domain 20 //报文进入的是BD 20


基于二层物理接口10GE 1/0/2,创建二层子接口10GE 1/0/2.1,且流封装类型为default。配置如下:


interface 10GE1/0/2.1 mode l2 //创建二层子接口10GE1/0/2.1

encapsulation default //允许所有报文进入VXLAN隧道

bridge-domain 30 //报文进入的是BD 30


此时你可能会有这样的疑问,为什么要在10GE 1/0/1上创建两个不同类型的子接口?是否还可以继续在10GE 1/0/1上创建一个default类型的二层子接口?换句话说,用户应该如何选择配置哪种类型的二层子接口?三种类型的二层子接口之间,是否存在配置约束关系?

3.3 各类型二层子接口的应用场景
我们先来解答下是否可以在10GE 1/0/1上再创建一个default类型的二层子接口。答案是不可以。其实根据表3-1的描述,这一点很容易理解。因为default类型的二层子接口允许所有报文进入VXLAN隧道,而dot1q和untag类型的二层子接口只允许某一类报文进入VXLAN隧道。这就决定了,default类型的二层子接口跟其他两种类型的二层子接口是不可以在同一物理接口上共存的。否则,报文到了接口之后如何判断要进入哪个二层子接口呢。所以,default类型的子接口,一般应用在经过此接口的报文均需要走同一条VXLAN隧道的场景,即下挂的VM全部属于同一BD。例如,图3-3中VM3和VM4均属于BD 30,则10GE 1/0/2上就可以创建default类型的二层子接口。

再来看下为什么可以在10GE 1/0/1上分别创建dot1q和untag类型的二层子接口。如图3-3所示,VM1和VM2分别属于VLAN 10和VLAN 20,且分别属于不同的大二层域BD 10和BD 20,显然他们发出的报文要进入不同的VXLAN隧道。如果VM1和VM2发出的报文在到达VTEP的10GE 1/0/1接口时,一个是携带VLAN 10的Tag的,一个是不携带VLAN Tag的(比如二层交换机上行连接VTEP的接口上配置的接口类型是Trunk,允许通过的VLAN为10和20,PVID为VLAN 20),则为了区分两种报文,就必须要在10GE 1/0/1上分别创建dot1q和untag类型的二层子接口。所以,当经过同一物理接口的报文既有带VLAN Tag的,又有不带VLAN Tag的,并且他们各自要进入不同的VXLAN隧道,则可以在该物理接口上同时创建dot1q和untag类型的二层子接口。

当然,现网中可能存在各种不同的组网,小编也不可能一一列举出来。所以在实际应用中,请务必根据组网需求,结合表3-1,合理规划二层子接口的流封装类型。


4、 VXLAN隧道怎么建

现在,我们可以来看下VXLAN隧道是怎么建立起来的了。

一般而言,隧道的建立不外乎手工方式和自动方式两种。

l 手工方式

这种方式需要用户手动指定VXLAN隧道的源和目的IP地址分别为本端和对端VTEP的IP地址,也就是人为的在本端VTEP和对端VTEP之间建立静态VXLAN隧道。

对于CE系列交换机,以上配置是在NVE(Network Virtualization Edge)接口下完成的。配置过程如下:


interface Nve1 //创建逻辑接口NVE 1

source 1.1.1.1 //配置源VTEP的IP地址(推荐使用Loopback接口的IP地址)

vni 5000 head-end peer-list 2.2.2.2

vni 5000 head-end peer-list 2.2.2.3


其中,vni 5000 head-end peer-list 2.2.2.2和vni 5000 head-end peer-list 2.2.2.3的配置,表示属于VNI 5000的对端VTEP有两个,IP地址分别为2.2.2.2和2.2.2.3。根据这两条配置,VTEP上会生成如下所示的一张表:
display vxlan vni 5000 verbose

BD ID : 10State : upNVE : 288Source : 1.1.1.1UDP Port : 4789BUM Mode : head-endGroup Address : - Peer List : 2.2.2.2 2.2.2.3

根据上表中的Peer List,本端VTEP就可以知道属于同一BD(或同一VNI)的对端VTEP都有哪些,这也就决定了同一大二层广播域的范围。当VTEP收到BUM(Broadcast&Unknown-unicast&Multicast,广播&未知单播&组播)报文时,会将报文复制并发送给Peer List中所列的所有对端VTEP(这就好比广播报文在VLAN内广播)。因此,这张表也被称为“头端复制列表”。当VTEP收到已知单播报文时,会根据VTEP上的MAC表来确定报文要从哪条VXLAN隧道走。而此时Peer List中所列的对端,则充当了MAC表中“出接口”的角色。在后面的报文转发流程中,你将会看到头端复制列表是如何在VXLAN网络中指导报文进行转发的。

l 自动方式

自动方式下VXLAN隧道的建立需要借助于其他的协议,例如BGP。CE系列交换机中,自动方式建立VXLAN隧道主要应用在EVN(Ethernet Virtual Network)和VXLAN的分布式网关场景中。本文不对该方式进行详细讲述,具体实现可参考EVN的相关资料。


5 、如何确定报文要进哪条隧道

从前面的描述我们知道,属于同一BD的VXLAN隧道可能不止一条,比如前面的头端复制列表中,同一个源端VTEP(1.1.1.1)对应了两个对端VTEP(2.2.2.2和2.2.2.3)。那就带来了另一个问题,报文到底应该走哪一条隧道呢?

我们知道,基本的二三层转发中,二层转发依赖的是MAC表,如果没有对应的MAC表,则主机发送ARP广播报文请求对端的MAC地址;三层转发依赖的是FIB表。在VXLAN中,其实也是同样的道理。下面就让我们来看下,VXLAN网络中报文的转发流程。相信看完下面的内容,关于“如何确定报文要进哪条隧道”的疑惑也就迎刃而解了。


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • JavaScript和HTML之间的交互是经由过程事宜完成的。事宜:文档或浏览器窗口中发作的一些特定的交互霎时。能够运用侦听器(或处置惩罚递次来预订事宜),以便事宜发作时实行相应的 ... [详细]
  • 本文总结了在编写JS代码时,不同浏览器间的兼容性差异,并提供了相应的解决方法。其中包括阻止默认事件的代码示例和猎取兄弟节点的函数。这些方法可以帮助开发者在不同浏览器上实现一致的功能。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 本文介绍了如何找到并终止在8080端口上运行的进程的方法,通过使用终端命令lsof -i :8080可以获取在该端口上运行的所有进程的输出,并使用kill命令终止指定进程的运行。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 本文讨论了在openwrt-17.01版本中,mt7628设备上初始化启动时eth0的mac地址总是随机生成的问题。每次随机生成的eth0的mac地址都会写到/sys/class/net/eth0/address目录下,而openwrt-17.01原版的SDK会根据随机生成的eth0的mac地址再生成eth0.1、eth0.2等,生成后的mac地址会保存在/etc/config/network下。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 本文总结了初学者在使用dubbo设计架构过程中遇到的问题,并提供了相应的解决方法。问题包括传输字节流限制、分布式事务、序列化、多点部署、zk端口冲突、服务失败请求3次机制以及启动时检查。通过解决这些问题,初学者能够更好地理解和应用dubbo设计架构。 ... [详细]
  • HSRP热备份路由器协议的应用及配置
    本文介绍了HSRP热备份路由器协议的应用及配置方法,包括设计目标、工作原理、配置命令等。通过HSRP协议,可以实现在主动路由器故障时自动切换到备份路由器,保证网络连通性。此外,还介绍了R1和R2路由器的配置方法以及Sw1和Sw2交换机的配置方法,最后还介绍了测试连通性和路由追踪的方法。 ... [详细]
  • {moduleinfo:{card_count:[{count_phone:1,count:1}],search_count:[{count_phone:4 ... [详细]
  • Hadoop2.6.0 + 云centos +伪分布式只谈部署
    3.0.3玩不好,现将2.6.0tar.gz上传到usr,chmod-Rhadoop:hadophadoop-2.6.0,rm掉3.0.32.在etcp ... [详细]
  • 知识图谱表示概念:知识图谱是由一些相互连接的实体和他们的属性构成的。换句话说,知识图谱是由一条条知识组成,每条知识表示为一个SPO三元组(Subject-Predicate-Obj ... [详细]
author-avatar
腾云溪牛_556
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有