虚拟路由器工作原理

一、虚拟路由器概述

1、虚拟路由器简介

虚拟路由器即Virtual Router,是指在软、硬件层实现物理路由器的功能仿真,属于一种逻辑设备。每个VR应该具有逻辑独立的路由表和转发表,这样就使不同VPN间的地址空间可以重用,并保证了VPN内部路由和转发的隔离性。

在一台物理路由器中可以形成多台逻辑上具有不同体系结构和路由功能的虚拟路由器,每台虚拟路由器都单独地运行各自的路由协议实例并且都有自己专用的 I/O 端口、缓存、地址空间、路由表和网络管理软件,能够为网络提供虚拟化的节点和链路资源。虚拟骨干路由器可以为客户提供成本低廉的专用骨干网控制和安全管理功能,其中控制和管理虚拟路由设备的软件采用模块化设计。

如果这些软件运行在真正且多进程的操作系统(如Unix)中,那么还支持多实例,即可以同时支持多台虚拟路由器。每台虚拟路由器的进程与其他路由器的进程相互分开,它使用的内存也受到操作系统的保护,从而保证了数据的高度安全性;同时还消除了由于软件模块的不完善所造成的与其他虚拟路由器之间的数据碰撞的可能性。

许多载波级路由器与高速同步光纤网络(Synchronous Optical Network,SONET)和同步数字序列(Synchronous Digital Hierarchy,SDH)网络连接进行分组转发时,均靠硬件来实现线速性能。而对于使用虚拟路由功能的系统而言,这些硬件功能都可以被逻辑细分。

此外,还可以灵活地将其配置给某一台专用的虚拟路由器,具有虚拟路由功能的软件模块可以完全控制数据分组发送和接收的物理端口及交换路径。虚拟路由器的分组缓存和交换表的大小受其所占用资源大小的限制,之所以这样做,是为了保证虚拟路由器之间不会相互影响。

虚拟路由技术使得每台虚拟路由器各自单独地执行路由协议软件实例(如OSPF和BGP)和网络管理软件实例,如简单网络管理协议(Simple Network Management Protocol,SNMP)或命令行,因此用户对每台虚拟路由器都可以独立地进行监视和管理。独立运行网络协议实例使得每台虚拟路由器都拥有一个完全独立的 IP 地址域,相互之间不会产生任何冲突,并且每台虚拟路由器都可以作为一个单独运行的实体来进行管理。它提供的基于用户的安全模块可以保证属于某台虚拟路由器的所有网络管理功能和信息都只对具有权限的用户开放;另外,每台虚拟路由器的分组转发路径也相互独立,使得管理员可以分别为每台虚拟路由器单独配置性能。

通过虚拟路由器大的通信突发数据流只会对本路由器产生影响,而不会影响其他路由器,从而为终端用户得到稳定的网络性能提供了保障;此外,虚拟路由器还提供独立的策略和互联网工程工作小组区分业务(Internet Engineering Task Force Differentiated Service,IETFDS)能力,使虚拟路由器可以为终端用户提供完全的客户化服务。通过配置虚拟路由器的 I/O 端口,可以对接收的分组进行计数,这样能够保证数据量不会超越预先确定的协议;同时虚拟路由器还可以根据数据分组的服务等级不同将其数据分组分配到不同的队列中,以实现不同的服务质量。

目前,虚拟路由器已经得到了实际的应用。Nortel的Accelar1000路由交换机使用虚拟路由端口在VLANs之间路由,虚拟路由器端口能够配置每个VLAN在IP子网或VLANs之间实现,Accelar1000路由交换机支持虚拟路由器端口,并且不降低其性能。​

2、虚拟路由器基本功能

虚拟路由器的基本功能可以定义为路由处理、分组转发和虚拟路由器专用服务。

1)路由处理功能

使用路由协议(单播路由协议或多播路由协议)获取网络的拓扑视图,并且构造和维护路由表,也可以通过手工方法配置静态路由。

2)分组转发功能

  • IP分组检查

检查版本号和分组头字段并计算头校验和。

  • 分析目的IP地址与查找路由表

决定分组的输出接口和到达目的 IP 地址的下一跳节点,查表的可能结果为:一是本地递交,即目的 IP 地址是本路由器的一个接口的地址;二是向一个输出端口的单播递交,即将分组送给下一跳路由器或最终目的地;三是向一组输出端口的多播递交,这依赖于路由器对组成员关系的了解。

  • 分组TTL控制

路由器调整 TTL 值字段以防止分组在网络中无终止地循环:本地递交的分组 TTL 值要大于0;对于向外转发的分组,首先TTL值减1,并且在实际转发之前还要重新检查TTL值。TTL值过期的分组要丢掉,还可能向分组的发送者通告错误信息。

  • 校验和计算

TTL字段变化后要求重新计算校验和。

3)IP最大传送单元(Maximum Transmission Unit,MTU)发现机制

为了适应输出网络接口的 MTU 值,有时需要分片处理,它对性能的影响比较大。现在由于IP MTU发现机制的应用,所以分片操作并不多见。

4)虚拟路由器专用服务

核心功能之外的其他功能为:分组翻译、重新封装、流量优先级处理和认证、访问控制,以及虚拟路由器的添加和删除。

另外,路由器还具有网管功能,包括SNMP代理和管理信息库(Management Information Base,MIB)等。

要为不同客户网络提供独立的功能,需要对路由器的硬件和软件进行逻辑划分和区分管理,具体还应当满足以下要求。

  1. 隔离性:多个路由实例及其相关联的路由表和转发表需要具有一种高效的虚拟化方式以实现完全的逻辑独立和分离;但由于它们共享同一路由表和转发表,因此应对不同网络的数据包进行分类、隔离和独立处理。
  2. 异构网络支持能力:各种网络可能基于完全不同的体系结构,而这些体系结构之间并不类似。即具有明显的异构特征,如新数据网络和移动性优先的命名、编址和路由等方式都不尽相同。由于它们具有不同的数据包处理过程,因此虚拟路由器必须具有连接各种异型网络和处理各种异型信息的能力。
  3. 支持VR的扩展能力:虚拟路由器需要在转发性能上满足扩展性的要求,还要在路由器的虚拟化方面具备动态扩展的能力,通过逻辑资源的增加或者物理设备的简单连接可以增加虚拟化的台数。
  4. 高性能的转发能力:为了满足应用的流量需求,虚拟路由器中运行的实例的性能需要能够达到与硬件转发速度相匹配的能力。
  5. 根据管理者是客户还是系统管理员来提供不同的管理能力。
  6. 路由实例之间完整的安全和保护,一个实例不能观察到其他实例的状态。
  7. 基于信道的点到点链路抽象。
  8. 需要实例化的构件。
  9. 路由协议:路由选择信息协议(Route Information Protocol,RIP)、OSPF、中间系统到中间系统(Intermediate System to Intermediate System,IS-IS)和BGP等。
  10. 防火墙、NAT、IP转发和安全服务相关的虚拟实例。
  11. QoS功能和算法。
  12. SNMP或其他管理协议栈。
  13. TCP和UDP及其应用。
  14. L2TP和PPP(如果提供远程VPN)。
  15. 远端鉴权拨入用户服务(Remote Authentication Dial In User Service,RADIUS):根据认证和记账的上下文互连多台服务器。

3、虚拟路由器结构

虚拟路由器的基本结构如下图所示:

整个结构由3大部分组成,即虚拟路由器模板、全局管理模块及若干个虚拟路由器运行实例(虚线矩形框所表示的范围)。

1. 虚拟路由器模板

在本体系结构中所有的路由协议、管理平台及TCP/IP协议栈由相同的目标代码实现,我们称之为“虚拟路由器模板”,它是路由器系统所有软件代码的集合。该模板是所有虚拟路由器运行实例的模板,各虚拟路由器实例所能支持的功能仅仅是虚拟路由器模板的一个子集。即如果虚拟路由器模板中没有包含某个协议的代码,则这些协议代码在各实例中不可用。

例如,模板中没有实现BGP协议,则任何一台虚拟路由器都不提供该协议。

虚拟路由器模板按功能包含4个部分,即虚拟TCP/IP协议栈、虚拟路由协议、虚拟管理平台及全局管理接口。前面3个部分使用封装技术使得相同的目标代码可以运行多个实例,每一台虚拟路由器对应一个运行实例;全局管理接口则提供与全局管理模块连接的接口,实现对整个系统的管理,它只运行一个实例。

2. 虚拟路由器运行实例

一个虚拟路由器运行实例实际上就是一台虚拟路由器,它包含路由器的所有关键元素,如接口、路由协议和管理界面等。每一个虚拟路由器实例拥有各自的 TCP/IP 协议栈、转发信息库,以及路由协议和虚拟路由器管理平台,它们都依赖于相同的目标代码,只是属于不同的运行实例。

虚拟路由器管理是系统整个管理功能中的一部分,包含两种含义,一是授权的虚拟路由器管理员(Virtual Router Administrator,VRA)通过 Telnet 登录,然后使用命令行接口(Command Line Interface,CLI)配置虚拟路由器;二是使用标准的网络管理协议,如SNMP实现对虚拟路由器的管理,这一功能由SNMP子代理完成。

3. 全局管理模块

全局管理模块分为两部分,即全局配置模块和SNMP主代理。后者通过各台虚拟路由器中的SNMP子代理实现全局管理,这里不做详细说明。

全局配置模块由全局管理员通过控制台使用,包含的功能有虚拟路由器的增加和删除、接口的分配,以及增加和删除虚拟路由器支持的协议等涉及多台虚拟路由器的所有公共操作。

为了实现一个高性能且支持虚拟化的可编程路由器,可将路由器整体架构划分为数据、控制和管理3个平面,如下图所示。

数据平面主要负责网络数据包的接收、识别、分类及转发;控制平面主要实现路由器的虚拟化,即在一台物理路由器中实现多台相对独立的逻辑路由器并负责路由的计算,以及异常数据包的分析处理,还可以对数据平面进行简单的配置管理。

管理平面主要负责多台虚拟路由器的各种协议的部署维护及路由器的各项参数的管理配置,方便用户管理单台虚拟化路由器及整个虚拟化路由器系统。

4、数据平面结构

虚拟路由器结构采用了数据平面和控制平面相分离的思想,其结构主要包括基于硬件的数据平面及基于通用处理器的控制平面。

数据平面主要实现虚拟化并根据控制平面配置的规则高速转发和处理数据包,数据包由物理端口输入到数据平面。高速的包分类模块根据分类规则将各种数据包分离到不同的处理流水线中进行转发处理,最终确定输出端口并发出。数据平面采用高效的包分类机制来实现虚拟化和隔离特性,通过多流水线设计来实现异构网络的支持能力并提供可扩展的能力,在各条流水线中用户可以利用高速的查找处理算法来实现高速的包转发能力。

