《BGP设计与实现》读后感及总结之1

最近正看《BGP设计与实现》,发现这本书写的非常好,非常贴近实际应用,里面介绍的技术及知识对常见问题也非常有价值,为了更好地理解里面的知识,把大概内容总结下,作为查漏补缺,由于内容很多,所以看一部分总结一部分。

第1章:高级BGP介绍

没什么可讲的,主要从宏观上简单介绍了BGP。

第2章:理解BGP的主要部件

这章包括一些比较不错的知识,如下所列(自认为重要的,无法把整章都搬到这来):
1. BGP进程由BGP I/O(主要负责读取TCP),BGP Router(主进程,负责初始化BGP,维护邻居及发送更新等)和BGP Scanner(对BGP RIB级Ip RIB进行周期扫描,确认有效的前缀或下一跳地址)三个子进程组成。
2. 对BGP的各个属性,如ORIGIN,AS_PATH,Community,CLUSTER_LIST等进行总体介绍,比较全。
3. 13条决策过程,很详细,根据这些信息,又重新更新了我之前总结的《CCIE SP — BGP 13条选路原则》。
4. BGP在建立邻居时,会用Open信息中的Optional Parameter字段协商“能力”,如多协议扩展,Graceful restart,Outbound Route Filter(ORF)等
5. 详细介绍了所有交换方式,Process Switch -> Fast Switch -> Optimized Switch -> Flow Switch -> CEF/DCEF Switch
6. 对于CEF又进程了详细阐述:CEF是转发方法,不是真实存在的表,它由两个表组成,FIB和ADJ(由arp得来)。其中FIB是从RIB克隆而来,所以RIB变化时,会直接反映给FIB,但FIB的结构跟RIB不一样,已经优化为MTRIE多路数据结构,这个结构中存放的是索引,真实数据存在别的地方。


7. 关于CEF的一些常用表项也做了说明,如attached,connected,receive,recursive,Null,Glean,Punt,Drop,Discard
8. 对于负载分担做了简单介绍,不是非常详细,关于负载分担的相关信息,可以参考以前的总结《Multi Hierarchical CEF / Load Share》和《7609 Load Balance Issue and Polarization

第3章:调整BGP的性能

这里面介绍了如何优化BGP的性能,方法非常实用:
1. 由于BGP是基于TCP的,所以首先从优化TCP入手:TCP MSS、TCP窗口(在收到ACK前可以发送数据的大小)和PMTUD,关于TCP MSS和PMTUD,可以参考之前总结的《MTU,MPLS MTU,IP MTU深入讨论》中“2012-10-1 更新:TCP MSS”。
2. 其次优化队列,协议报文要经过input queue到CPU,为了防止高优先级的报文,又对入队列添加了SPD技术作为补充。如下图所示,SPD又分为headroom和ext headroom,默认最大门限是73,最大门限是74,input queue的大小可称为GPQ(General packets queue)有以下几种情况:
– 当74 > GPQ > 73 时,SPD随机丢弃普通优先级的数据包
– 当74 < GPQ 时,SPD完全丢弃普通优先级的数据包

3. 最后数据包经过队列后,会暂时缓存在buffer中等待CPU处理,可以通过“show buffer”去确认是否需要调整,书中也介绍了如何调整。另外更详细的buffer工作方式,可以参考《IOS Architecture》这本书,里面有更详细的介绍。
4. 通过优化更新数据包的生成方式提高BGP的收敛能力,其中对等体组(不仅仅是减轻配置量,可以用复制的方式传递给client,节省资源),更新打包增强(相当于优化了BGP的算法,具体区别没看明白,找时间看看原版)
5. 分别对BGP fast external fallover,收敛时间增量(可以让IGP等待BGP建立完后才active,防止路由黑洞,其中isis用路由过载,ospf用最大metric)和NSF/GR进行了介绍,感觉翻译的不是非常清楚,找时间看原版
6. 在这章的最后,通过更改上面介绍过的优化方法,对BGP收敛做了一系列的测试,从测试结果可以看出优化的效果还是很明显的。

第4章:有效的BGP策略控制

1. 对正则表达式做了详细介绍,比较全面
2. 对前缀列表,ge和le做了比较全面的介绍(关于相关实验,可参考之前总结的《前缀列表的讨论 Prefix-list》)。另外还用过时的扩展ACL(控制掩码)与前缀列表对比说明
3. 对COMMUNITY和路由映射做了介绍,并阐述了“与”和“或”的关系。下面是BGP过滤处理顺序:

另外如果配置了策略,但没有定义策略,默认执行下面动作:
– 对于分布列表和前缀列表,允许所有
– 对于过滤列表和路由映射,拒绝全部

2013-6-24 更新:bgp soft reset
Refer to inbound bgp soft reset, there are 2 way:
1. New feature for route refresh, that need peer neighbor support that.
If both support this feature, will not configure any addition command. When do “clear bgp ipv4 unicast x.x.x.x soft in”, BGP sends a REFRESH request to the neighbor if the neighbor has advertised the ROUTE_REFRESH capability.

2. Peer neighbor not support route refresh, you need config “soft-reconfiguration inbound”.
That will stores all paths received from the peer in an unmodified form and refers to these stored paths during the clear

