您好!BGP负载分担技术是一种在多链路互联的BGP邻居之间实现流量按需负载分担的方法,可以有效提高链路利用率和降低组网成本。但是目前常见的实现方法要么对硬件要求较高,要么配置复杂不易,不便于在大面积网络特别是电信运营商网内灵活部署。利用BGP路由寻址的特点,采用多重递归的方式实现了按链路带宽的比例分配流量的非等价负载分担。这种方法原理简单,易于操作,具备较好的扩展性。

CMP(Equal-Cost Multi-Path)解决了多链路流量负载均衡问题,从而在一定程度上提高了网络的可靠性。目前,中国主要的电信运营商已经将ECMP功能作为BGP接入的备选方案推荐给用户,同时众多主流电信设备供应商如思科、华为、Juniper和中兴等也纷纷宣布对这一功能的支持。

2. 非等价负载分担的提出

以图1为例,考虑两个路由器R1和R2之间的两条物理链路:第一条是点对点的串行链路,带宽为2.5 Gb/s;第二条是广播型的以太网链路,带宽为10 Gb/s。如果在R1和R2上开启ECMP功能,那么每条链路的最大流量将不超过2.5 Gb/s。否则,串行链路会因为流量超过带宽值而导致丢包,此时的以太网链路还有10 Gb/s-2.5 Gb/s=7.5Gb/s的带宽处于闲置状态。

如何既能让去往同一目的IP的流量承载在不同的链路上,又能充分利用带宽高的链路资源?这就需要实现非等价负载分担的需求。目前,常见的非等价负载分担方法包括策略路由、流量工程和MPLS VPN等。然而,这些方法要么对设备性能要求较高,要么需要与BGP邻居紧密合作对各种数据流进行分类和打标签,同时在路由过程中进行双向控制,使得配置过程复杂且无法根据业务流量和中继链路的变化灵活部署和扩展[2]。

3. 路由寻址与递归过程

路由寻址算法的本质就是在路由表中寻找与目的IP地址前缀最长匹配项。如图2所示,一旦目的IP被放入路由表,它的前缀就会被哈希到特定的桶中。寻址的过程就是从哈希表中的第一条记录开始,将被哈希的关键字与给定的掩码值(从32到0)逐个进行比较。如果某个哈希的关键字与给定值完全相等,则查找成功,相应的路由协议会将包含目的IP的数据包送入对应的出接口;反之,如果直到最后一个记录其关键字和给定值都比较不到相等为止,则查找失败,包含目的IP的数据包将被送到默认网关(如未设默认网关,数据包则会被丢弃)。

路由寻址哈希算法描述如下:

```c

int Search(int d, int a[], int n)

{

int i;

for (i = n - 1; a[i] != d; --i);

return i;

}

```

其中a表示数组元素,n表示数组长度。

路由寻址算法的重构如下:

1. 目标地址、掩码和下一跳是路由的三个基本元素。只有计算出有效的下一跳,IP协议才能逐跳地将数据包送往目的地。

2. 对于路由器而言,有效的下一跳分为两个层面:转发层面(FIB,转发信息库)和控制层面(RIB,路由信息库)。在转发层面,有效的下一跳是指本路由器到达目的IP所经的出接口;在控制层面,它是通过查找路由表中进行最长掩码匹配的哈希算法查找的结果,是一个IP地址。如果这个IP地址对应一个直连出接口,它就是一个有效的下一跳,可以被直接映射到转发表中参与指导数据包的转发;如果这个IP地址没有对应的直连出接口,则需要进行递归查找,最终找到对应的直连出接口为止。

3. 在实际应用中,由于查找下一跳的次数不是固定的(用A表示),并且经过本次递归查找后下一跳是否有对应的直连接口也不确定(用B表示),因此每一轮递归查找就是一个CheckNode过程。

4. 以图1为例,AS100网内的用户希望向AS200网内的文件服务器(IP地址200.0.0.1)传送文件,并根据两条互联链路带宽的比例(2.5 Gb/s∶10 Gb/s=1∶4)分配数据流量。具体配置如下表所示:

设备名 | R1 | R2 | Loopback0 | 接口 | IP地址 | 链路带宽 | 链路流量占比 | 需求

---|---|---|---|---|---|---|---|---

R1 | Serial | GigabitEthernet | 1.1.1.1/32 | 22.0.0.1/24 | 5/11 | 2.5 Gb/s | 1份 | 21.0.0.1/24 | 5/11 | 2.5 Gb/s | 1份 | 21.0.0.1/24 | 5/11 | 10 Gb/s | 4份