虚拟路由器数据平面的整体结构,如下图所示。

1. 输入队列

从物理端口,如以太网或光纤端口输入的数据包经过物理层设备(PHysical laYer device,PHY)芯片处理后由MAC协议解析为硬件可以处理的数据包,如新数据网络(New Data Network,NDN)和IP等包格式,每个端口收到的数据包都在单独的队列中排队等待处理。

2. 并行包分类

在同一队列中排队的数据包可能从属于不同的虚拟网络并基于不同的体系结构,因此需要高速的包分类机制来决定各个数据包的目的流水线,以便于分别处理和查找。

假设每个端口速率为Ri且所有队列的数据包都由统一的包分类模块处理,那么包分类器需要同时处理的速率为ΣRi的数据包。以10 Gb/s的端口速率计算,如果有4个端口,那么包分类的速率需要达到40 Gb/s的吞吐能力。这对于传统的包分类算法是一个很大的挑战,无法采用传统的基于远程通信存取法(TeleCommunication Access Method,TCMA)、Trie或者空间分割的算法,并且需要较高的功耗和成本。

为了降低包分类的复杂度,充分利用可编程硬件所提供的并行性特征,本系统不使用单独的包分类模块。而是将包分类分散到各个队列上,如下图所示。 

数据包在输入调度之前有两条路径,一是采用并行的包分类机制进行包分类,即每个包分类模块负责单个队列的包分类,可以将包分类的速率降低到单队列的速度上,这样可以利用传统的包分类算法。二是缓冲包分类完成前的包头数据,因此每个包分类模块可以最多处理先进先出(First In First Out,FIFO)深度的包头数据。以IP包为例,如果采用五元组为包分类依据且FIFO采用64比特的位宽,那么使用深度为6的FIFO就可以完成包头缓冲。

3. 输入调度

数据包根据包分类规则确定处理流水线后需要被高效地调度到处理流水线中,传统的方案有轮询和加权轮询等,它们可以保证输入的公平性。在系统中有多条流水线作为目标调度,因此需要改进传统轮询方案。即在未采用虚拟输出队列(Virtual Output Queue,VOQ)排队策略时令轮询的指针数目与流水线数目一致,具体算法描述如下。

  • 设输入端口数为N,处理流水线数为M(N>M)。输入端口维护状态信息,Sj(1≤j≤N)指示目的流水线状态,每条流水线维护一个输入指针 Pi(1≤i≤M)用来指示当前流水线对应的输入队列。初始状态下,Pi=i,Sj=0。
  • 如果输入队列对应的缓存是空的且输出流水线处于空闲状态下,那么每个输入指针Pi从当前位置开始轮询选择第1个非空队列k。如果Sk=i,则Pi=k。

4. 处理流水线

处理流水线是路由器中进行包转发和处理的关键部分,数据包处理的方式和灵活性也在于此。不同的流水线承载不同的体系结构,这些应用对应的包处理流程不尽相同。在特定的处理流水线中数据包的各个数据区域被解析出来并按照各体系结构的处理方法进行转发和查表处理。例如,基于 TCAM、Trie 或 Bloom-filter 等的查找方案都可在其中使用。

在单一流水线结构中采用多表查询的方案需要在同构查找表中选择目的表项查找,这些表的查找模块都必须是同样结构或者相互串联的。如果需要改变虚拟路由器的功能,必须修改这些结构的关键模块,这些修改必然会影响其他虚拟路由器的功能和性能,以及虚拟路由器的隔离性能。在本系统结构中可以在不同的流水线中部署不同的应用方案和体系结构,如 IPv4 路由器可以和OpenFlow(OpenFlow是根据流表分类网络数据流,并根据制定的规则分别处理各种数据流,能够实现数据转发和路由控制分离的一种软件定义网络的新技术)方案并存。

5. 输出仲裁

不同流水线中的数据包在转发查找后需要统一地进行缓冲及交换处理,本系统采用无状态信息的调度算法。即通过轮询确定各流水线数据包的缓冲顺序,并且输出缓冲队列也是按照轮询的调度算法输出到各端口。

6. 输出缓冲

采用输出排队的交换机制提供最理想的性能,为了达到100%的吞吐率,需要外围存储器的链路速率达到所有端口的链路速率总和。 

5、控制平面结构

虚拟化路由器要在控制系统软件中支持可重构,首先在选择路由器操作系统内核时要使用目前的主流多进程操作系统,避免嵌入式操作系统线程间共享相同的物理地址空间造成的安全性和可部署性问题;其次必须对路由器操作系统中运行的各个功能构件使用的资源和权限进行限制,避免恶意构件或者实现缺陷影响系统可用性;再次由于各种路由器厂商的硬件平台实现方式千差万别,因此必须由专门的硬件抽象层对硬件平台进行功能抽象。以建立统一的硬件平台抽象描述模型和访问接口,供上层操作系统、转发模块和路由协议模块等访问。

基于以上分析,支持可重构虚拟化路由器的控制平面结构,如下图所示。

1. 模型的构成

整个模型由如下4层构成。

1)可重构路由器硬件平台

包括可重构路由器的各种底层硬件设备,如线卡、高速报文交换网络和主控卡等。

2)内核操作系统层

由硬件抽象层、可重构路由器 OS 内核和内核虚拟化服务平台组成,为上层的各种构件功能模块提供资源管理、调度和系统功能服务等。

  • 硬件抽象层:对硬件平台进行功能抽象建立统一的硬件平台抽象描述模型和访问接口,供上层操作系统、转发模块和路由协议模块等访问。该层屏蔽了底层硬件的实现细节,是支持第三方构件的独立开发和动态部署的关键。
  • 可重构路由器 OS 内核:基于目前主流的多进程操作系统设计需要解决的关键问题,是建立适合路由器的进程和线程调度机制,提供高性能的进程间通信机制并支持高效的大块内存复制和共享机制。
  • 内核虚拟化服务平台:通过操作系统级的虚拟化技术将独立的用户层功能构件相互隔离,以支持对每台虚拟机内构件的资源访问控制策略和系统服务权限的控制。操作系统级虚拟化仅需要修改操作系统内核;同时它能够保持原始主机的处理性能,为可重构虚拟路由器的各种功能构件在安全性、开放性、可部署性和资源隔离等方面提供非常好的支撑。

3)路由与转发层

主要包括报文转发处理层和路由协议控制层,二者分别通过标准的转发控制API,以及网络感知和路由控制API为上层提供各种开放控制功能。这两层位于用户空间下,由操作系统将网络接口接收的报文从内核空间通告给报文转发处理层,由其中相应的转发处理构件进行报文查表和转发操作。

由于高性能路由器中的报文转发主要由硬件完成,对软件转发的性能要求不高,因此这种用户空间的转发构件不会成为系统的性能瓶颈;同时,由内核虚拟化服务平台保证各个转发构件和路由构件间的隔绝性,以及单个构件的问题不会影响整个系统的可用性和稳定性。

4)应用插件层

当网络应用需要将基础的功能服务部署到网络中,以达到加速网络应用执行和提高传输效率时需要在可重构虚拟路由器控制平面上部署应用插件。

应用插件层为应用插件提供基本运行环境,通过内核虚拟化服务平台完成各个插件间的资源隔绝和安全隔绝,通过标准的转发控制API,以及网络感知和路由控制API来感知网络,以控制路由和转发行为。 

2. 需要解决的关键问题

可重构虚拟化路由器控制平面模型中需要解决的关键问题如下。

  1. 高性能的内核虚拟化技术:可重构虚拟路由器控制平面中需要部署的功能构件数量众多,每种功能构件需要独立的虚拟化运行环境的支撑。因此面向可重构路由器的高性能内核虚拟化技术必须能支持重量级和独立的虚拟化运行环境,并支持灵活的访问控制策略和资源配额策略,高性能的内核虚拟化技术对可重构路由器控制平面的性能至关重要。
  2. 可重构路由器硬件抽象模型和访问接口:路由器厂商实现的硬件平台有较大的差异性,并且随着技术的发展在硬件平台实现上不断引入新的硬件器件和新的互连转发结构。如何建立统一的硬件平台抽象描述模型定义面向上层软件的硬件访问接口,以供上层操作系统、转发模块和路由协议模块等访问,是可重构虚拟路由器控制平面设计的关键所在。
  3. 高性能的进程间通信和内存共享技术:可重构虚拟路由器构件间具有独立的运行空间,构件间的控制交互必须通过进程间通信或内存共享技术来完成。由于现有高端路由器支持的路由表数量巨大,因此在构件间共享海量的路由信息对进程间通信技术和内存共享技术提出了巨大挑战。
  4. 报文转发控制模型和开放访问接口技术:互联网作为发展速度最快的一种广域基础设施,吸引着传统的电信网络和电视网络,逐渐成为下一代三网合一的基础平台。在可重构虚拟路由器中如何定义能够囊括3种网络数据转发需求特点的报文转发控制模型和转发处理构件通用访问接口是决定可重构虚拟路由器技术能够成为未来网络技术承载平台的基本要求。
  5. 支持网络感知的路由控制模型和开放访问接口技术:随着三网融合成为未来网络技术的主要发展趋势,可重构虚拟路由器控制平面除了支持传统路由协议控制功能以外,还需要支持电信网络和电视网络的各种信令协议,因此需要定义能够囊括3种网络控制协议功能的路由控制模型;同时为了支持上层应用插件对网络拓扑信息和路由信息的感知,必须定义基于可重构路由控制模型的网络感知接口和路由控制接口。

二、虚拟路由器技术核心

可编程虚拟路由器指支持可编程和虚拟化两种特性的新型路由器,前者允许用户自定义数据包处理方法;后者支持多个路由器实例并行运行在同一个物理路由器平台之上。

为满足虚拟网的需求,路由器平台需要支持虚拟化,从而使多台客户机可以并行隔离运行。可编程虚拟路由器需要为用户提供灵活的可编程能力,允许用户自定义数据包格式与处理过程,从而支持新协议的试验和部署。

在数据中心网络中多样化的应用需求(如高可靠、低延迟和高吞吐等)要求网络设备支持差异化的数据包转发方法(多路径路由和最短路径路由等)。可编程虚拟路由器支持灵活的可编程,可以根据不同应用的需求对数据包转发方式(如查找关键字和方法等)进行灵活修改。

此外,大型数据中心是海量服务器的互连,通过虚拟机和物理机的形式提供各种不同的服务。由于不同服务之间存在隐私控制和流量隔离等需求,因此需要数据中心网络提供良好的虚拟化机制。以保证不同服务的业务子网间相互隔离和独立,并能动态共享数据中心网络中的服务器资源。

1、技术体系及面临的挑战

可编程虚拟路由器的技术体系包括 3个方面,即路由器的虚拟化、可编程性和数据包转发性能,如下图所示。

1. 虚拟化