Refer to outbound bgp soft reset, there are not need to config that. Direct to do “clear bgp ipv4 unicast x.x.x.x soft out”, BGP will resends all routes for the address family to the given neighbors.

Cisco ASR 9000 Series Aggregation Services Router Routing Configuration Guide, Release 4.2.x

4. 条件通告,感觉在实际中用不到……
5. 聚合和拆分,这个比较有用,如图所示,R4和R5分别发送172.16.0.0/16,对于R1来说可能他不知道/24的路由到底走哪条,所以可能会出现次优路径的情况,为了避免这种问题,可以通过条件注入把/24的路由放到R2和R3上,这样R1就正确的路径了。

6. 还介绍了QPPB(QoS Policy Propagation via BGP),BGP策略记账,都是利用了FIB叶结点的3种策略参数(Precedence,QOS-Group ID,Traffic Index),记得当时考SP时有这些。不过暂时没有发现这些功能的实际价值。。。
下面是一个QPPB的一个简单例子(不做过多说明,详细内容请看书):

2013-2-18 更新:
关于QPPB,跟其他QOS的优势主要在于它可以直接利用BGP的相关属性进行分类并使接受者更方便对不同分类进行策略定制,并且这些定制的内容可以直接下发到FIB表项中,然后直接在入接口match,做policing就可以了。
ASR1006(config-if)#bgp-policy ?
accounting bgp based policy accounting of traffic (input on default)
destination use destination IP address for route lookup
source use source IP address for route lookup

ASR1006(config-if)#bgp-policy destination ?
ip-prec-map map ip precedence bits
ip-qos-map set qos-group

2013-8-11 更新:
其实QPPB在一定情况下还是比较有用的,例如下面场景:
qppb-1
下联路由器需要穿过ASBR到达UK和HK,从下联路由器到ASBR之间只有100M的带宽。客户想合理利用这100M带宽,在达到拥塞时,保证让去往HK是70M,而去往UK的是30M,不拥塞时可以抢占。如果用正常的QOS,需要在下联路由器上对所有目标路由做标记,这个是被动的,而且需要知道目标路由的情况下,然后在出口match并做策略,如果是internet,未知的路由如何标记?这时如果用QPPB就会很简单,当路由经过ASBR发给下联路由器时,就已经把从HK和UK来的路由打上了不同的标记(可以用AS path来做)。对于下联路由器,根据这些标记的路由传送流量,到达ASBR进口后,会match标记实行队列管理(bandwidth)。这种方法有些问题,就是ASBR的LC需要支持input的QOS。

2014-11-26 更新:
根据上面的实例,中间那台只对入口做了策略,那么此端口可以对出向进行限制么,直接match qos-group?这样显然不行,注意实施QPPB分两个方面:1. 对路由做策略,符合AS好的打上qos-group;2. 针对流量,查找source/destination,使用qos-group。

对于流量来说,可以在端口用下面命令激活QPPB:

ipv4 bgp policy propagation input qos-group destination/source

仍然讨论上图,在中间路由器面对客户的入口打上上面命令,方向为destination,当流量上来后,查找流量的目的地址,如果是HK,查找QPPB的policy,属于HK AS设置qos-group1,这样流量就被设置了1,直接match此flag,进行input policy就可以了;如果要对出做限制,必须在流量进来的端口上激活QPPB,也就是面向HK的那个端口,激活QPPB,方向为source,当流量上来后,查找源地址,如果是HK,查找QPPB的policy,属于HK AS设置qos-group1,这样流量就被设置了1,在出口就可以直接使用这个flag了。

7. 本章的最后通过案例讲解了如何用local-as把两个AS合并成一个AS,注意这里的local-as不是Community重的local-as属性,而是伪装AS号。这个实验最好做一做,比较有意思。关于community的local-as,网上有人总结过,可以参考下:BGP Community: Local-AS的作用

2013-3-31 更新:
对于AS伪装(local-as),后面有几个参数,no-prepend, replace-as和dual-as,文档解释的不是很清楚,再此强调下,这里强调解释前两个:
no-prepend: Does not prepend the local autonomous system number to any routes received from the eBGP neighbor.
如果加了这个option,除了设置local-as的neighbor外(路由来自此neighbor),其他所有eBGP的peer都看不到这个伪AS号(如果仅仅配置local-as,其他peer也能看到这个伪AS号)。
replace-as: Replaces the real autonomous system number with the local autonomous system number in the eBGP updates. The autonomous system number from the local BGP routing process is not prepended.
如果在no-prepend的基础上又加了这个option,设置local-as的neighbor会受影响,用伪AS号替换真实的AS号,其他所有eBGP的peer不受影响。

网上也有人总结了,里面有图,更直观:BGP DUAL-AS 特性详解

本文出自 Frank's Blog

版权声明:


本文链接:《BGP设计与实现》读后感及总结之1
版权声明:本文为原创文章,仅代表个人观点,版权归 Frank Zhao 所有,转载时请注明本文出处及文章链接
你可以留言,或者trackback 从你的网站

One Response to “《BGP设计与实现》读后感及总结之1”

留言哦

blonde teen swallows load.xxx videos