边界网关协议(Border Gateway Protocol,简称BGP)是当前互联网中唯一大规模部署的外部网关协议。它运行在自治系统之间,负责在不同自治系统之间交换和传递路由信息。目前广泛使用的是BGP-4版本,定义于RFC 4271文件。
与运行在单个自治系统内部的内部网关协议不同,BGP的设计出发点是解决互联网级别的路由可达性问题。互联网由数以万计的自治系统组成,每个自治系统是一个独立管理的网络域,拥有统一的路由策略。BGP在这些自治系统之间传递网络层可达信息,确保全球范围内的IP前缀可达。没有BGP,互联网将被切割成一个个无法互通的孤岛。
BGP是一种路径矢量协议。这一分类非常关键——它不同于RIP的距离矢量,也不同于OSPF的链路状态。路径矢量意味着BGP在路由更新中携带完整的自治系统路径列表,即从源到目标经过的所有自治系统编号序列。正是这个路径属性赋予了BGP强大的环路避免能力和路由策略表达能力。RIP通过跳数上限防止环路,OSPF通过链路状态数据库的一致性避免环路,而BGP则是直接在AS_PATH中检查自身AS号——如果收到的路由的AS_PATH中已经包含自己的AS编号,说明存在环路,直接丢弃。
BGP使用传输控制协议的179号端口作为传输层承载协议。这一设计取舍非常巧妙——传输控制协议的可靠传输机制保证了BGP路由更新的有序到达和完整性校验,BGP自身无需实现分片、重传、确认等机制,大幅简化了协议复杂度。但这也意味着BGP邻居之间必须先完成传输控制协议的三次握手,才能进入路由信息交换阶段。端口号179是软考的高频考点,考生务必牢记。
在软考的命题语境中,常常需要考生区分各类路由协议使用的传输层承载方式。RIP使用用户数据报协议的520端口,OSPF直接封装在IP协议中(协议号89),而BGP使用传输控制协议的179端口。这三者的差异不仅是记忆点,更反映了协议的设计哲学——RIP的简洁性代价是不可靠传输,OSPF通过自建可靠机制换取灵活性,BGP则直接依赖成熟的传输控制协议栈实现可靠通信。
从网络分层视角看,BGP运行在应用层之上——它利用传输控制协议提供的可靠字节流服务,严格来说BGP是一个应用层协议。但习惯上人们将其称为"三层路由协议",这种叫法反映了BGP的功能定位而非实现位置——它处理和交换的是第三层IP路由信息,尽管自身的报文承载在第四层之上。理解这一"看起来矛盾"的分层归类,对于深入把握BGP的本质至关重要。
BGP的邻居关系被称为对等体关系。两个BGP路由器在交换路由信息之前,必须成功建立传输控制协议连接并完成BGP会话初始化。这一过程涉及精细的状态管理与报文交互,是软考命题人最爱深挖的区域之一。
根据邻居所在的自治系统是否相同,BGP邻居分为两种类型。外部BGP是指位于不同自治系统的两个BGP路由器之间的邻居关系,例如中国电信AS4134与教育网AS4538之间的BGP连接。内部BGP则是指位于同一个自治系统内部的两个BGP路由器之间的邻居关系,通常用于自治系统内部的路由信息同步,确保自治系统边界路由器之间拥有一致的外部路由视图。
外部BGP和内部BGP在路由处理策略上存在本质区别。外部BGP邻居之间通告路由时,发送方会在AS_PATH属性前追加自己的自治系统编号,接收方收到后会检查AS_PATH中是否已包含自己的自治系统编号——如果包含则丢弃,这就是BGP的环路检测机制。而内部BGP邻居之间传递路由时,默认不会修改AS_PATH属性,这就带来了内部BGP的经典问题:从一个内部BGP邻居学到的路由不能再通告给另一个内部BGP邻居,即内部BGP水平分割规则。这条规则是为了防止路由在自治系统内部形成闭环传播。
为解决内部BGP全互联带来的扩展性问题,BGP引入了路由反射器和联盟两种机制。路由反射器打破了内部BGP水平分割限制,允许反射器客户端之间通过反射器交换路由信息。联盟则将一个大型自治系统分割为多个子自治系统,子自治系统之间建立外部BGP式的邻居关系,对外则呈现为一个统一的自治系统标识。软考中需要考生区分这两种机制的应用场景——路由反射器用于简化内部BGP拓扑,联盟用于超大规模自治系统的分级管理。
BGP邻居从初始到正常工作的过程中,依次经历六种状态。空闲状态是起点,BGP路由器在此状态下尝试发起传输控制协议连接。若连接建立成功,进入连接状态等待三次握手完成。握手完成后迁移至OpenSent状态,发送Open报文。收到对端的Open报文并通过参数协商后,进入OpenConfirm状态,等待Keepalive报文确认。收到对端Keepalive报文后,最终进入Established状态,开始交换Update报文传输路由信息。
状态转换过程中任何异常都会触发回退。例如传输控制协议连接失败会回退至连接状态反复重试;Open报文参数协商失败会发送Notification报文并回退至空闲状态。软考中高频考查的是各状态之间的迁移触发条件和回退路径,尤其是从空闲到连接的触发条件、从OpenSent到OpenConfirm需要的对端报文类型、Notification报文导致的状态退回到空闲这三个考点。
BGP使用Keepalive报文周期性维持邻居关系。默认Keepalive间隔为六十秒,保持定时器默认值为一百八十秒,恰好是Keepalive间隔的三倍。当保持定时器超时仍未收到对端Keepalive报文时,本地路由器判定邻居失效,断开BGP会话并撤销从该邻居学到的所有路由信息。
Keepalive和保持定时器的具体数值在Open报文协商阶段确定,双方取较小值作为共同的工作参数。软考题目常以"保持定时器超时的后果"或"Keepalive间隔与保持定时器的倍数关系"作为考点,考生需牢记三倍关系与失效后的路由撤销动作这两个关键结论。
BGP协议定义了四种报文类型,每种报文对应特定的交互阶段和功能定位,是理解BGP协议运行的基石。
Open报文是BGP会话建立的第一个报文,在传输控制协议连接成功建立后由连接发起方发送。Open报文携带BGP版本号(当前为版本四)、本地自治系统编号、保持时间建议值、BGP路由器标识以及可选参数(如能力协商字段)。对端收到后检查参数是否兼容,若版本不匹配或自治系统编号配置错误,会回复Notification报文并关闭连接。Open报文中携带的保持时间是双方协商的基础,任何一方如果认为对方的建议值不可接受,可以通过Notification报文拒绝协商。
Update报文是BGP最核心的报文类型,负责路由信息的通告和撤销。一个Update报文可以同时携带三种信息:网络层可达信息(要通告的新的可达路由前缀及其路径属性)、撤销路由列表(要撤销的路由前缀列表)、路径属性集合(如AS_PATH、下一跳、本地优先级、多出口鉴别器等)。Update报文的紧凑设计使得一条报文可以同时完成路由增加和删除操作。当BGP检测到某条路由失效时,会发送携带撤销路由列表的Update报文通知对端撤销对应路由。撤销操作不携带路径属性,仅列出需要撤销的前缀地址。
Notification报文是BGP的错误报告机制。当BGP路由器检测到任何差错条件(如报文格式错误、保持定时器超时、邻居能力不匹配、AS_PATH环路等),立即发送Notification报文并在发送完成后关闭BGP连接。Notification报文分为差错码和差错子码两级结构,常见差错码包括报文头部错误、Open报文错误、Update报文错误、保持定时器超时、有限状态机错误和终止。软考中可能需要考生区分不同差错类型的归属,尤其是保持定时器超时和报文格式错误分别对应不同的差错码。
Keepalive报文的结构最简单,仅包含十九字节的BGP报文头部,不携带任何数据负载。它的唯一作用是向对端证明本端仍在正常工作,重置对端的保持定时器倒计时,维持BGP会话的存活状态。Keepalive报文的简约设计体现了BGP协议控制面与数据面分离的设计哲学——路由更新由Update报文负责,会话保活由Keepalive报文负责,职责清晰、互不干扰。
BGP的路由决策过程基于一系列路径属性的对比,这是BGP最精妙也最复杂的部分。理解路径属性的分类和优先级是掌握BGP选路规则的关键所在。
BGP路径属性按性质和传递行为分为四类。公认必遵属性是所有BGP实现必须识别且必须在Update报文中携带的属性,包括ORIGIN、AS_PATH和NEXT_HOP三种。ORIGIN标识路由来源,取值为IGP(通过network命令注入的内部网关协议路由)、EGP(通过外部网关协议学习的路由,已基本淘汰)或Incomplete(通过重分发从其他路由协议导入)。AS_PATH存储路由经过的自治系统序列,是环路检测和路由策略的核心依赖。NEXT_HOP指示到达目标网络的下一跳IP地址,外部BGP默认指向对端接口地址,内部BGP默认保持原始
本篇完!