在可编程虚拟路由器中,虚拟化引入两个方面技术问题,即资源分配与隔离,以及可扩展性。在一个虚拟路由器平台中多台虚拟路由器实例共享网络带宽、CPU和存储器等物理资源,资源分配的基本要求是满足各台虚拟路由器实例的应用需求。在此前提下,需要尽可能公平地分配物理资源,避免若干虚拟路由器实例过度消耗资源导致资源浪费等问题。

此外,不同虚拟路由器实例在共享资源的前提下还需要相互隔离,以避免单个路由器实例的故障影响其他路由器实例的正常工作。然而资源分配与隔离会导致严重的性能问题,在合理分配资源与保证虚拟路由器实例之间隔离性的前提下,如何尽可能降低虚拟化对性能的影响也是资源分配与隔离机制的重要挑战。在可编程虚拟路由器中多个虚拟路由器实例同时运行,每个路由器实例拥有一个转发引擎。随着应用需求的不断增加和网络规模的扩大,虚拟路由器实例个数不断增加,从而导致转发引擎数量不断增加。

一方面,转发引擎中的包头协议解析和数据包修改等计算部件对计算资源,如CPU,以及FPGA中的寄存器和逻辑资源的需求随着虚拟路由器实例个数的增加而迅速增长;另一方面,转发引擎中的转发信息库(Forwarding Information Base,FIB)等存储部件对存储资源,如TCAM、静态RAM(Static RAM,SRAM)和动态RAM(Dynamic RAM,DRAM)等存储器的需求也随着虚拟路由器实例个数增加而线性增长。如何在计算和存储资源有限的情况下支持尽可能多的转发引擎,从而支持尽可能多的虚拟路由器实例是可编程虚拟路由器中面临的可扩展性挑战。

2. 可编程性

主要体现在4个方面,即可编程接口、可编程系统架构、可编程灵活度和可编程难易度。可编程接口要定义良好的开发接口,使用户专注于业务功能开发,而不用关心底层的具体实现方式。

可编程系统架构需要抽象数据包处理的基本单元,并定义功能单元之间的统一接口,通过对已有功能单元的选择组合实现用户自定义的数据包处理流程。如何设计可编程架构并保证系统实现性能不受影响是可编程系统架构面临的挑战。

在可编程系统架构中增强单个功能单元(如包头解析单元)的可编程灵活度可以进一步提高系统的编程灵活性。并满足用户自定义数据包处理需求,以尽量避免用户重新开发新的功能单元。然而功能单元的可编程灵活度与实现复杂度之间存在矛盾,是功能单元可编程灵活度面临的主要挑战;当需要用户重新开发新功能单元时如何提供高效的编程方法,以降低用户的编程难度并缩短用户开发时间构成了可编程难易度的挑战。

3. 数据包转发性能

在虚拟路由器中数据包转发性能主要受 I/O 虚拟化性能、驱动和内核级的数据包收发机制的效率, 以及数据包查找算法性能的影响。多个虚拟路由器实例的虚拟网络接口共享物理网络接口,需要 I/O 虚拟化技术的支持。然而 I/O 虚拟化技术由于需要负责虚拟接口和物理接口之间的数据包分发,因此增加了系统 I/O 开销并降低了数据包转发性能。

此外,在路由器实例中,驱动和内核级的数据包收发机制的效率也直接影响数据包的采集和发送性能,在传统路由器中,I P查找和包分类等查找匹配操作是实现数据包快速转发的瓶颈。在虚拟路由器环境下上述瓶颈依然存在,而且由于可能承载非IP协议,所以数据包查找匹配问题较传统的IP查找和五元组包分类问题更为复杂,面临的挑战更为严重。

为了解决可编程虚拟路由器中的上述关键技术挑战,研究人员从虚拟化带来的资源分配与隔离问题、可扩展性问题,以及可编程性问题和转发性能问题等方面展开研究。

2、路由器虚拟化技术

为了实现路由器虚拟化,需要重点研究解决资源分配与隔离,以及计算和存储资源可扩展性等问题。

1. 资源分配与隔离

目前,可编程虚拟路由器中的资源分配与隔离通常采用传统的服务器虚拟化技术实现。

例如,vRouter使用OpenVZ和Xen实现资源分配与隔离;SwitchBlade使用OpenVZ虚拟化技术。可编程虚拟化路由器平台(ProgrammablE virtuAl Router pLatform,PEARL)是中国科学院计算技术研究所在国家 973 和 863 等项目资助下开展的项目,其中使用的 Linux 容器(LinuX Containers,LXC)是一种利用新版 Linux 内核的特性,即 Cgroups 等实现且无须Hypervisor 的轻型虚拟化技术。它能够虚拟出一个完整的系统环境(rootfs),也可以仅为单个或多个应用程序提供虚拟化运行环境的虚拟化技术。

利用全虚拟化技术在操作系统和底层硬件之间使用一个软件中间层 Hypervisor(虚拟机管理程序)管理底层硬件资源,使得硬件资源能够被上层多个客户操作系统共享访问。全虚拟化技术可以支持不同的操作系统,但是不能模拟不同的硬件平台。

利用半虚拟化技术同样采用软件中间层来隔离底层硬件和操作系统,不同的是它试图修改操作系统代码使客户操作系统本身知道自己运行在一个虚拟化平台上,该技术能够显著提升虚拟化技术的I/O性能。

操作系统级虚拟化利用操作系统所提供一些机制(如Linux中的命名空间)将一组进程放入“容器”中,与主操作系统的进程隔离。并使用这些机制限制这一组进程的CPU占用率和内存使用情况,从而达到虚拟化技术中资源的隔离与分配的目的。这类虚拟化技术只能运行在特定的操作系统中(几乎都是Linux),所有的虚拟机(在该技术中称为“Server”)都共享一个内核。

2. 资源可扩展性

可编程虚拟路由器中的可扩展性研究主要考虑在资源受限的情况下如何支持多种新型网络协议对数据包处理的不同需求,以及支持尽可能多的虚拟路由器实例同时运行(即支持尽可能多的网络协议与业务试验与部署的并行运行)。

为了提高可扩展性,研究人员提出了统一的数据平面抽象,即以一个统一的数据平面抽象支持不同新型网络协议处理数据包的特殊需求。在此基础之上,研究人员进一步研究多个数据平面共存带来的可扩展性问题,提出了数据平面模块共享、转发表合并和软硬件虚拟数据平面迁移等方法。

1)统一的数据平面抽象

OpenFlow为TCP/IP协议数据包转发提供了一个统一的数据平面抽象,它将数据平面抽象为规则抽取、查找匹配和动作执行 3 个部分。

首先抽取数据包头部的若干重要域(如 10元组)作为查找匹配的关键字,然后对关键字中的域进行精确匹配或通配符匹配,最后根据匹配结果对数据包进行转发、丢弃或修改等操作。OpenFlow的统一数据平面能够满足TCP/IP体系中各种不同协议的需求,然而该数据平面抽象没有考虑对全新网络协议的支持,难以满足新型网络协议特殊的数据包处理需求。

为了解决这一问题,LabelCast提出了一种普适的数据平面抽象,包括Label表和Cast表两个部分。LabelCast将网络地址映射为定长标签,通过Label表实现无状态的快速标签查找转发;基于Cast表对服务器计算和存储资源进行描述,支持复杂的网络协议语义和带状态的深度报文处理服务。因此 LabelCast 不仅仅支持现有路由器中常见的基于规则的转发方式,还支持新型网络转发服务,如指定数据网络(Named Data Networking,NDNO)中基于名字的转发。即LabelCast以一个统一的数据平面抽象,支持多种不同网络协议的数据包处理需求,提高了数据平面的可扩展性。

2)数据平面模块共享

通过分析虚拟路由器数据平面的基本功能模块特性可将数据包处理模块划分为可共享模块和不可共享模块,前者指无状态模块,不需要维护与虚拟路由器实例相关的任何状态信息。因此可以在不同虚拟路由器数据平面之间共享,如数据包头部解析、校验和计算和TTL减1等单元;后者指带状态的模块,需要维护与特定虚拟路由器实例相关的信息,如转发表模块。

根据上述分析,研究人员基于可编程硬件FPGA设计了虚拟路由器数据平面,通过在各个数据平面之间共享模块有效地提高了硬件资源利用率。试验结果表明在一块NetFPGA数据包处理卡上可以实现8个虚拟路由器数据平面,与独立实现8个虚拟路由器数据平面相比,节省约75%~79%的逻辑资源。

上述方法通过共享不同虚拟路由器数据平面之间的计算资源在一定程度上提高了虚拟路由器数据平面的可扩展性,然而由于转发表资源并没有在虚拟路由器实例之间共享,因此总的转发表大小随着虚拟路由器实例个数的增加而线性增长。当虚拟路由器实例个数为8时占用了FPGA片内87%的存储资源,因此有限的物理存储资源进一步限制了其支持的虚拟路由器实例个数的继续增加。

3. 转发表合并

虽然不同虚拟路由器实例的转发表各不相同,无法直接共享和复用。然而通过挖掘不同虚拟路由器实例转发表之间的相似性可以实现多个转发表的合并,从而有效降低多个转发表对存储资源的需求,进一步提高可编程虚拟路由器的可扩展性。

转发表的存储器类型不同,其数据结构和合并算法区别很大。根据转发表存储使用的物理存储器类型,可以将转发表合并方法分为基于SRAM和基于TCAM的合并方法。

在基于SRAM(或DRAM)的转发表查找方法中常用的一种数据结构为Trie树,这是将多个虚拟路由器实例的转发表合并压缩到一棵Trie树的方法,即Trie Overlap方法。在该方法中通过挖掘不同转发表中前缀之间的相似性(其对应的 Trie 树也是相似的),可将多个转发表合并成一个Trie树存储,下图所示为Trie Overlap方法将两个转发表FIB 1和FIB 2合并成一棵Trie树。

将两个转发表FIB 1和FIB 2合并成一棵Trie树。与多棵Trie树单独隔离存储相比,该方法有效降低了合并后Trie树的节点个数,从而节省了存储空间。然而在合并后的Trie树中每个节点中存储的下一跳指针个数与虚拟路由器实例个数相同(如图中的每个 Trie 树节点中要存储两个下一跳指针),因此当虚拟路由器实例个数不断增加时节点所占存储空间会太大。

这会导致两个问题,一是访问每个节点需要多次访存操作,增加了每次IP 查找所需的总访存次数,从而降低了查找速度;二是过大的节点会导致合并后的 Trie 树存储空间需求较大,难以在空间较小的高速存储器中存储。为了解决节点过大这个问题,Trie Overlap方法使用叶推技术将中间节点存储的所有下一跳指针推至叶子节点,使得中间节点不需要存储下一跳信息。使用叶推技术后Trie Overlap方法中的Trie树节点大小显著降低,然而该技术会导致增量更新困难。

