BGP全称Border Gateway Protocol,中文译为边界网关协议,是目前互联网上唯一运行在自治系统之间的外部网关协议。在软考网络规划设计师的考纲中,BGP被列为路由协议板块的核心考点,不仅因为它支撑着全球互联网的互联互通,更因为它的设计思想与内部网关协议存在根本性差异,理解这种差异是网络规划师的基本功。
要准确理解BGP,必须先明确自治系统这个概念。自治系统简称AS,是指由单一机构管理、采用统一路由策略的一组路由器集合。每个AS拥有一个全球唯一的编号,即AS号。中国电信的骨干网是一个AS,中国联通的骨干网是另一个AS,阿里巴巴的数据中心网络又是一个AS。互联网的拓扑本质上是数万个AS通过BGP互相连接形成的网状结构。BGP的使命就是在这些AS之间交换路由可达信息,让北京电信的用户发出的数据包知道应该走哪条路才能抵达深圳联通的服务器。
BGP目前广泛使用的版本是BGP-4,由RFC 4271定义。与RIP基于距离向量算法、OSPF基于链路状态算法不同,BGP采用的是路径向量算法。路径向量可以理解为距离向量的升级版——它不仅告诉邻居"我到某个目的地有多远",还附上了"我打算走哪条路"的完整AS路径清单。这个设计一举解决了距离向量协议最头疼的计数到无穷问题,因为在路径向量中,只要某条路由的AS_PATH里包含了自己的AS号,就说明出现了环路,直接丢弃即可。BGP还是一种基于策略的路由协议,它的选路决策不单纯追求最短路径或最小开销,而是允许网络管理员注入丰富的策略规则。比如运营商可以配置BGP优先选择从付费对等伙伴学到的路由,而不是从免费对等伙伴学到的路由,这在商业运营中至关重要。
从协议栈位置看,BGP运行在TCP之上,使用端口号179。这一点与RIP基于UDP、OSPF直接封装在IP报文中截然不同。借助TCP的可靠传输能力,BGP不必自己实现分片重传、确认应答等机制,只需专注于路由信息的交换和策略处理。BGP路由器之间首先建立TCP连接,然后在这个连接上交换BGP报文。建立了BGP会话的两台路由器互称为BGP对等体,这种对等关系是BGP一切交互的基础。一台BGP路由器可以同时与多个对等体建立会话,从不同邻居学习路由,再根据自己的选路策略选择最优路径放入路由表。
BGP的核心算法是路径向量,理解它需要从数据结构和消息传播两个维度切入。在BGP中,每条路由信息都携带一组路径属性,其中最重要的是AS_PATH属性,它是一个有序的AS号列表,记录了该路由从源头传播到当前节点所经过的所有AS。假设一条路由源自AS 100,经过AS 200和AS 300后到达AS 400,那么在AS 400的BGP路由表中,这条路由的AS_PATH就是"300 200 100"。当AS 400要把这条路由继续通告给AS 500时,它会把自己的AS号400追加到AS_PATH的最前面,变成"400 300 200 100"。AS 500收到后,先检查AS_PATH里是否已经包含500——如果包含,说明这条路由曾经从自己这里出去过,现在又绕回来了,构成环路,直接拒绝。如果不包含,就正常接收并加入自己的BGP路由表。
每条BGP路由在路由器内部以网络层可达信息加上路径属性的形式存储。网络层可达信息包含目的网络前缀和掩码长度,路径属性则是一个键值对集合,除了AS_PATH外,还有ORIGIN标识路由的起源方式、NEXT_HOP指定到达该目的地的下一跳IP地址、LOCAL_PREF控制本AS内部的出站流量偏好、MED多出口鉴别器影响相邻AS的入站流量选择。这些属性构成了BGP选路决策的原始数据,选路算法就是在这堆属性之间做优先级排序。路径向量算法的本质是在路由传播的同时传递决策所需的全部上下文,让每台路由器可以基于全局信息做本地决策,这比距离向量只传递跳数要高明得多,也比链路状态需要全网洪泛拓扑数据要高效得多。
BGP对等体之间从启动到稳定建立会话,要经历一个严格的有限状态机转换过程,共包含六个状态。第一个状态是Idle空闲态,此时BGP进程已启动但尚未发起任何连接尝试。在这个状态下,路由器拒绝所有入向BGP连接请求,同时开始初始化TCP连接所需资源。第二个状态是Connect连接态,BGP主动发起TCP三次握手,如果TCP连接建立成功,状态跃迁到OpenSent;如果TCP连接失败,根据重试计时器的设置进入Active状态。第三个状态是Active活跃态,BGP继续尝试建立TCP连接,本质上它与Connect状态做的事情一样,只是Connect状态下的失败会导致Active状态,而Active状态下的失败会回到Connect状态,两者之间循环直到TCP连接成功或管理员干预。第四个状态是OpenSent已发送Open报文,此时BGP已经发送了Open报文并等待对方的Open报文,一旦收到合法且参数匹配的Open报文,状态过渡到OpenConfirm。第五个状态是OpenConfirm已确认Open报文,BGP发送Keepalive报文并等待对方的Keepalive确认,如果收到的Keepalive无误,进入最终的Established状态。第六个状态Established已建立,BGP会话完全就绪,对等体之间开始交换Update报文传递路由信息,这是BGP唯一可以发送和接收路由更新的状态。
BGP的路由更新策略是增量式而非周期式的。当BGP会话进入Established状态后,双方首先交换完整的路由表,这个过程通过连续发送Update报文完成。完成初始交换后,BGP只发送变化了的路由——新增的路由、撤销的路由、属性发生变化的路由。这种增量更新机制大幅降低了带宽消耗和CPU处理开销,是BGP能够支撑互联网规模的关键设计。为了维护会话的活性,BGP在没有路由变化时定期发送Keepalive报文,默认间隔为60秒,Hold计时器默认为180秒。如果一方在Hold时间内未收到任何Keepalive或Update报文,就认为对方已不可达,断开BGP会话,撤销从该邻居学到的所有路由。Notification报文用于在检测到错误时快速关闭会话,同时携带错误码告知对方关闭原因。
当一台BGP路由器从多个邻居收到了到达同一目的网络的多条路由时,它必须从中选择一条最优路径放入路由表并通告给邻居。BGP的选路决策不是简单比大小,而是按照严格的优先级顺序逐条比较十三条规则,直到某一规则分出胜负为止。第一条优先级最高的规则是优选具有最高本地优先级的路由。LOCAL_PREF是一个仅在本AS内部有效的属性,数值越大越优先,默认值为100,管理员通常用它来决定出站流量的主备出口。第二条是优选具有最大权重的路由,权重是思科私有属性,仅供本路由器内部使用,不传递。第三条优选本地始发的路由,即本路由器通过network命令或重分发生成的路由优于从邻居学到的。第四条优选具有最短AS_PATH的路由,这是最直观的选路依据——经过的AS越少路径越优。第五条比起源类型,IGP优于EGP,EGP优于不完全。第六条比MED值,也叫度量值,数值越小越优先,但MED只在来自同一个相邻AS的多条路由间比较。第七条比路由来源,eBGP优于iBGP。第八条优选到NEXT_HOP的IGP开销最小的路由。第九条检查是否为EBGP多路径,如果是则安装多条等价路径。第十条优选最老的路由,即最先学到的eBGP路由优先,这个规则旨在惩罚频繁震荡的路由。第十一条优选邻居路由器ID最小的路由。第十二条优选邻居IP地址最小的路由。这十三条规则环环相扣,构成了BGP选路的完整决策树,也是网络管理员实现精细化流量工程的核心工具。
BGP对等体关系按所处的AS位置不同,分为eBGP和iBGP两大类。eBGP是指位于不同AS之间的BGP对等体关系,iBGP是指位于同一AS内部的BGP对等体关系。这个分类不是简单的命名差异,两者在行为上有本质区别,软考命题人对此出过大量题目。
eBGP邻居通常通过直连物理接口建立,默认TTL值为1,这意味着eBGP报文只经过一跳路由器。eBGP对等体之间传递路由时,会把本地AS号追加到AS_PATH的最前面,这是整个BGP环路检测机制的基础。此外eBGP学到的路由通告给iBGP邻居时,不修改AS_PATH。iBGP邻居通常不要求直连,因为同一AS内部的路由器之间可能有多跳,iBGP的默认TTL为255,通过IGP协议保证底层可达即可。iBGP学到的路由不会通告给其他iBGP邻居,这就是iBGP的水平分割规则,目的是防止在AS内部形成路由环路。这个规则带来的直接后果是:如果要让AS内部所有iBGP路由器学到完整的路由信息,它们之间必须两两建立iBGP全互联,或者使用路由反射器和联盟等扩展机制来打破全互联的限制。
路由反射器是解决iBGP全互联问题的主流方案。在路由反射器架构中,路由器被划分为三种角色:路由反射器、客户端和非客户端。路由反射器从客户端收到的路由,会反射给所有其他客户端和所有非客户端。路由反射器从非客户端收到的路由,只反射给客户端。路由反射器从eBGP邻居收到的路由,反射
本篇完!