R2 | Serial | GigabitEthernet | 2.2.2.2/32 | 22.0.0.2/24 | 5/11 | 10 Gb/s | 4份 | 21.0.0.1/24 | 5/11 | 2.5 Gb/s | 1份 | 21.0.0.1/24 | 5/11 | 2.5 Gb/s | 1份

在本例中,R1与R2通过双方的环回口(loopback0)建立EBGP邻居关系。因此,对于R1来说,到达AS200网内的目的IP 200.0.0.1的下一跳地址就是R2的loopback0的地址 2.2.2.2。以下是关于此过程的详细步骤:

1. 第一步:指定新的目的IP和下一跳地址

为了通过递归寻址影响BGP的选路,在R1侧,将 2.2.2.2/32 作为新的目的IP,并分配5个虚拟IP地址作为它的下一跳。选择5个虚拟IP地址的原因是链路带宽比例为1∶4,可以将数据流量分成1+4=5份。配置完成后,检查到达 2.2.2.2/32 的路由。如图4所示,每个下一跳均为“traffic share count is 1”,代表这5个下一跳之间是等价的。注意:由于这些虚拟IP地址仅用于本地路由表的递归寻址,并不需要广播到互联网中,因此建议使用私网地址,本例中使用的是 192.168.1.1~192.168.1.5。

2. 第二步:将虚拟下一跳引入路由表

根据实际链路的带宽比例(1∶4)为这些下一跳地址分配出接口(本例中串口被分配1次,以太口被分配4次),如图5所示。一旦虚拟下一跳地址关联了出接口,指向虚拟IP地址的静态路由就变为合法路由,将被放入路由表中,参与对目的IP的递归寻址过程(查找有效的下一跳)。

3. 第三步:寻址过程分析

从控制层面看(如图6所示),在R1的路由表(RIB)中查找到达目的IP 200.0.0.1 的路由,首先会查到它的下一跳地址 2.2.2.2,但由于没有对应的出接口,需要进行一次递归查找;以 2.2.2.2 作为目的IP,经过第一次递归查找,发现到达 2.2.2.2 有5个等价的下一跳地址,分别是 192.168.1.1~192.168.1.5。由于这5个下一跳依然没有对应的出接口,因此需要再进行一次递归查找;经过第二次递归查找,5个下一跳都找到了对应的出接口,路由寻址过程结束[6]。

从转发层面看(如图7所示),转发表(FIB)中去往目的IP 200.0.0.1 的数据包被等价地分配到5个出口:1份流量由点到点的串口链路(Serial5/1)承载,剩下的4份流量由广播型的以太口链路(Gigabit1/0)承载。这样就实现了预先设定的需求:在两条链路上实现按1∶4的流量进行转发,即非等价负载分担。

实际案例证明,通过在路由寻址过程中增加递归过程,可以实现灵活的等价或非等价负载分担。相比常用的策略路由,这种方法不需要对特定数据流量进行分类标记,配置更加简单。此外,用于递归算法的下一跳使用的是私网地址,不消耗公网资源,部署起来也相对方便。

需要强调的是,本例中的EBGP邻居R1和R2并未开启等价多路径(ECMP)功能。对于目的IP200.0.0.1,在R1的BGP数据库中只有2.2.2.2/32这一个下一跳,而不是多个下一跳。因此,本方法并非在BGP协议内实现非等价负载分担,而是借助BGP协议中“下一跳”的概念,通过路由表中的多重递归实现流量非等价分担的效果,这与BGP的等价多路径选路原则并不矛盾。

另外,本文介绍的非等价负载分担方法适用于通过环回口建立的EBGP邻居。对于通过直连接口建立的EBGP邻居,可以在双方的直连接口上配置若干个second IP作为到目的IP的下一跳地址,再经过路由递归查找,也能实现非等价负载均衡的效果。具体配置方法本文不再赘述。

参考文献:

[1] STEWART J.BGP4: Interdomain Routing in the Internet[M]. USA Addison Wesley, 1998.

[2] 萨姆·哈拉比. Internet 路由结构(第2版)[M]. 孙剑,孙余强译. 北京:人民邮电出版社,2015.

[3] 布莱恩特,奥哈拉伦。深入理解计算机系统(第2版)[M]. 北京:机械工业出版社,2011.

[4] 维斯。数据结构与算法分析:C语言描述[M]. 冯舜玺译。北京:机械工业出版社,2004.

[5] 艾云霄,谭跃生,王静宇,等。 MooseFS中chunkserver负载均衡算法研究[J]. 微型机与应用, 2013, 32(5): 1-3.

[6] SCUDDER J, CHANDRA R. RFC 5492:Capabilities Advertisement with BGP4[EB/OL]. (2009-02-xx). http://tools.ietf.org/html/rfc5492