为了避免这一问题,在合并后的 Trie 树节点中引入前缀位图,使节点和下一跳信息分离。每增加一个虚拟路由器实例,Trie树节点大小只增加1比特,有效提高了节点大小的可扩展性。在Trie树合并的过程中避免使用叶推技术,从而可在增加可扩展性的同时支持快速的增量更新。

当不同FIB的前缀相似度很高时,Trie Overlap方法的压缩效果很好。然而虚拟路由器中多个转发表的前缀相似度不一定很高,此时仅仅使用Trie Overlap方法可能无法取得明显的压缩效果。为了将前缀不相似的多个FIB对应的Trie树转换为相似Trie树,有专家提出了一种Trie Braiding机制。即通过在Trie树节点中增加一个分支比特允许Trie树每个节点的左右孩子互换位置,从而将不相似的Trie树调整为相似Trie树,以方便使用Trie Overlap方法进行合并压缩。

研究发现在VPN路由器的FIB前缀中由于存在不同的公共前缀,即使使用Trie Braiding机制也很难将其对应的Trie树转换为相似的Trie树。因此提出了一种Multiroot方法,允许从Trie树的某个中间节点开始合并,从而最大程度地利用子树的相似性。

基于TCAM实现FIB存储的基本思路是将前缀逐条存储在TCAM中,并将前缀对应的下一跳信息存储在附属的SRAM中。如果每个虚拟路由器实例的转发表单独存储,TCAM存储空间需求随虚拟路由器实例(FIB)个数的增加而线性增长,有限的TCAM存储空间中难以支持大量的虚拟路由器实例的FIB。

为了解决这一问题,研究人员通过挖掘不同FIB前缀之间的相似性在TCAM中存储共享前缀,从而降低TCAM存储空间需求。

多个转发表在TCAM中共享前缀的基本数据结构,如下图所示。 

如果属于不同 FIB 的某个前缀相同(下一跳不必相同),则可以将其合并成一个前缀,该前缀对应的所有下一跳信息顺序存储在SRAM中。例如,分属于两个FIB的条目<P,NH1>和<P,NH2>通过共享前缀可合并成一个条目<P,[NH1,NH2]>。

基于上述数据结构,属于不同虚拟路由器实例的转发表可以合并在一起。从而显著降低TCAM 存储空间的需求,然而上述合并方法可能导致不正确的 IP 查找结果。为了避免这个问题,人们提出了两种基于TCAM的FIB合并方法,即FIB Completion和FIB Splitting。

前者将所有的转发表前缀合并在一个TCAM中,并使用正确的下一跳结果填充所有无效的下一跳。该方法具有最好的可扩展性,然而在最坏情况下的更新开销较大。后者将转发表中不相交的叶子前缀合并在一个TCAM中,将其余前缀以隔离存储的方式存储在另一个TCAM中。

该方法也能保持较好的可扩展性,并且保证较小的更新开销上界。与传统的隔离存储方式相比,上述两种方法能够有效降低多转发表对存储空间的需求,在存储14个核心路由器的转发表时TCAM存储空间需求分别降低了92%和82%。 

4. 软硬件虚拟数据平面迁移

高效的处理模块共享和转发表合并可以分别提高计算资源和存储资源的利用率,从而提高硬件虚拟数据平面的可扩展性。然而高速硬件资源有限是目前存在的客观事实,仅仅依靠提高硬件资源利用率难以从根本上解决可扩展性问题。要想支持更多的虚拟路由器实例个数,必须借助可扩展性很好的软件虚拟数据平面。

研究人员提出以软件虚拟路由器和硬件虚拟路由器相结合的方式进一步提高可扩展性。少数且高吞吐的虚拟路由器数据平面在NetFPGA中实现,其他大量且低吞吐的虚拟路由器数据平面在服务器OpenVZ中实现。硬件数据平面和软件数据平面支持相同的用户定义的接口,以保证数据平面的位置(在FPGA硬件或服务器软件中)对用户来讲是透明的。虚拟路由器数据平面可以在软件和硬件中动态迁移,从而满足动态变化的应用需求。

虚拟路由器数据平面从硬件向软件迁移的过程十分简单。首先在服务器中新创建一个OpenVZ虚拟机实例并在其中运行Click软件路由器,配置Click使得数据包转发处理过程与待迁移的硬件数据平面的处理流程完全相同;其次将待迁移的硬件数据平面中的转发表完整地复制到刚刚运行的软件路由器中;最后改变数据包分发模块的配置,将发送至该硬件数据平面的数据包重定向到软件路由器中。

数据平面从软件向硬件迁移有一些限制,如果软件虚拟路由器实例和硬件虚拟路由器实例的转发机制完全相同,复制转发表可以实现软件虚拟路由器实例往硬件的迁移;如果在硬件数据平面中并不支持软件虚拟路由器实例中的转发机制,简单的转发表复制无法满足迁移的需求。

即需要对硬件数据平面的逻辑功能进行修改才能满足这种迁移需求,因此人们提出使用在线动态可重构的方法解决这一问题。当硬件数据平面需要进行显著修改才能满足迁移要求时,首先将所有的硬件虚拟数据平面迁移到软件中并将发往这些硬件数据平面的流量重定向到相应的软件路由器中;其次重新编程整个 FPGA,在硬件数据平面中实现新的数据包转发机制;最后将待迁移的软件路由器实例中的转发表复制到相应的硬件数据平面中并配置数据包分发模块,使流量重新定向至硬件虚拟路由器中。

软硬件虚拟路由器相结合的方式可以很好地解决虚拟路由器实例的可扩展性问题,然而在上述方法中软件路由器往硬件迁移时可能存在较大开销。当一台软件路由器向硬件迁移时,如果硬件中所有的虚拟数据平面均无法实现该软件路由器所需的转发机制,则所有的硬件虚拟数据平面都必须迁移到软件中。然后重新编程整个 FPGA,最后将对应的虚拟路由器实例迁移回硬件。试验结果表明当硬件中只有一个虚拟数据平面时上述迁移过程需要超过10秒,在这段时间里网络数据包不能在FPGA硬件中转发。

为了降低迁移时间,人们提出将每个硬件虚拟数据平面的转发逻辑和转发表划分为一个局部可重构区域。当硬件数据平面的转发机制需要修改时不需要重新编程整个 FPGA,只需利用FPGA提供的局部动态可重构特性对其中某一个局部可重构区域进行动态编程,从而显著降低了迁移的时间;同时也不需要在迁移过程中停止整个FPGA硬件数据平面的数据包转发操作。试验结果表明与整个FPGA完全重新编程的迁移方法相比,该方法能将迁移速度提高近20倍。

下表所示为路由器虚拟化问题研究进展:

路由器虚拟化带来资源分配与隔离,以及资源可扩展性等问题。其中资源分配与隔离机制目前通常采用成熟的服务器虚拟化技术实现,在隔离性与转发性能之间存在矛盾;资源可扩展性问题主要来源于计算和存储资源的稀缺性与虚拟路由器实例个数不断增长的应用需求之间的矛盾。研究人员提出统一的数据平面抽象以支持多种不同网络协议的数据包处理,扩展数据平面的普适性。

在多个数据平面共存时通过共享和复用多个虚拟路由器的数据包处理模块,以及合并多个虚拟路由器的转发表等方法有效提高了硬件资源的利用率,并改善了硬件虚拟数据平面的可扩展性。然而即使硬件资源利用率很高,其支持的硬件虚拟数据平面个数仍然比较少。

为了进一步提高可扩展性,研究人员提出了使用软件虚拟路由器与硬件虚拟路由器相结合的方式,在硬件中实现少量高性能的路由器实例并在软件中实现大量低吞吐和高灵活性的路由器实例;同时,支持软硬件路由器实例的动态迁移并使用局部动态可重构技术降低迁移开销,从而满足动态变化的应用需求。 

3、虚拟路由器的可编程性

软件系统和可编程硬件系统(如 FPGA)本身具备可编程性,可以满足自定义数据包处理的需求。然而在虚拟路由器中研究可编程性的目的是为了提出更简单的编程机制,从而降低用户编程的难度;提出更快速的编程机制,以缩短原型系统设计、试验与部署的时间。

为了实现这一目标,研究人员设计了开放的可编程接口、模块化的流水线架构和灵活的可编程模块,实现了易于使用的网络数据包处理编译器。

1. 开放的可编程接口

OpenFlow协议定义了开放的可编程接口,允许用户通过软件自定义数据包转发操作,而不用关心底层交换机的具体实现方式。其可编程接口由一组预先定义的消息,如控制器-交换机消息、异步消息、对称消息,以及这些消息的数据结构组成,通过这些消息可实现OpenFlow交换机和控制器之间的指令和状态信息交互。

该可编程接口对现有 TCP/IP 网络协议的查找转发操作支持较好,然而没有提供对复杂的带状态的深度数据包处理的支持。在 LabelCast中定义了基本的服务原语(缓冲区、线程和注册原语)作为用户自定义服务开发的编程接口。

扩展的 LabelCast 资源容器提供了用户编程的环境,以及服务运行所需的各种资源。用户通过使用缓冲区和线程原语分别管理存储和计算资源,使用注册原语(即开放的服务注册接口)动态加载自定义服务。由于 LabelCast 定义的服务支持协议语义和状态相关的深度数据包处理,因此该编程接口可以方便扩展支持新型网络协议。

2. 模块化的流水线架构

模块化的流水线架构主要是为了解决可编程系统的架构问题。模块化的可编程思想是将路由器中数据包处理的基本单元模块化,通过选择和组合这些基本模块实现自定义的数据包处理流水线。基于上述模块化的思想人们提出了模块化的路由器数据平面Click,它支持用户自定义的数据包查找和转发处理。

另外还提出了模块化的路由器控制平面即可扩展的开放路由器平台(eXtensible Open Router Platform,XORP)支持用户自定义的路由计算和路由管理等功能,因此使用Click和XORP可以实现模块化的路由器。当前主流的Linux操作系统通过一定的调节和配置也能够实现与Click相同的路由器数据平面功能。

然而 Click 数据平面并没有考虑对虚拟化的支持;并且纯软件实现方式也导致了其数据包查找和转发的性能较差。为了解决这些问题,基于NetFPGA硬件实现了模块化的虚拟路由器SwitchBlade。在数据平面中SwitchBlade采用模块化的流水线架构,基于FPGA实现多个相互隔离的虚拟数据平面;同时兼顾了良好的可编程性和很高的转发性能。在控制平面中基于OpenVZ提供的虚拟化环境,在每台虚拟机中运行Quagga作为路由软件。

