本章帮助网络工程师或架构师回答如下问题:
- 什么是网络虚拟化?
- 网络虚拟化有哪些用途?
- 网络虚拟化领域内有哪些不同的技术方向?
- 网络虚拟化的控制面有哪些选择?
- 当使用 VXLAN 时如何进行桥接和路由?
什么是网络虚拟化?
网络虚拟化可以让网络运营者将一个物理网络划分为多个互相隔离的虚拟网络。
在分组网络中,每一个虚拟网络总是认为自己拥有以下资源:
- 接口或者链接
- 转发表
- 其他类型的表,比如用于执行强制策略 (例如,接入控制) 以及用于完成其他数据包处理(比如,网络地址转换[NAT])。
- 数据包级缓存以及链路队列
在更高的抽象层级,每一个虚拟网络都认为除了自身没有其他网络的存在。为了允许存在这种幻想,每一个虚拟网络都和其他虚拟网络彼此隔离。为了让拥有所有地址空间的幻想成真,一个数据包转发表会按照多个虚拟网络进行划分。为了确保虚拟网络的流量彼此隔离,要么将一个网络接口完全分配给某一个虚拟网络,要么为共享该链路的每个虚拟网络逻辑地划分出一个接口。
网络虚拟化在数据中心的应用
在当代数据中心,网络虚拟化主要有以下应用场景
- 强制流量经过特定的服务
- 在三层网络上提供二层连接
- 多租户
- 使交换机的管理流量和数据流量分离
强制将流量路由到特定路径上
第一个用例是使用网络虚拟化强制将流量路由到提供特定服务的节点上去。
展示了这种用例的一种典型设计。图6-1(a)展示了外部网络和单一内部网络的物理连接。图6-1(b)展示了通过为外部网络和内部网终创建分离的单一虚拟网终来实现网络隔离。内部网络和外部网络之间的流量必须通过防火墙,因为防火墙是唯一和内部网络及外部网络都有连接的网络节点。图6-1(b)也许看起来像一个传统的防火墙,但是这里的两个边缘路由器实际上是同一台路由器。它的路由表分成两部分,路由器的一侧(内部网络) 并不与另一侧 (外部网络) 直接通信。
如果有多个内部网络,每一个内部网络都和外部网络采取不同的策略进行通信,那么创建多个虚拟网络是针对这种用例的常用的解决方案
当某个需求强制要求流量符合某个策略,即只有特定类别的流量被显式地授权之后才能真正进行节点之间的通信,那么网络虚拟化针对这类用例是很有价值的。
需要二层网络互联的应用程序
云
云本身就是支持多租户的,因为云服务提供商基于通用及共享的计算或网络基础设施来支持多个客户。网络虚拟化是支持此用例的基础技术。
交换机的管理网络和数据网络的分离
在数据中心内,网络虚拟化最普遍的使用方法是交换机管理网络和数据流量分离。每一台交换机都具有一个单独的带外以太网端口,该端口仅用于管理服务器与交换机的通信。例如镜像下载,SSH接入,借助网络自动化技术进行配置,通过 SNMP进行监控这类的交换机管理任务,以及其他解决方案全都是通过这种独立的带外管理网络来进行。此以太网管理端口并不会连接至转发芯片,也不需要利用转发芯片驱动程序来配置交换机。
这是我所遇到过的最普遍的一种运营人员用来管理交换机的方法 (交换机包括路由器或网桥,为了明确起见,这里加以区分) 。数据流量 (即存在于网络上的业务流量) 不会使用这张管理网络。
与管理网络的缺省路由不同,数据流量要求的是另一条缺省路由。一台交换机具有两条不同的缺省路由只能是借助VRF虚拟路由转发实现。
网络虚拟化模型
服务抽象:二层或者三层
传统上网络被划分为七层,但是从网络虚拟化的角度看,仅与二层和三层相关。在三层和三层之上,网络功能与其说是网络虑拟化不如说是一种服务虚拟化。
二层虚拟网络
作为一种二层服务抽象,二层虚拟网络不会对负责数据包路由的网络层做任何假设。二层虚拟网络仅假设包转发会使用二层 (或 MAC) 转发表,并且地址在整个二层网络是唯一的。但一个虚拟二层网络并不需要让IP地址像 MAC 地址一样在整个二层虚拟网络是唯一的。虚拟网络起源于 VLAN (virtual local area network,虚拟局城网),VLAN 提供了一种二层服务抽象。
在传统的桥接网络(包括VLAN)中,STP在整个桥接网络范围内构建单一的生成树用于转发所有包,包括单播包及多目的地址包(未知单播包,多播包以及广播包)。因此单播帧和多目的地址帧使用同样的转发路径。引入 VLAN 之后,通常都会为每个 VLAN 单独创建一个生成树。
三层虚拟网络
作为三层服务的抽象,虚拟三层网络会提供唯一的三层地址。正如在物理网络中一样,虚拟三层网络通常是 IP 网络 (但并非总是如此)。每一个虚拟三层网络会获取一份路由表的副本,并且此副本仅归此虚拟三层网络所有。每一个虚拟网络的路由表的生成方法类似物理网络:要么是预先配置好,要么根据某种协议或网络协议栈动态生成。如果路由表是按照路由协议生成,那么每个虚拟三层网络要么有各自单独的路由协议的实例,要么单个路由协议实例可以区分不同虚拟三层网络的地址这两种模型都很流行且通用。
最常用的虚拟三层网络技术是 VPN。各种 VPN 技术都依赖于支持虚拟三层网络所必需的一种基础抽象,被称为 VRF (Virtual Routing and Forwarding,虚拟路由和转发)。**VRF的主要任务就是为每一个虚拟三层网络提供单独的路由表。**通常由在路由查找表中添加 VRFID 字段来实现。在 VRF的最简单的实现里,VRFID 是来自数据包的接收接口。数据包本身并不提供任何可用于生成 VRFID 的信息。但是,VPN会在数据包中携带 VPN ID。
VPN 后来也发展到可以支持虚拟二层网络。因此,支持虚拟三层网络的 VPN 通常称为 L3VPN,以区别于 L2VPN。
内嵌虚拟网络与 Overlay 虚拟网络
虚拟网络还有另一类重要的分类标准,即虚拟网络是作为内嵌网络实现还是作为Overlay 网络实现。在内嵌模型中,源端和目的端的每一跳都会感知到数据包所属的虚拟网络的存在,并使用这类信息在转发表中做查询。在 Overlay 网络模型中,只有网络的边缘部分会关注虚拟网络,网络的内部并不知道虚拟网络的存在。VLAN和VRF是内嵌模型的例子,然而 MPLS,VXLAN以及其他基于IP的 VPN都是Overlay 网络的例子。
内嵌模型的主要优点是透明以及没有数据包头的开销。但是这种模型需要路径上的每个节点都能感知到虚拟网络的存在,这会使得内嵌模型不易于扩展且低效。内嵌模型之所以低效,是因为在核心网络中,每一台交换机或路由器都必须跟踪每一个虚拟网络以便正确的转发数据包。这种做法非常低效,因为任何对虚拟网络的改动都会影响网络中的每个节点。在网络中,这种行为犹如一台机器中的活动部件一样,如果这类活动部件越多,那引入的错误和造成不确定问题的可能性就越大。任何部署过 VLAN的人都非常清楚这两个问题。VRF 也有同样的问题。
因此,Overlay 虚拟网络更流行,而且在数据中心里人们更倾向于使用它,尤其是需要部署成千上万的虚拟网络的时候。
网络隧道:构建Overlay虚拟网络的基础
建立网络隧道是很简单的:在原始数据包之外再封装一层数据包头。这些额外的数据包头被称为隧道包头,它包含了新的源地址和目的地址,被添加到原始数据包头之前。这时,隧道端点之间的网络并不会感知到隧道包头内所封装的任何信息。另一种理解网络隧道的方式是把网络隧道想象成一条虚拟链路,这条链路利用新增的隧道包头来提供所需的网络抽象。
网络隧道都是被创建成了一个伪装的网络接口
利用图 6-2 来理解一下网络隧道里数据包转发过程。R1,R2 以及 R3 是三台路由器,它们的路由表状态显示在各自上方的方框内。每一个箭头表示路由器会从
一个端口将数据包按照箭头方向发出,并到达与此箭头所代表的路由表项相关联的目的主机。
正如 R2 的路由表所显示的那样,R2 只知道如何将数据包转发到 R1和R3。因此,如图 6-2(a) 所示,当一个源地址是A 且目的地址是 B 的数据包到达R2时,R2 会抛弃掉这个数据包。在图 6-2(b) 中,R1为此数据包添加了一个新的包头,这个包头表示新的数据包以 R3 为目的地址,R1 为源地址。R2 这时就知道如何转发这个新的数据包了。当新的数据包到达 R3 时,R3 除外层包头,并将数据包发送到 B因为 R3 知道如何转发数据包到 B。在 R1和 R3 之间,原数据包被认为是在一条网络隧道中进行传输。一个常见的网络隧道的例子就是使用 VPN。
数据包在 R1,R2和R3 之间传输的行为与 Overlay 虚拟网络很类似。A和B处在一个私有网络中,而核心路由器 R2 并不知道这个私有网络的存在。这就是为什么通
常使用网络隧道来实现 Overlay 虚拟网络的原因。在Overlay 虚拟网络中,隧道的端点(如图6-2中的R1和R3)被称为NVE (network virtualization edge,网络虚拟化端)。入口NVE 代表着虚拟 Overlay 网络的起点(如本例中的R1),它负责添加隧道包头。出口 NVE代表着拟 Overlay 网络的终点(如本例中的 R3),它负责剥离隧道包头。连接 NVE 的网络称为 Underlay 网络。隧道包头也可以携带数据包的虚拟网络 ID。远端隧道端点因此可以将数据包引导至正确的虚拟网络
网络隧道既可以是点对点,也可以使单点对多点。在点对点的隧道中,隧道两端正好各有一个端点。在单点对多点的隧道中,一个入口隧道端点对应多个出口隧道端点。有时在单点对多点隧道中,也有可能某些流量被送至某一个目的主机,看起来像是点对点隧道。三层隧道是典型的点对点隧道,然而二层隧道则两种都有可能。
网络隧道的优点
-
可扩展性
-
避免了设备整个升级
-
简化管理
-
灵活性
Clos 拓扑的不同层级 (主机或 Clos 的最低层) 都和虑拟网络有关,网络隧道在Clos 拓扑的不同层级的灵活性也是显而易见的。一种体现这种灵活性的设计就是如果不是整个网络都需要拟网络,那就让某些专门的 pod支持虚拟网络即可。这种解决方案并不仅仅适用于单个 pod,还能按需扩展到多个 pod,而不需要升级所有网络设备,因为有些网络设备你可能以后还需要用到。
这些优点其实都来自一个设计选择: 只需让网络边缘的设备知道网络隧道的存在,而网络中的其他设备则无需知道。这种设计选择也支持构建网络的基础设施不可变模型。在构建并配置网络之后,不要再做某些改变,未来网络不应该存在因多余的配置变更和新特性而引入的错误。
网络隧道的缺点
数据包负载均衡
一个流大致可以定义为一组具有某些共同属性的数据包。最常见的就是 TCP 或者 UDP 流,它们使用源IP地址,目的IP地址,四层协议 (TCP/UDP) ,四层的源端口以及四层的目的端口组成的五元组来定义。
如果一个节点按照不同的路径转发属于同一个流的数据包,那么这些数据包到达目的主机时的顺序可能会不同于源端主机发送时的顺序。这种数据包的乱序到达会严重影响协议的性能。还有一点也很重要,就是要确保最大效率的利用网络带宽,这里带宽也可以理解为到达目的主机的所有网络路径。
每一个网络节点在决定如何转发数据包时都要考虑到这两种优化从而进行折中。
当一个数据包在网络隧道中传输时,传输或承载节点只能看到隧道包头。它们使用隧道包头来判断数据包属于哪个流。在典型情况下,3 层隧道包头使用不同的 4层协议类型来标识隧道类型 (比如,IP 的 GRE 包头使用IP 协议类型为 47)。如果流量的入口和出口 NVE 都相同,那么这些流量总是具有相同的源地址和目的地址。但是,一个网络隧道通常会传输属于多个流的数据包。流的信息是内嵌在隧道包头里的。现有的网络设备无法看到隧道包头内的信息,所以同一隧道入口和出口端点之间的所有数据包都会按照同样的路径进行转发。因此,网络隧道内的数据包并不能充分利用节点之间的多路径进行传输。这会导致网络带宽利用率的急剧下降。早期的网络很少具备多路径传输能力,所以这种限制不会有什么实际的影响。但是,当代网络,尤其是数据中心网络中的多路径传输是很常见的。因此需要一个方注来解决这类问题
解决这类问题的一个巧妙的方法就是使用 UDP 协议的网络隧道。路由器很早就具备针对 UDP 数据包进行负载均衡的能力。类似TCP,路由器和网桥可以按照同样的路径发送一个 UDP 流的所有数据包。当目的主机的 UDP 端口被用作隧道包头时,它表示隧道类型。隧道包头的源端口字段通常并不使用。因此隧道入口将负荷包头的五元组的哈希值写入源端口字段的位置,以确保属于一个 TCP 流或者 UDP 流的所有数据包的源端口字段被设置为相同的值,这样可以让老式的网络设备最大限度的利用带宽传输隧道内的数据包,而且避免了对负荷数据包的重新排序。LISP(Locator Identity Separation Protocol,位置和标识分离协议)是第一个采用这种技巧的协议。VXLAN 完全借鉴了这个思想。
网卡的行为
在计算节点上,网卡提供了若干增强性能的功能。其中一种功能叫做 TCP 分段卸载(offloading TCP segmentation) ,还有一种叫做 IP,TCP和UDP 层数据包的校验和计算。这些功能都是利用网卡的硬件来实现的,这可以让 CPU 免于执行此类计算密集型的工作。因此,终端主机可以大幅利用较高的带宽收发数据包,同时也不会浪费宝贵的 CPU 计算能力。
额外的数据包封装或者网络隧道使得网卡无法利用上面这些功能。因为网卡不知道该如何解析新增包头之后的数据域,以定位 TCP/UDP/IP 负载或者向隧道的 UDP/IP包头提供领外卸载功能。当隧道技术在终端设备中采用时,网络性能显著下降。虽然一些较新的网卡可以识别 VXLAN 的包头,但是这类问题仍然是 VXLAN 一直没能在主机上广泛使用的主要原因。所以人们转而求助于网络来实现 VXLAN 的封装和解封装的工作。于是,这就促进了 EVPN 的兴起。
最大传输单元
在三层网络中,每个链接都有对应的最大数据包长度,称为MTU (maximum transmission unit,最大传输单元)。每增加一层包头,一个数据包中所允许的载荷
的长度就相应的减少一层包头的长度。这一点之所以很重要的原因是,在典型情况下当代网络将不会对IP 包进行分段,如果终端主机所配置的 MTU 没有正确的缩减,那么虚拟网络引入一个网络路径之后会导致难以诊断的网络连接问题。
缺乏可见性
典的调试工具比如 traceroute 无法揭示整个网络的真实的路由路径,它所能显示的整个网络路由路径就只有由网络隧道所代表的单一一跳。这会让那些使用了网络隧道的网络中解决问题成为一件非常痛苦的事情。
数据中心的网络虚拟化
VLAN
VLAN普遍部署在网络边缘,即第一跳路由器。
VRF
VRF是一个简单的组件,用于在一个节点上提供被此隔离的路由表。
将彼此隔离的路由表映射到多个节点上提供端到端的流量隔离是其他组件需要解决的问题。
VRF是一种内嵌网络虚似化解决方案,从源端到目的端的路由路径上的每一个节点都可感知到虚拟网络的存在。这就要求每个节点独自负责将一个数据包和它所在的虚拟网络关联起来。各个节点做到这一点的方法是从接收到数据包的接口来推端数据包所属的虚拟网络。
一般情况下,一个物理接口可以使用 VLAN 标签分割成多个逻辑接口。在这种情况下VLAN不是一个二层组件,仅仅是用来区分不同的虚拟网络的标签(merely a tag to separate the virtual network)。因为每个L3节点都会终结 VLAN,在路由路径上的每个路由器可以使用不同的 VLAN 来表示同一个VRF。但是,为了简化部署,改善网络的可观测性,以及创建更健壮、行为可预测的网络,通常在整个共享的网络基础架构范围内会使用同样的 VLAN 来标识一个VRF。
VXLAN
VXLAN是无状态的二层网络隧道,它允许你在三层网络基础设施上建立一个二层网络。
在数据中心里,VXLAN是与VRF 结合在一起来提供完整的 Overlay 虚拟网络方案,此类方案实现了桥接和路由功能。
VXLAN使用IP上的UDP作为封装技术,使得已有的网络设备也可以在多个路路径上实现数据包传输的负载均衡,这是数据中心网络中的一个常见需求。VXLAN主要部署在数据中心里。在VXLAN 协议中,网络隧道的一端称为 VTEP (VXLANTunnel Endpoints,VXLAN 隧道端点) 。
UDP 的源端口字段(UDP source port)是在入口 VTEP 上使用内负荷的包头计算得到的。这使得所有的传输节点都可以针对 VXLAN 数据包实现正确的负载均衡。网络的其他部分仍按照外部IP 包头转发 VXLAN 数据包。
VXLAN是一种单点对多点的网络隧道。网络中的多播或者广播数据包可以从一个VTEP 发送到多个 VTEP。
虚拟网络数量的实际限制
响虚拟网络实际部署数量的主要因素依赖于以下几点。
- 包头里的虚拟网络 ID 字段的大小。
- 硬件造成的限制。
- 控制面和软件的可扩展性。
- 部署模型。
虚拟网络数量的最大值就是这些因素数量的最小值所共同决定。这些因素是按照所能限制的数量上限的顺序罗列的。举例来说,如果包头只能支持 400 个虚拟网络那么即使再怎么增加其他因素的上限也没多大用处,除非采用更复杂的部署策略与此类似,如果转发芯片只能支持 512 个虚拟网络,那么即使包头有能力支持 1600万个虚拟网络也没用。
包头中虚拟网络 ID 字段的大小
包头中虚拟网络ID 字段的大小是限制常见的物理网络基础架构中所能支持的虚拟网络数量的关键因素。这个数量大小同时适用于内嵌和Overlay 网络。常见的限制如下:
- VLAN 包头留有 12 比特位用于表示虚拟网络数量。这意味着在连续的物理网络中 VLAN 可以支持最多 4000 个虚拟网络。
- MPLS 支持 20 比特位,即最多 100 万个虚拟网络,尽管 MPLS 理论上可能支持更多,只要增加 MPLS 标签即可。
- VXLAN 和 GRE 支持 24 比特位,即最多同时支持 1600 万个虚拟网络。
硬件限制
限制网络中虚拟网络数量的下一个因素是硬件。举例来说,即使 VXLAN 支持 1600万个虚拟网络,但单一设备上的绝大多数的转发芯片只能支持 16K 到 64K 个虚拟网络。硬件限制不仅是由包转发表支持的虚拟网络数量决定,也是由其他表如 ACL表所能支持的虚拟网络数量决定。但是,如果虚拟网络并不需要被所有的网络设备所感知到(比如,它们都被限制在单一的 pod 中),那么你就能在整个数据中心内支持大量的虚拟网络,这会比单个网络设备所能支持的最大数量还要多。
控制面和软件的可扩展性
虚拟网络的控制面在实际应用中会对虚拟网络的数量有所限制。原因如下:
运行一个控制协议实例来携带所有虚拟网络信息,要比为每个虚拟网络运行一个控制协议实例更具有可扩展性。举例来说,如果每个虚拟网络运行一个单独的控制面协议进程,因为 VXLAN有 24 比特位的 VNID,最大可能创建 1600万个进程,显然是不现实。
如果控制面协议使用特定的 ID 字段大小对虚拟网络进行编码,则所能支持的虚拟网络数量由此 ID 字段大小决定,与我们讨论过的其他因素无关。在 Overlay 网络中,核心交换机并不能感知到包转发面内的虚拟网络的存在。但是在控制平面,控制协议仍然掌握着所有虚拟网络的状态信息,因为核心路由器也许一直在将状态信息从一个 leaf 交换机中继到其他 leaf 交换机。这会额外增加控制协议的负担,尽管通常情况下这并不是造成限制的主要因素。
部署模式
网络虚拟化的控制协议
虚拟控制面和物理控制面之间的关系
内嵌网络虚拟化的控制面,典型情况下,为物理网络运行多个标准控制面的实例。比如,VLAN 使用多个 STP 实例。在传统最流行的模型中,PVST 为每个 VLAN运行单独的 STP 实例。鉴于可扩展的限制,标准化组织演化出一个变体称为 MSTP。虽然进展缓慢,但是仍有进展。
在一些稍有不同的模型中,VRF 通常使用路由协议的多个实例,即每个 VRF一个实例。但是单个路由协议进程通常支持所有这些实例。
在 Overlay 模型中,虚拟网络的控制面协议至少需要交换如下信息:
- 内部负荷的目的地址到隧道包头中的目的地址的映射。
- 每一个 Overlay 网络端点所能支持的虚拟网络列表。
还有其他可能会被交换的信息(例如,使用的隧道类型) ,这依赖于所使用的控制协议和特性。
集中式控制模型
VXLAN
基于协议的控制模型
EVPN
举例说明VXLAN的桥接和路由
1)在桥接场景中,通过在 MAC 表中查找一个数据包的目的 MAC 地址来实现数据包的转发。每一个数据包,不论被路由与否,如果接收接口是桥接接口的话,通常都是在 MAC 表里查找。
2)如果接收接口不是桥接接口,比如,是路由器之间的互连接口,则数据包的目的 MAC 地址必须是该接收接口的,否则此数据包会被丢弃。如果接收到的数据包的目的 MAC 地址属于该路由器,那此数据包就会被标记为需要通过路由的方式发送。
- 如果接收接口是桥接接口,本地路由器上桥接接口的 MAC 地址会被标记为要将接收到的包发送到路由器在网桥上的逻辑接口上,该逻辑接口通常被称为 SVI (Switched VLAN Interface,交换机 VLAN 虚接口)。
- 如果目的MAC 地址是交换机的路由接口的,则数据包会被标记为需要通过路由的方式发送
此概念如图 6-4 所示。
3)如果数据包的目的 MAC 地址不是路由器的地址,那么路由器会采用接收到的数据包的 VNI 和目的MAC 地址查询 MAC表。如果查询到的发送接口属于某个
VXLAN 隧道,则 VXLAN 隧道包头会被附加到数据包上。在 VXLAN 包头附到数据包上之后,新产生的数据包才会被路由出去。在此次路由过程中,用于
路由表查询的目的IP 地址变成了隧道包头中的目的IP 地址,即出口 VTEP的IP 地址。
4)但是,如果在上一步中数据包被标记为需要通过路由的方式发送,则数据包转发逻辑会在路由表中查询此数据包中的目的主机 IP 地址,同时推导出将要发送数据包的接口 (如果有多个可能的发送接口,则必须选择其中一个)。路由表查找结果也可以确定此数据包的目的 MAC 地址,以及任何额外的信息,例如,此MAC 地址所关联的 VNID。
5)如果发送接口是桥接接口,逻辑上此MAC 地址会在 MAC 表中再次被查询,以便推导出发送接口,来发送此数据包。如果通过 MAC 表查找所确定的发送接口
属于某 VXLAN隧道,则数据包的转发和第 3 步一样。否则,此数据包从查找所确定的发送接口转发出去。
6)如果目的IP地址是本地 VTEP的IP地址,而且一个数据包被识别为隧道数据包那么VXLAN 的数据包头会被剥离,而且负荷数据包会被发送回数据包转发逻
辑的开始即第1步。这可能会导致从前一个 VXLAN 出来的数据包被再次封装为 VXLAN 格式发送出去,但通常会使用一个与之前不同的 VNID。
数据包被封装并被二次路由,或者数据包被路由并被二次解封装,这种功能被称为RIOT (Routing In and Out of Tunnels,进出隧道路由)。
使用图 6-5 所示的拓扑来展示 VXLAN 的包转发过程。
此物理网络包含两个虚拟网络:
- 紫色 VNI和紫色 VLAN子网是
10.1.0.0/24
- 绿色 VNI和绿色 VLAN子网是
10.2.0.0/24
leaf 交换机L1到L4 中的IP地址是交换机的 VTEP IP 地址。比如,10.127.1.3
是L3的 VTEP IP 地址。
VXLAN 桥接示例:H1 到 H5
1)H1确定H5的IP地址 10.1.1.30
在H1的子网范围内。因此H1通过 ARP协议确定H5 的MAC 地址。H1 接着发送数据包到交换机 L1,其中用 H5的 MAC地址作为目的 MAC 地址,用 H1 自己的MAC 地址作为源 MAC 地址。H1在紫色 VLAN 上发送该数据包。
2)L1 接收到此数据包后用紫色 VLAN和H5的MAC 地址在 MAC 表中进行查询。查询后确定使用与紫色 VNID 相关联的 VXLAN 隧道以及 L4 交换机的出口VTEP 10.127.1.4
。
3)L1 使用 VXLAN 数据包头将此数据包进行封装,目的 VTEP 为 10.127.1.4
且源VTEP 为 10.127.1.1
4)L1查询路由表来确定到达10.127.1.4的
下一跳。因为下一跳有 S1和S2两种可能,L1 使用 VXLAN 数据包头的哈希值来随机选择一个。我们假设 L1 选择了 S2。接下来,LI 使用 S2的MAC 地址作为目的 MAC 地址,并将数据包从与 S2 相连的接口发送出去。
5)S2接收到此数据包。因为该数据包的目的 MAC 地址是接收接口的 MAC 地址,而接收接口又是一个路由接口,因此 S2 会对数据包的目的IP 地址10.127.1.4
进行一次路由查询。查询结果显示此数据包应从与 L4 相连接的接口发出去。S2接下来将数据包发送到 L4,以 L4的 MAC 地址作为数据包的目的MAC 地址,以 S2 自己的 MAC 地址作为源 MAC 地址。
6)L4 收到此数据包。因为该数据包的目的 MAC 地址是接收接口的 MAC 地址,而该接收接口又是一个路由接口,因此 L4 会对数据包的目的 IP 地址 10.127.1.4
进行一次路由查询。L4 发现目的 IP 地址与自己的 VTEP IP 地址相同,则L4 将此数据包的 VXLAN 数据包头剥离。
7)因为 VXLAN是一种二层 Overlay 网络隧道,因此会对解封装之后的数据包再次进行 MAC 表查询。解封装之后的数据包的目的 MAC 地址是 H5 的 MAC址。在 MAC 表中,根据紫色 VNID 和此目的主机 MAC 地址的查询的返回结果确定数据包需从与 H5 相连的端口发出。所以,L4 将解封装之后的数据包发送到H5。
8)H5 接收到此数据包。因为该数据包的目的 MAC 地址是接收接口的 MAC 地址(Because the destination MAC address belongs to the receiving interface),H5 接收此数据包并用目的主机 IP 地址 10.1.1.30
进行路由查询。此查询结果表明数据包的目的主机就是H5 自己。所以,主机将此数据包发给与其相关联的进程。数据包发送到此结束。
H1 构建的原始数据包并没被任何 VTEP 修改。
VXLAN 中对多目的地址数据帧的处理
VXLAN 提供了两种模型来处理发送多目的地址的数据帧。这类数据帧有广播帧,未知单播帧以及多播帧。
在大多数常用模型中,入口 VTEP 会给每一个目的 VTEP 创建一个数据的副本,这称为头端复制,因为入口 VTEP (或者称为头 VTEP) 为每一个目的地址创建了
个数据包副本。为了避免创建重复的数据包及造成环路,接收到数据包的 VTEP不会再将数据包复制发送给其他 VTEP。
VXLAN和路由:H1 到 H6
H1要和另一个子网内的端点H6进行通信,涉及RIOT的功能。
如图 6-5 所示,子网 10.1.1.x 和子网 10.2.1.x 跨多个leaf 交换机。在此场景中,常用模型是让每个携带子网的 VTEP 作为此子网的缺省网关。例如 H1,H4和H5都会使用同样的缺省网关地址,但是 L1会路由 H1 的数据包,L3 会路由 H4 的数据包,L4会路由 H5 的数据包。这称为分布式路由模型。
以下是当从 HI 发送数据包到 H6 时,数据包的传输步骤:
1)因为 H1 根据自己的IP 地址可以知道 H6 处于另一个子网 (10.1.1.10/24
处于不同于 10.2.1.40
所在的子网) 。H1 用缺省网关的 MAC 地址作为数据包的目的MAC 地址,在本例中就是 L1的 MAC 地址。
2)L1 会接收到此数据包。由于此数据包被发送到该路由器,L1 会继续路由此数据包。因为代表H6的IP 地址的子网跨多个 leaf 交换机,路由 (还有 ARP)查询结果可以确定与 H6 的IP地址关联的特定出口 VTEP。路由查询可以用两种方式确定出口 VTEP。**路由查询可以直接返回H6的 MAC 地址,或者可以返回出口 VTEP,即路由器L4的MAC 地址。前一种方法被称为非对称路由,后者被称为对称路由。**控制协议和部署模型决定了选取哪种模型以及如何正确写入路由表。在任何一种模型中,VXLAN 包头中的 VNID 都必须存在于入口和出口的 VTEP 里。
- 在非对称模型里,VNID 使用
10.2.1.0/24
所属的 VNI,在此例中用绿色所示。(图6-7) - 在对称模型中,用一个新的VNI代表在子网
10.1.1.0/24
和子网10.2.1.0/24
之间共享的VRF,并作为 VNID 在从L1 发送到L4的数据包中使用。(图6-8)
3)无论 L1 选哪种路由模型,L4 总是出口 VTEP,VXLAN 的包头总是携带L4的IP 地址作为目的IP 地址。在 VXLAN 的包头被添加之后,包转发过程和桥接方式类似,即带有 VXLAN 封装的数据包通过 S2(或者 S1)被路由到 L4。
4)当数据包到达 L4 之后,因为 L4 是出口 VTEP,而且 L4 接收到的数据包的目的IP地址就是 L4的IP 地址,因此 VXLAN 包头被剥离。由于 VXLAN是一种二层网络隧道,在任何一种隧道模型中,L4 都会采用解封装后的数据包目的 MAC地址和 VXLAN头里的 VNI进行 MAC表查询。
- 在非对称路由模型中,由于目的 MAC 地址属于 H6,数据包直接被以桥接方式发送到 H6。
- 在对称路由模型中,因为目的 MAC 地址是路由器的 MAC 地址,L4 会利用解封装后的数据包目的 IP 地址进行另一次路由查询。路由查询的结果是数据包被转发到 H6。
图6-7 展示了在非对称路由情况下从 H1 到 H6 的数据包头的变化。除了 VNI不同以外,VXLAN 包头看起来和桥接情况类似,因为 H6 处于与 H1 不同的子网。但是H1 原始包头的 MAC地址在L1的入口 VTEP 被重写。
图 6-8 展示了在对称路由情况下从 H1到 H6 的数据包头的变化。L1 处的二次路由的目的 MAC 地址是L4的 MAC 地址,而不是 H6 的。因此 L4 会将数据包路由到 H6。
VXLAN 桥接和路由的总结
正如先前描述的那样,VXLAN 是一种二层 Overlay 虚拟网络,是一种网络隧道。对网络隧道的端点而言,网络隧道通常看起来像是只有一跳,如 traceroute
的命令显示的那样。
图 6-9 从较高层次角度对 VXLAN 进行了总结。
在桥接的示例中,从 10.1.1.10 (H1)
到 10.1.1.30(H5)
的 traceroute 的输出仅显示了H1和 H5,因为整个数据包被认为是通过桥接方式传输的。**VTEP 本身在桥接情况下并不被认为是转发路径上的一部分。**因此即便 VXLAN 隧道起始于 L1 终止于L4,从终端主机 H1和 H5 角度看,H1 和 H5 是被一根网线直接连接起来的。图 6-9(a) 展示了这种情况。
在路由情况下,图 6-9 (b)展示了非对称路由时 traceroute 所能看到的跳数情况。
图6-9 © 展示了对称路由时的情况。所以,非对称路由的 traceroute 显示了三跳H1,L1 和H6,然而对称路由时 traceroute 显示有 4跳:H1,L1,L4 和 H6。
在所有情况下,使用 VXLAN 封装过的数据包从 L1 被路由到 L4。