在上述模块化的路由器结构中可编程性的强弱取决于预先实现的基本模块(基本处理单元)功能是否完备,以及能否灵活支持模块间的自由选择组合。然而一个系统中预先实现的基本模块有限,进一步提高可编程性有两种基本的思路,一种思路是实现灵活的可编程模块,增强单个基本模块的灵活性;另一种思路是降低基本模块的开发难度,以方便用户快速实现自定义模块。

3. 灵活的可编程模块

在模块化的流水线架构基础之上增强每个基本模块的灵活度可以进一步提高可编程性。如果在包头协议解析模块中只实现基本的IPv4和IPv6协议解析和目的IP地址抽取功能,则其灵活性非常有限,只能适用于IP查找操作;如果该模块能够支持自定义偏移和自定义长度的多域关键字抽取,则可以适应MAC地址查找、IP查找和五元组匹配等多种查找操作的包头提取。

对于传统的TCP/IP协议,OpenFlow提出了非常灵活的可编程模块。它将数据包的处理抽象为包头解析、关键字匹配和动作执行3个模块,在包头解析模块中提取数据包的10元组作为查找关键字;在关键字匹配模块中支持基于10元组的通配符匹配和精确匹配;在动作执行模块中定义和实现了路由器中常用的数据包执行动作,上述灵活的可编程模块可以很好地满足目前TCP/IP路由器中常见的各种数据包处理需求。

然而OpenFlow基于预先定义的10元组的匹配方法仍然有其编程的局限性,首先关键字的提取受到预先定义的 10 元组的限制。如果用户的新协议使用数据包头的其他域(不在 10元组定义的范围之内),OpenFlow将不能很好地支持这种协议。为了弥补这一缺陷,OpenFlow定义的关键字越来越长,从最初的10元组扩展到36元组;其次,OpenFlow中元组的定义基于标准的TCP/IP协议,其可编程范围局限在TCP/IP体系范围之内。对于非IP查找,如NDN查找等,OpenFlow预定义的多元组无法满足需求。

可配置的信息包转发引擎(Configurable pAcket Forwarding Engine,CAFE)和SwitchBlade在其包头解析模块中设计了任意比特抽取器,最终目的就是支持数据包头部任意比特域的自由组合,从而支持用户自定义的查找关键字提取方式和新的协议类型。

这种包头解析模块的灵活性越强,可编程性越好,对新协议的支持就越好,然而复杂程度也越高。复杂的抽取过程给包头解析带来了性能方面的挑战,为了实现高性能且灵活的包头解析模块,人们基于FPGA设计了400 Gb/s包头解析流水线。即将每一个头部的解析映射到流水线中的一个流水级,在流水级中通过用户配置的微码实现灵活的自定义多域抽取。

4. 数据包处理编译器

如果通过基本模块的自由选择组合及可编程模块的灵活配置仍然无法满足用户的新协议对数据包处理的需求,则需要用户编写相应的数据包处理单元,然后以插件方式插入到模块化的流水线架构中或者替换已有模块。

对于软件数据包处理模块来讲,统一和友好的编程接口可以方便用户的编程。然而硬件可编程模块即使具备定义良好的模块接口,用户编程也会遇到较大的困难,因为这涉及可视硬件描述语言(Visual Hardware Description Language,VHDL)/Verilog的学习使用,以及对硬件底层细节的了解和认识。

为了简化用户编程难度,尤其是硬件模块的编程难度,研究人员设计了网络数据包处理编译器,允许用户使用自己熟悉的高级语言,如C/C++或脚本语言编写数据包处理功能,然后通过编译器将其转换为对应的硬件模块实现。

针对基于 FPGA 的模块化虚拟路由器数据平面,人们设计了Click风格的数据包处理编译器ReClick,以降低硬件模块编程的难度。如果用户熟悉Click的编程方式,将会十分容易地使用ReClick进行硬件数据包处理。

在设计的包头解析流水线中也同时设计了数据包解析语言(Packet Parsing Language,PPL),它以类 C++的风格定义了每个头部的格式和处理规则,方便用户对新协议包头解析的自定义处理。

下表所示为虚拟路由器中可编程性问题的研究进展:

研究人员设计了开放的可编程接口以简化用户编程难度,使用户不用关心底层的具体实现方式。并且提出了模块化的数据包处理架构,设计实现了常见数据包处理流程中的大部分模块;同时提供统一和友好的接口。用户复用和组合已有模块,以满足大部分常见的数据包处理需求。

有特殊需求的用户也只需将精力集中于新协议特定的数据包处理功能上,然后以插件方式将自定义的模块插入到包处理流水线架构中。在模块化的架构中提高每个重要模块,尤其是包头解析模块的灵活性,整体架构对新协议的适应性就越强;同时越能降低用户开发新系统的工作量,避免大量的重新开发工作。

在用户开发实现无法避免的情况下,通过研究设计网络数据包处理编译器给用户提供了熟悉的高层编程语言接口。以降低用户编程的难度和门槛,从而实现用户自定义协议的快速编程。 

4、转发性能

在可编程虚拟路由器中 I/O 虚拟化带来的开销、数据包收发机制的效率,以及数据包查找匹配操作的性能成为限制虚拟路由器转发性能的重要因素。为了提高转发性能,工业界和学术界提出大量的虚拟I/O 加速技术优化驱动和内核级的数据包收发机制,以及加速查找匹配操作的性能。

1. I/O虚拟化加速技术

在可编程虚拟路由器中每个虚拟路由器实例都有自己的虚拟网络接口,不同路由器实例之间的虚拟接口逻辑上相互隔离。而在物理上共享实例的网络接口,如下图所示。

为了实现虚拟网络接口的抽象,虚拟机管理程序需要负责完成物理网络接口与各个虚拟网络接口之间的数据包分发,并且参与各个虚拟路由器实例的每一次 I/O 操作,因此虚拟机管理程序中的数据包分发工作成为 I/O 虚拟化带来的瓶颈。

研究人员为 Linux 操作系统中的各种虚拟化软件设计了一套标准化的半虚拟I/O接口Virtio,半虚拟化I/O能够让客户操作系统意识到自身运行在虚拟化环境中并在这个基础上采用一定的优化措施提升客户操作系统的I/O性能。目前,KVM虚拟化技术支持Virtio。

尽管半虚拟化 I/O 技术能够提升客户操作系统的 I/O 性能,但仍然存在上下文开销过大等问题。解决问题的关键在于取消虚拟机管理程序的代理,让客户操作系统能够直接访问物理设备。直接访问物理设备可以分为两个问题,即客户操作系统的设备缓冲区 DMA 和中断重映射。

Intel VT-d技术解决了以上两个问题,提供了数据由底层硬件到客户操作系统的直接通路。SR-IOV 提供了将单台 PCI 设备虚拟成多台设备的方法,并为每台虚拟机提供独立内存空间、中断和 DMA 流。

其架构设计允许一种 I/O 设备支持多个虚拟功能,从而提供了一种不需要软件模拟就可以共享 I/O 设备和 I/O 端口的物理功能的方法;此外,Xen 开发人员开发的PCI Passthrough技术支持直接访问PCI设备。使得客户操作系统能越过虚拟机管理程序访问设备,从而获得接近原生Linux环境下的I/O性能。

2. 数据包收发机制优化

I/O虚拟化加速技术降低了虚拟化引入的额外I/O开销,在此基础上数据包收发机制的优化能够进一步提高数据包的转发性能。

传统的 I/O 中断方式具有响应速度快和延迟低等优点,然而当数据包速率过高时频繁的中断处理会显著增加软件负担。RouteBricks使用轮询方式代替传统硬件的中断方式,极大地提高了通用硬件的 64 个字节小包的转发性能。采用批处理的方式每次总线事务(bus transaction)都传递多个数据包的地址,充分利用了快速外围组件互联(Peripheral Component Interconnect-express,PCI-e)的总线带宽;利用网卡的多队列特性将不同队列与不同内核进行绑定,极大地提升了数据处理的并行性。使用以上3种手段可以使得单台服务器的64个字节小包转发性能达到 9.7 Gb/s。

PacketShader 对 Linux 的内核协议栈进行了优化,将内核中sk-buff结构体由原来的208个字节减少为8个字节,并采用批处理的方式极大地提升了数据包处理性能。

试验表明仅采用这种优化手段就可以将数据包吞吐量提升到10.5 Gb/s,性能提升了13.5倍。

PacketShader也利用了多核多队列的特性并且考虑其采用的架构为非一致内存访问(Non Uniform Memory Access,NUMA),针对数据包的分发均衡性和提升数据局部性做了精心优化,使其整体转发性能达到40 Gb/s。

3. 查找算法优化

数据包查找操作一直都是软件虚拟路由器设计中的一个主要的性能瓶颈。传统的IP查找算法也能够应用于可编程虚拟路由器中,以实现快速的IP 查找。然而可编程虚拟路由器不仅仅需要支持快速的IP查找,还需要支持非IP协议,如支持NDN协议中的基于内容名字的查找等。

NDN中的内容名字具有类似HTTP统一资源定位器(Uniform Resource Locator,URL)的层次结构。与传统的 IP地址相比,NDN数据名字长度不定且无上界,导致最长名字前缀匹配成为 NDN 查找中一个重要的挑战。为了解决这一问题,人们提出了高效的名字子串编码方法并应用改进的状态转移数组加速最长名字前缀匹配。研

究人员评估了 NDN 的原型系统实现内容中心网络(Content-Centric Networking,CCN),分析了其转发平面的性能瓶颈并找到影响 NDN 转发性能的 3 个主要问题。即支持快速更新的精确字符串匹配、基于变长和无上界名字的最长前缀匹配,以及大规模流表维护问题,针对这些问题提出了5大设计原则用于指导性能可扩展的NDN转发引擎设计。

下表所示为可编程虚拟路由器中转发性能问题的研究进展:

其中 I/O 虚拟化的性能开销是虚拟化技术的引入所带来的特殊问题,它已经得到学术界和工业界的广泛关注。部分虚拟I/O性能加速技术,如Intel VT-d技术和SR-IOV技术等已广泛应用于服务器和网卡产品中。

传统的数据包收发机制及IP查找操作在虚拟化环境下依然成为性能瓶颈,一直以来都受到学术界的持续关注。非 IP环境,尤其是 NDN体系结构下的路由查找问题随着新型体系结构研究的深入也逐渐得到人们的重视,成为一个新的重要研究方向。 

三、虚拟路由器冗余协议

虚拟路由器冗余协议(Virtual Router Redundancy Protocol,VRRP)是用于实现路由器冗余的协议,最早由RFC2338给出,它在Cisco的私有协议热备用路由协议(Hot Standby Routing Protocol,HSRP)的基础上制定。

VRRP 简化了 HSRP 提出的机制,尽量减少了由于提供冗余功能给网络带来的额外负载。最新的VRRP协议在RFC3768中定义,新的请求注解(Request For Comment,RFC,互联网标准草案)文档公布后原来的RFC2338被废除,新协议对一些功能做了进一步简化。

1、VRRP协议简介

在基于TCP/IP协议的网络中,为了保证不直接物理连接的设备之间通信,必须指定路由。目前常用指定路由的方法有两种,一种是通过路由协议,如路由选择信息协议(Route Information Protocol,RIP)和优先开放最短路径(Open Shortest Path First,OSPF)的动态学习;另一种是静态配置。在每一个终端都运行动态路由协议是不现实的,大多客户端操作系统平台都不支持动态路由协议。即使支持,也受到管理开销、收敛度和安全性等许多问题的限制。

因此普遍采用终端IP设备的静态路由配置,一般是为终端设备指定一个或者多个默认网关(Default Gateway)。静态路由方法简化了网络管理的复杂度并减轻了终端设备的通信开销,但是它仍然有一个缺点。即如果作为默认网关的路由器损坏,所有使用该网关为下一跳主机的通信必然要中断。即便配置了多个默认网关,如不重新启动终端设备,也不能切换到新的网关。采用VRRP可以很好地避免静态指定网关的缺陷。

VRRP是一种容错协议,通常一个网络内的所有主机都设置一个默认路由,如下图所示。

这样主机发出的目的地址不在本网段的报文将通过默认路由发往路由器 RA,从而实现了主机与外部网络的通信。当路由器RA损坏时,本网段内所有以RA为默认路由下一跳的主机中断与外部的通信。VRRP 为解决上述问题而提出,并为具有多播或广播能力的局域网(如以太网)提供设计。

VRRP是一种选择协议,可以把一台虚拟路由器的任务动态分配到局域网中VRRP路由器中的一台。控制虚拟路由器IP地址的VRRP路由器称为“主路由器”,它负责转发数据包到这些虚拟IP地址。一旦主路由器不可用,这种选择过程就提供了动态的故障转移机制,从而允许虚拟路由器的IP地址可以作为终端主机的默认第1跳路由器。使用VRRP的好处是有更高的默认路径的可用性,而无须在每台终端主机上配置动态路由或路由发现协议,VRRP包封装在IP包中发送。

有时把VRRP称为“虚拟路由备用协议”,其组网结构如下图所示。

其中有 RA 和 RB 两台路由器,VRRP 在设计上为局域网提供一台虚拟的路由器。两台路由器关联到一台虚拟路由器,由这台虚拟路由器作为 PC 网关来与外界连通。

这两台路由器形成一个VRRP组,其中一台为主路由器。其余的路由器都是备用路由器。VRRP组内的多台路由器都映射为一台虚拟路由器,VRRP 保证同时有且只有一台路由器代表虚拟路由器发送包,而主机则把数据包发向该虚拟路由器。

主路由器和备用路由器具有以下含义。

  1. 主路由器是在VRRP组中实际转发数据包的路由器。
  2. 备用路由器是在VRRP组中处于监听状态的路由器。

使用VRRP可以通过手动或动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)设定一个虚拟 IP 地址作为默认路由器。在配置时路由器RA中的虚拟IP地址和虚拟ID必须与路由器RB中的虚拟IP地址和虚拟ID设置相同,虚拟 IP 地址在路由器间共享。

如果主路由器不可用,这个虚拟 IP 地址就会映射到一台备用路由器的IP 地址(这台备用路由器成为主路由器),而处于备用状态的路由器将被选择来代替原来的主路由器。VRRP使得局域网内的主机看上去只使用了一台路由器,并且即使在其当前所使用的首跳路由器失败的情况下仍能够保持路由的连通性。VRRP在从OSI的网络层保证网络的高度冗余的同时还可以实现网络数据包流量的负载均衡,它是IPv4和IPv6的一部分。 

2、VRRP协议相关术语

VRRP协议中涉及很多概念和术语;另外,配置VRRP协议时必须指定协议运行的相关参数,这些是理解VRRP协议的基础。

1. VRRP中虚拟的概念

1)虚拟路由器

VRRP路由器指运行VRRP的路由器,即物理实体;虚拟路由器由VRRP协议创建,是逻辑的概念。

对于局域网中的客户端而言,这台路由器好像是实际存在的。一组VRRP路由器协同工作共同构成一台虚拟路由器,它对外表现为一台具有唯一固定IP地址和 MAC 地址的逻辑路由器。虚拟路由器可以有多个分组,真实路由器可以是一个或多个分组中的成员。

2)虚拟IP地址

配置给虚拟路由器的IP地址,可以和主及备用路由器相同或者不同。虚拟路由器IP地址其实就是用户的默认网关,当主路由器出现故障时备用路由器接管承担路由任务,虚拟IP地址不变。局域网中所有主机必须将自己的网关指向虚拟IP地址,而且VRRP的广播报文中必须携带虚拟IP地址。

3)虚拟路由器ID(Virtual Router ID,VRID)

VRID在路由器组中经过选举产生,用一个标识代替。在VRRP中规定VRID是一个数字,取值为1~255。如果在部署时未配置,则无法启动VRRP,因为VRID没有默认值。

4)虚拟实例(Instance)

运行在一台实际路由器中的程序,其中的信息包括运行该程序的路由器是主路由器还是备用路由器,以及这台路由器所属的VRID值。

2. 参数定义

1)优先级(Priority)

这是确定由哪一台路由器来掌管主路由器的数字,数字越大,越有可能成为主路由器;另外作为主路由器在广播时必须携带自己的优先级,优先级可以手工修改。

2)广播间隔时间(Advertisement_Interval)

在一个路由器组中主路由器定期发送报文给其他路由器告之自己的状态,使其继续维持备用状态。每隔一个Advertisement_Interval时间间隔都要发送这样一个报文,而这个时间间隔的数值也必须包含在广播报文中,其度量值为秒。

3)主路由器超时时间(Master_Down_Interval)

如果备用路由器在Master_Down_Interval的时间间隔内没有收到主路由器的广播报文,则其他路由器认为主路由器失效,将进行新一轮的主路由器选举。

4)Master_Down_Interval=3×Advertisement_Interval+Skew_Time

不用配置。

5)偏移时间(Skew_Time)

为了防止当主路由器失效时所有其他备用路由器同时来竞争主路由器的局面,设置了 Skew_Time,Skew_Time=(256-优先级)/256。由此可见,优先级越高,越有可能首先能成为主路由器。

3. 其他概念

1)虚拟IP地址的拥有者(IP address owner)

路由器的接口可以通过配置子接口的形式设置地址为多个,但是只能有一个主IP地址,当路由器中的某个网关的主IP地址和虚拟路由器的IP地址相同时该实际路由器称为“虚拟IP地址拥有者”。

2)抢占模式(Preempt_Mode)

如果该值为真且后加入的路由器广播的报文优先级高于目前的主控路由器,则将取代当前的主控路由器的位置,而本来的主控路由器收到比其优先级更高的路由器广播时将自动转换为备用路由器;如果该值为假,则即使主路由器收到比其优先级更高的报文,也不予处理,而直接丢弃。默认情况下,路由器开启抢占模式。

3)认证方式

指定路由器在发送报文时采取的认证方式,该方式可以开启或关闭;另外,在同一个路由器组中的参数VRID、虚拟IP地址、Advertisement_Interval和认证方式必须一致;否则整个路由器备用组将会产生混乱,甚至出现多台主路由器的情况。

3、VRRP功能点

为了达到消除静态路由环境下默认路由器单点故障引起的网络失效这一目标,并确保在发生故障切换设备功能时不影响内外数据通信,同时不需要修改内部网络的网络参数,VRRP具有以下功能需求。

  1. 冗余备用,即在一个备用组中当主路由器由于某种原因发生故障时组中的备用路由器能迅速进行新一轮选举产生新的主路由器,及时恢复局域网与外界的通信。
  2. 允许局域网内主机指定虚拟IP地址为网关以实现和外界通信,虚拟IP地址被多台路由器共用。当主路由器发生切换时主机无须配置新的网关而能继续与外界通信,即这种切换对主机来说是透明的。
  3. 虚拟路由器应和实体路由器一样对外界呈现统一的MAC地址和虚拟IP地址,能正常响应针对虚拟IP地址的ARP请求和转发数据报文。
  4. 当主路由器发生切换时所造成的网络中断时间应可以配置,最短能在 3 秒~4 秒内恢复。
  5. 使用不必要的中断最小化(Minimization of Unnecessary Service Disruptions)选择主路由器后,除了主路由器定时发送的VRRP广播报文外,主路由器和备用路由器之间没有多余的通信。任何优先级低或相等的备用路由器不能发起状态转换,这样主路由器可以持续稳定地工作,协议的运行也不会因产生较大的流量而占用有限的传输带宽。
  6. 为用户提供方便可行的命令行接口和管理界面,应能提供灵活、易操作和简捷的配置实现,对用户的命令软件应能解析和处理,发现错误应向用户输出错误信息。
  7. 协议运行的可配置参数包括备用组ID、虚拟IP地址、优先级、抢占方式,以及VRRP广播报文的时间间隔等。
  8. 为了维持网络的稳定和有序,协议的运行必须保证一个备用组在稳定的状态下只能存在一台主路由器。
  9. 允许一台实际路由器中配置多台虚拟的路由器,即冗余和负载均衡同时实现。但是必须确保一个备用组只能有唯一的一个ID和IP地址,而一个备用组必须包含至少一台虚拟路由器。不同备用组的虚拟IP地址不能重叠,一个备用组只能有一个IP地址拥有者。
  10. 在协议报文交互期间,报文的接收者能够校验报文的合法性,对正确的报文能及时地更新自己的状态,对非法的报文能报告错误信息并丢弃。
  11. 虚拟路由器的运行应尽量不影响实体路由器的正常功能。
  12. 提供接口监测功能,能根据所监测接口的状态变化及时更新自己的优先级。

VRRP 协议的工作机理与 Cisco 公司的 HSRP 有许多相似之处,二者的主要区别是在HSRP中需要单独配置一个IP地址作为虚拟路由器对外体现的地址,这个地址不能是组中任何一个成员的接口地址。

使用VRRP协议不用改造目前的网络结构,最大限度地保护了当前投资。并且只需最少的管理费用,却大大提升了网络性能,具有重大的应用价值。

和HSRP相比,VRRP有如下特点。

  1. 在功能上VRRP和HSRP非常相似,但是就安全而言,VRRP的一个主要优势是允许参与VRRP组的设备间建立认证机制。并且不像HSRP那样要求虚拟路由器不能具有其中一台路由器的IP地址,VRRP允许这种情况发生。但是为了确保万一失效发生时终端主机不必重新学习MAC地址,它指定使用的MAC地址为00-00-5e-00-01-VRID,这里的VRID是虚拟路由器的ID(等价于一个HSRP的组标识符)。
  2. VRRP的状态机比HSRP的状态机要简单,HSRP有6种状态,即初始(Initial)、学习(Learn)、监听(Listen)、对话(Speak)、备用(Standby)和活动(Active)状态,以及8个事件;VRRP 只有 3 个状态,即初始(Initialize)、主(Master)和备用(Backup)状态,以及5个事件。
  3. HSRP有3种报文,而且有3种状态可以发送报文,即呼叫(Hello)、告辞(Resign)和突变(Coup);VRRP 有一种 VRRP 广播报文,由主路由器定时发出通告其存在,使用该报文可以检测虚拟路由器各种参数并用于主路由器的选举。
  4. HSRP将报文承载在UDP报文上,而VRRP承载在TCP报文上(HSRP使用UDP1985端口向组播地址224.0.0.2发送hello消息)。
  5. VRRP协议包括3种主要的认证方式,即无认证、简单的明文密码和使用MD5哈希运算消息认证码(Hash-based Message Authentication Code,HMAC),以及 IP认证的强认证。强认证方式使用IP认证头标(Authentication Header,AH)协议。MD5 HMAC使用一个共享的密钥产生hash值,路由器发送一个VRRP分组产生MD5 hash值并将其置于要发送的通告中。接收方使用相同的密钥和MD5值重新计算分组内容和分组头的hash值。如果结果相同,这个消息真正来自于一台可信赖的主机;如果不相同,则必须丢弃,这样可以防止攻击者通过访问LAN而发出能影响选择过程的通告消息或者使用其他方法中断网络。
  6. VRRP包括一个保护VRRP分组不会被另外一个远程网络添加内容的机制(设置TTL值=255,并在接收时检查),这样就限制了可以进行本地攻击的大部分缺陷;另一方面,HSRP在其消息中使用的TTL值是1。
  7. VRRP的崩溃间隔时间为3×通告间隔+时滞时间(skew-time)。

4、VRRP工作原理

1. 工作过程

VRRP 协议将局域网的两台或多台路由器设备虚拟成一种设备,对外提供虚拟路由器IP地址,而在路由器组内部实际拥有这台对外IP地址的路由器。如果工作正常,则为主路由器或者是通过算法选举产生。主路由器实现针对虚拟路由器IP地址的各种网络功能,如ARP请求、互联网控制报文协议(Internet Control Messages Protocol,ICMP),以及数据的转发等;此外主路由器还每隔一个 Advertisemem_Interval 间隔在局域网广播一个关于自己的报文,其他路由器的状态为备用,除了接收主路由器的 VRRP 状态通告信息外不执行对外的网络功能。当主路由器失效(down)时备用路由器将接管原先主路由器的网络功能,这样无论如何切换均可保证给终端设备的是唯一一致的IP地址和MAC地址,从而减少了切换对终端设备的影响。

配置 VRRP 协议时需要配置每台路由器的虚拟路由器 ID(VRID)和优先权值,VRRP在组建初期优先级对于路由器来说是决定其是否能成为主路由器的重要值;VRID 对于一台路由器的所属身份是一个标识。一台VRRP路由器有唯一的VRID,取值为0~255。该路由器对外表现为唯一的虚拟MAC地址,地址的格式为00-00-5E-00-01-[VRID]。

VRID为VRRP虚拟组编号,由两位16进制数组成且取值为00~FF,具有相同VRID值的路由器为同一个组。在一台VRRP路由器中用{接口,VRRP ID}二元组来唯一表示一台VRRP虚拟路由器。在同一个备用组中当主路由器变换时虚拟MAC地址不会变,虚拟路由器回应ARP请求时使用虚拟MAC地址,以确保主和备路由器之间的切换是透明的并且消除了单点故障。

VRRP协议使用多播数据来传输VRRP报文,其控制报文只有一种,即VRRP广播报文(Advertisement)。它使用 IP 多播数据包封装,组地址为 224.0.0.18,发布范围只限于同一局域网内。这样保证了VRRP协议可以应用于不同类型的局域网,并且VRID在不同网络中可以重复使用。VRRP报文使用特殊的虚拟MAC地址发送数据,而不是路由器自身网卡的MAC地址。VRRP运行时为了减少网络带宽消耗,只有主路由器才可以定时发送VRRP广播报文。

VRRP 报文有两个作用,即用于主路由器选举和向备用组中的其他成员通告自己的状态。当路由器已经成为主路由器时需要广播自己的优先级和IP地址等信息;备用路由器只接收VRRP数据,不发送数据。当主路由器广播其优先级为0或达到Master_Down_Interval时间间隔而没有再次发出广播包时会被认为失效,各备用路由器将宣告自己成为主路由器并发送广播信息,重新进行主路由器选举。

当组内有多台备用路由器时将有可能产生多台主路由器,这时每一台主路由器就会比较 VRRP 报文中的优先级和自己本地的优先级。如果本地的优先级小于 VRRP 中的优先级,则将自己的状态转为备用路由器;否则保持自己的状态不变。通过这样一个过程将优先级最大的路由器选举为新的主路由器,完成 VRRP的备用功能。

为了保证VRRP协议的安全性,提供了两种安全认证措施,即明文认证和IP头认证。明文认证方式要求在加入一个VRRP路由器组时必须同时提供相同的VRID和明文密码,它可避免在局域网内的配置错误,但不能防止通过网络监听方式获得密码;IP头认证的方式提供了更高的安全性,能够防止报文重放和修改等攻击。

2. VRRP工作原理

如下图所示为VRRP 的实现原理:

VRRP 将局域网的一组路由器(包括一台主路由器和若干台备用路由器)组织成一台虚拟路由器,称为“一个备用组”。

这台虚拟的路由器拥有自己的IP 地址10.100.10.1(这个IP地址可以和备用组内的某台路由器的接口地址相同),备用组内的路由器也有自己的 IP 地址(如主路由器的地址为10.100.10.2,备用路由器的地址为10.100.10.3)。局域网内的主机仅仅知道这个虚拟路由器的IP 地址,而并不知道具体的主路由器的 IP 地址,以及备用路由器的 IP 地址。

它们将自己的默认路由下一跳地址设置为该虚拟路由器的 IP 地址 10.100.10.1,于是网络内的主机通过这台虚拟的路由器来与其他网络通信。如果备用组内的主路由器故障,备用路由器将会通过选举策略选出一台新的主路由器继续为网络内的主机提供路由服务,从而实现网络内的主机不间断地与外部网络通信。 

3. 选举机制

在一个 LAN 中一个 VRRP备用组由拥有相同 VRID的路由器组成,管理员可以手工设定VRID,其取值为l~255。一台运行VRRP协议的路由器可以加入到不同的备用组中,并参与对不同的主路由器的备用。

在一个VRRP的备用组中只有一台路由器执行虚拟路由器的功能,这台路由器就是主路由器。主路由器依靠优先级大小选举,优先级的可选范围是0~255,但是管理员可以配置的优先级范围是l~254。

优先级最大的是主路由器,虚拟IP地址的拥有者一般都被作为主路由器,优先级的配置原则依据链路的速率和成本、路由器性能和可靠性,以及其他管理策略设定。如果优先级相同,比较接口的 IP 地址。IP 地址大的成为主路由器;其他路由器作为备用路由器随时监测主路由器的状态,并准备接替主路由器的工作。

VRRP 提供了优先级抢占机制,如果配置了这个策略,高优先级的备用路由器会取代低优先级的主路由器而成为新的主路由器。

主路由器正常工作时每隔一定的时间间隔发送一个VRRP组播报文告之备用组内的路由器其工作正常,VRRP报文的时间间隔可由管理员设定。

如果主路由器在一定时间间隔内没有发送 VRRP 报文且备用组中的路由器只有一台,则它会将自己状态转换为主路由器;如果备用组内的路由器有多台,则可能会同时产生多台欲转变状态的路由器,它们之间必须通过竞选的机制才能维持 VRRP 网络的稳定运行。

每台参与竞选的路由器不仅会接收报文,也会发送报文。如果收到的报文中的优先级比本地低,则路由器继续广播报文;如果比本地路由器高,则保持原态,即备用状态。通过这样一个过程最终会收敛为 VRRP 的备用组中只剩下一台路由器,该路由器会改变自己的状态成为主路由器。

5、VRRP状态转换

VRRP在实际的运行过程中包括3种基本状态,即初始、备用和主状态,后两种状态的迁移都随VRRP的启动而启动。

处于任何一个虚拟组中的任何一台实际的路由器在任意时刻只能处于 3 种状态中的一种,从路由器刚刚配置各参数到使能期间或路由器接口为 down 时都为初始状态。一旦启动VRRP,则开始状态迁移。

主和备用状态都为运行状态,主状态负责转发数据包;备用状态负责监视主路由器的运行。在一个备用组中只能有一台优先级最高的VRRP路由器处于主状态,其余均为备用状态。

3种状态的转换如下图所示:

各转换过程的触发时机如下。

  1. 如果这台路由器的优先级被定义为最大255,则是当一台位于备用组中的路由器启动VRRP协议时。
  2. 当一台为主状态的路由器收到关闭消息时。
  3. 如果这台路由器的优先级被定义为小于255,则是当一台位于备用组中的路由器启动VRRP协议时。
  4. 当一台为备用状态的路由器收到关闭消息时。
  5. 当一台为备用状态的路由器在主路由器响应时间内没有收到主路由器的报文时。
  6. 当一台主状态的路由器收到一个比自己优先级高的报文时。

下面说明处于不同状态下的路由器的行为。

1. 初始状态

路由器系统启动后进入此状态,当接入网络的某个接口开启VRRP以后将转入备用(优先级不为255时)或主状态(优先级为255时),此状态下路由器不会处理VRRP报文。

其逻辑流程如下:

IF优先级等于255(即该VRRP路由器是IP地址的拥有者,即虚实相同的路由器会自动获得)
{
该路由器发送一个ARP给所有局域网的主机,内容为虚拟IP——虚拟MAC的对应关系,使得局域网主机可以用这个MAC和IP地址封装数据包.开启广播间隔计时器 Advertisement Interval,并定期广播报文发送一个VRRP通告报文:转换自己的状态为 Master
} ELSE
{
创建间隔为Master Down Interval的广播超时定时器;将状态Initialize迁移到Backup。
}

这个过程表明优先级是255的虚实IP相同的路由器是整个VRRP拓扑中最优的,它不需要和其他路由器比较而直接进入主状态。如果一台路由器的优先级不是 255,则直接进入备用状态,并开启备用状态特有的超时计时器开始监听主路由器的存在和状态。

2. 备用状态

该状态用来监视主状态路由器的可达性和状态,当路由器处在该状态时将会做下列工作。

  • 接收主路由器发送的VRRP多播报文,从中了解其状态。
  • 对虚拟IP地址的ARP请求不做响应。
  • 丢弃目的MAC地址为虚拟MAC地址的IP报文。
  • 丢弃目的IP地址为虚拟IP地址的IP报文。

该状态下的逻辑流程如下:

IF 接口发生类似链路中断的接口shutdown
{关闭Master超时定时器;状态由Backup退回到Initialize}
IF Master_Down_Interval超时器超时
{
IF允许抢占
{
IF延时时间为0或抢占延时标示置位
{
发送一个VRRP广播报文:针对虚拟IP地址广播的ARP报文,向外宣告自己为Master;启动广播间隔定时器Advertisement_Interval;将状态由Backup转换到Master。
}
ELSE
{将通告定时器设为延迟时间,设置抢占延时标志。}
}
ELSE 如果不允许抢占
{重新设置Master Down Interval为0,继续监听 Master}
}
IF收到通告报文
{ 
IF报文优先级为0
{设置通告定时器间隔为Skew_Time}
ELSE
{IF抢占方式为假(FALSE)或者报文的优先级大于本地优先级
{重设通告定时器间隔Master_Down_Interval为0}
ELSE{直接丢弃该报文}
}
}

该状态的转换机制可以分为3种。

  • 如果处于该状态的路由器的链路断开或管理员手工关闭了VRRP协议功能,则路由器会首先关闭Advertisement_Interval定时器,然后路由器的备用状态0会直接转换为初始状态。
  • 如果没有中断意外发生,则一直进行主路由器超时计时器计时。如果超时没有收到VRRP 发过来的报文并且 VRRP 设置为允许抢占且延时时间为 0,则备用路由器“自立为王”,对外宣称自己为主路由器;并且针对虚拟IP地址广播免费ARP报文,设置通告定时器 Advertisement_Interval;如果允许抢占且延时时间不为 0,则将通告定时器设为延迟时间;如果不允许抢占,则使用 Master_Down_Interval重新对主路由器进行计时。
  • 以上都是没有收到主路由器的报文情况,如果收到其非正常报文,则路由器的状态也有可能会发生迁徙。如果收到报文的优先级字段小于本地路由器的优先级,则认为外部路由器自动降低了其优先级。可能是管理员设置该路由器不再做主路由器,降低自己优先级的路由器仍然可以正常转发数据;如果在 Master_Down_Interva 时间内仍然收到这种低优先级的报文3次,则出现超时,路由器的备用状态会转变为主状态并参与主路由器的选举。

如果收到优先级为0(即主路由器可能关闭)的VRRP报文,备用路由器不会立刻迁徙到主状态;因为如果所有的备用路由器都同时收到优先级为 0 的报文且迁徙到主状态发送VRRP 报文,则会造成网络的混乱。状态机的设计是把主状态的超时计数器设置为Skew_Time。由于Skew_Time=(256-Priority)/256,因此优先级越高,越快进入主状态。

所有的路由器虽然都能同时收到优先级为0的报文,但是不能以此进入主状态。实际上首先进入主状态的路由器广播VRRP通告,使得其他路由器还没有来得及进入主状态就已经收到优先级比自己高的VRRP报文;同时重置自己的主路由器超时器并保持备用状态。这样可以减少网关出现故障时网络的切换时间,尽量加快拓扑的收敛,减少网络负担。

3. 主状态

当处在该状态时,VRRP路由器必须担负虚拟路由器的角色负责如下工作。

  1. 定期发送VRRP广播报文。
  2. 发送ARP报文,以使网络内各主机知道虚拟IP地址所对应的虚拟MAC地址。
  3. 响应虚拟 IP地址的 ARP请求,并且响应的是虚拟 MAC地址,而不是接口的真实MAC地址。
  4. 转发目的MAC地址为虚拟MAC地址的IP报文。
  5. 如果它是这个虚拟IP地址的拥有者(IP Address Owner),则接收目的IP地址为这个虚拟IP地址的IP报文;否则丢弃这个IP报文。

在该状态下的逻辑流程如下:

IF Master路由器的某个连接局域网的接口发生shutdown事件
{
删除广播间隔Advertisemem Interval定时器;发送优先级为0的VRRP广播报文,表明本路由器放弃Master地位;设置本路由器的状态由Master转移到Backup状态。
}
IF 广播间隔Advertisemem_Interval定时器到时
{
发送正常的本路由器的VRRP广播报文;将广播间隔Advertisement Interval计时器清零,重新开始计时。
}
IF收到其他路由器的一个报文{
IF收到的其他路由器的VRRP报文中显示该路由器的优先级为0
{
立刻发送本路由器的一个 VRRP广播报文;将本路由器的广播间隔Advertisement_Interval定时器清零0
}
ELSE
{
IF 报文中的优先级大于本地路由器的优先级或虽然优先级相等,但发送者接口的 IP 地址大于本地路由器接口的实际的IP地址
{
将通告定时器间隔由Advertisement_Interval修改为Master_Down_Interval;将本地路由器的状态由Master转换到Backup状态。
}
ELSE
{丢弃报文}
}
}

本状态过程总共定义了如下3种情况:

  1. 当主路由器的下联局域网的端口出现意外中断时,将置自己的优先级为0并删除广播定时器,将状态由主状态迁徙到备用状态。
  2. 当主路由器中的Advertisement_Interval定时器到时间时,将发送包含优先级和定时器时间信息的VRRP报文,以证明自己是主路由器。
  3. 当主路由器收到其他路由器的竞争挑战时,如果竞争者的优先级为0或比自己低或相等且接口的IP地址比自己小,则立即发送主路由器的VRRP报文以证明自己才有资格成为主路由器,同时将本地路由器的定时器清零;如果竞争者的优先级比自己高或优先级相等且接口的IP地址比自己大,则将本路由器的广告定计时器改为主路由器失效定时器,然后将状态由主改为备用。

6、报文格式

VRRP 广播报文的源地址为主路由器接口的主 IP 地址;目的 IP 地址必须为组播地址,即224.0.0.18,这是一个本地链路范围的多播地址。对这类IP报文,路由器忽略其TTL均不转发;此外,IP数据报TTL域值必须为255,VRRP路由器收到TTL值不等于255的VRRP的报文将会丢弃。IP数据报首部协议字段为十进制的112。

VRRP协议是运行在网络层的协议,在静态模式下它只有一种协议报文,即Advertisement广播报文;在动态模式下有广播和负载两种报文。VRRP的报文封装与 ICMP 报文类似,都是封装在IP报文在网络中传输,然后在IP报文前封装MAC地址成帧后在网络中传输。

下表为VRRP的报文格式:

MAC帧头分为两部分,即源MAC地址和目的MAC地址,如下表所示。 

1. 链路层协议头-MAC帧头

目的MAC地址分为两种,如果是广播报文,则为组播地址224.0.0.18对应的组播MAC地址;如果是负载报文,则为整个备用组的虚拟MAC地址。

源 MAC 地址也分为两种,如果是广播报文,则为备用组的虚拟 MAC 地址00-00-5E-00-01-{VRID)。VRID 为虚拟路由器 ID 值,16 进制格式,所以同一网段中最多有255台VRRP路由器;如果是负载报文,则目标MAC地址为接口的实际MAC地址。

2. IP报文格式

VRRP的IP报文格式如下表所示:

源IP地址为主路由器接口的主IP地址;目标IP地址分为两种,第1种是广告报文,即组播地址为224.0.0.18。这是一个本地多播IP地址,用这个目标地址封装的IP地址不管TTL值为多少,路由器都不会转发;第2种负载报文为备用组的虚拟IP地址。

VRRP的IP数据包中的生存期为255,如果VRRP备用组中的路由器收到TTL值不等于255的VRRP报文,则会丢弃。

VRRP的IP报文中的协议字段的值为十进制的112。

3. 报文封装格式

封装在IP包中的VRRP报文格式,如下表所示。 

说明:

  1. 版本号:VRRP的版本号,4位。在RFC3768中定义为2。
  2. 类型:VRRP报文类型,4位。目前只定义了一种类型,即广播报文,取值为1。
  3. VRID:虚拟路由 ID,8 位。一个 VRID 用来唯一地标识一个 VRRP 备用组,该报文中的VRID表示该报文所属的备用组。
  4. 优先级:表示发送该报文的VRRP路由器的优先级,用8位无符号整数表示,取值范围是0~255。如果值为0,则有特殊含义。发出为0的优先级报文的路由器表示该主路由器自动放弃其主控地位,这将导致其余备用路由器进行另一轮的主路由器选举。如果某一台路由器的IP地址为虚拟IP,则其为IP_address_owner,其优先级会自动设为255;除此以外取值范围为1~254。如果管理员没有对其进行任何的配置,则默认值为100。
  5. 虚拟IP地址数:8位,表示VRRP广播报文中的虚拟IP地址数量,正常情况下为1。
  6. 模式:4位,表示备用组负载分担模式。如果是静态负载分担,则为0;如果是动态负载分担,则为1。
  7. 认证类型:4位,同一个备用组中认证类型必须相同。如果在备用组中的VRRP路由器收到和自己认证类型不一样的数据广播包,则丢弃。认证类型有如下3种。
    0:表示没有认证,报文中的验证数字字段将全设为 0 或者接收报文方将忽略认证数据。
    1:表示通过没有加密处理的简单字符进行认证,验证数据段中填写的是认证字符串。报文接收者将与自己所配置的认证字符串比较,不一致则将报文丢弃。这种认证方法其实没有任何安全性可言,黑客可能通过某些途径截获报文,然后直接看到认证字符串。
    2:表示MD5认证,验证数据字段填写的是认证字符串和其他需要认证的内容,通过MD5算法得到报文摘要。
  8. VRRP广播周期:VRRP发送广播报文的周期,8位。单位是秒,默认是1秒,在一个备用组中VRRP的广播周期必须相同。
  9. 校验和:16位,用于校验本报文在网络的传输过程中有没有出现损坏。报文的发送方在该字段写上 0,然后计算整个报文的校验和填入该域。接收方得到报文后用同样的方法计算校验和,结果必须是0。
  10. IP地址:备用组的虚拟IP地址。
  11. 验证数据:认证数据,字段和类型由验证类型字段的值指定。 

4. 接收数据时的验证

收到VRRP数据包时要执行以下验证,不满足的数据包将被丢弃。

  1. TTL必须为255。
  2. VRRP版本号必须为2。
  3. 一个包中的数据字段必须完整。
  4. 校验和必须正确。
  5. 必须验证在接收的网卡中配置了VRID值,而且本地路由器不是IP地址的拥有者。
  6. 必须验证VRRP认证类型和配置的一致。

5. 负载报文格式

VRRP负载报文的格式如下表所示:

负载字段取值为 0~100,MAC域为备路由器对应接口的实际 MAC地址。IP地址字段是接口的实际IP地址,类型是2,其他字段和VRRP广播报文的表示含义相似。 

猜你喜欢

转载自blog.csdn.net/qq_35029061/article/details/128792698