BGP全称Border Gateway Protocol,译为边界网关协议。OSPF和RIP管的是AS内部路径,BGP管的是自治系统之间的路由——中国电信和中国联通之间流量怎么走,数据从北京到纽约该跨越哪些运营商。
要理解BGP,必须先搞清自治系统这个核心概念。自治系统的英文缩写是AS,全称Autonomous System,指由同一个管理机构控制的一组路由器组成的集合。中国电信有一个AS号,中国联通有一个AS号,阿里云也有自己的AS号——每个独立的网络实体在互联网上都持有全球唯一的AS编号。IANA负责AS号的分配,十六位AS号范围是1到64511,其中64512到65535保留为私有AS号,三十二位AS号则可达四十二亿以上。路由器在AS内部运行OSPF或IS-IS来寻找同AS内的最短路径,但数据包一旦要出AS边界,就得靠BGP来宣告从哪个出口出去、经过哪些AS、最终到达目的地。
这里有个关键认知:BGP管的是策略最优而非最短路径。IGP用带宽和延迟做度量追求物理最短,BGP则用AS路径长度、本地优先级和MED值等策略指标做决策。把BGP比作外交官很贴切——有时候绕远路是故意的,因为某些中间AS不愿接受你的流量。比如两个运营商之间的商业关系可能是"付费对等"而非"免费交换",流量策略自然要避开昂贵的链路。这种基于策略的路由选择能力,是BGP区别于所有IGP的本质特征。
追溯BGP的演进脉络同样重要。互联网早期使用的EGP协议在RFC 904中定义,设计简陋只能处理树形拓扑。1989年BGP-1首次引入路径向量概念,1994年BGP-4随RFC 1771发布并增加无类域间路由支持,2006年形成当前RFC 4271标准。如今整个互联网的所有BGP对等体都运行BGP-4,在包含数十万条路由的全球路由表中稳定运行近二十年,堪称基础设施领域最成功的工程范例。
BGP是基于TCP端口179的可靠协议,把传输可靠性完全交给TCP,自身只需专注路由交换逻辑。邻居不要求物理直连,只要三层可达,跨越多台路由器的两个BGP发言人即可建立邻居关系。这种逻辑邻居特性允许数据中心之间灵活交换路由而不受物理拓扑限制。
BGP邻居关系分为两种类型,软考反复考察。EBGP指位于不同AS的两台路由器之间的对等关系,通常要求直连接口建立,默认TTL为1。IBGP指同一AS内部两台路由器之间的对等关系,对物理拓扑没有限制,可以通过Loopback接口建立,TTL不受限。IBGP有一个著名的全互联要求:同一AS内所有运行BGP的路由器之间必须两两建立IBGP会话,否则需用路由反射器或联盟来打破限制。这句话背后的逻辑是:从IBGP邻居学到的路由不能再传给另一个IBGP邻居——这是BGP的防环铁律,但也意味着如果AS内有N台路由器不全互联,部分路由器将收不到完整路由信息。
BGP邻居从建立到稳定经历六个状态,命题人热衷在此处挖坑。Idle是初始状态,此时BGP拒绝所有入站连接尝试。Connect表示BGP正在发起TCP SYN报文,如果TCP三次握手成功则跳到OpenSent,失败则转Active。Active状态最易让人误判——它不是"邻居已活跃"的意思,而是TCP连接失败后的重试状态,路由器仍在努力建立新的TCP连接。OpenSent表示TCP已建立且本端发出了Open消息。OpenConfirm则是收到了对方Open消息并通过了参数校验,等待Keepalive确认。Established是最终目标,邻居关系完全建立,开始交换Update消息传递路由信息。整个过程如果任何环节出错触发Notification,状态机直接回退到Idle重新来过。
四种BGP消息类型须烂熟于心。Open消息携带版本号、AS号和Hold Time等参数,是邻居建立的敲门砖。Keepalive消息是仅含十九字节BGP报头的空消息,默认每六十秒一发,用来维持邻居存活性——如果Hold Time内未收到Keepalive,邻居关系宣告死亡。Update消息是核心中的核心,用于通告可达路由或撤销不可达路由,一条Update消息可携带多条共享相同路径属性的前缀,极大节省了信令开销。Notification消息用于报告错误并立刻关闭邻居连接——收到后状态机没有任何缓冲余地,直接回退到Idle,从头重建。
路径属性是BGP最核心的概念,也是理解选路规则的前提。所有路径属性分为四大类,这个分类体系直接决定了跨厂商设备的BGP互通行为。
公认必遵属性必须识别且必定携带,包括Origin、AS_Path和Next_Hop。Origin标记路由来源——IGP为network注入,EGP为外部协议重分发,Incomplete为redistribute引入。AS_Path记录路由经过的AS号列表,既是选路依据也是防环利器——若在AS_Path中发现自己的AS号则判定环路丢弃。Next_Hop是到达目标的下一跳IP,EBGP场景默认发送方接口IP,IBGP场景默认不变。
公认自决属性是所有实现必须识别但不一定携带的属性,典型代表是Local_Preference。这个名称有严重的误导性——它叫本地优先级,但本地二字指的不是单台路由器而是整个AS。Local_Pref值越大越优先,默认值100,在AS内部传播,所有IBGP邻居都能收到这个属性。通过统一设定Local_Pref,整个AS可以左右所有出站流量的方向——想让去往某个方向的流量走电信出口而不是联通出口,就把从电信方向学到的路由打上更高的Local_Pref即可。
可选传递属性即便不认识也须原样转发,如Community。可选非传递属性不认识可丢弃,如MED。MED全称Multi-Exit Discriminator,在EBGP邻居间传递,用于建议邻居优选特定入口到达本AS。MED值越小越优先,与Local_Pref方向恰好相反,考试中反复设此陷阱。
BGP的Next_Hop属性在不同邻居类型下的行为差异,是软考网规中考察频次极高的知识点。EBGP邻居场景下,发送方默认将自己的接口IP填入Next_Hop字段——路由器R1和R2分属AS100和AS200,R1向R2通告路由时Next_Hop填的是R1与R2直连接口的IP,R2收到后直接做递归路由查找即可。这个行为直观合理。
但IBGP场景截然不同。路由器从EBGP邻居学到路由并通告给IBGP邻居时,默认保持Next_Hop不变——不改成自己的接口地址。这带来经典的可达性问题:AS内部非边界路由器若没有到达外部Next_Hop所在网段的路由,BGP路由虽在BGP表中最优却无法装入路由表。解决方案有三:next-hop-self命令改写下一跳、IGP引入外部直连路由、或配置静态路由指向外部Next_Hop。
BGP选路是一条严格顺序的决策链,只有当前步骤无法区分时才进入下一步。理解这个顺序比死记硬背规则更重要,考试中常出现给出场景让你判断最终选中哪条路由的综合题。
第一条优选Weight值最大的路由,思科私有属性,仅本地有效,不会传递给任何邻居,排在第一位意味着管理员在单台路由器上有最高干预权。第二条优选Local_Pref值最大的路由,在AS内部传递,是AS级别的统一偏好,在流量工程中扮演核心角色。第三条优选本地始发路由,即通过network或aggregate命令从本路由器注入BGP的路由,其下一跳在路由表中显示为0.0.0.0。第四条优选AS_Path最短——注意这里的关键陷阱:跳数是AS跳数不是路由器跳数,一条路由经过三个AS,每个AS内部可能各有十几台路由器,但在BGP视角下这只是AS_Path长度为三。第五条比较Origin属性值,优先顺序IGP优于EGP优于Incomplete,体现路由来源可信度的差异。
第六条优选MED值最小,仅在同一邻居AS的多条路由间比较。第七条EBGP路由优于IBGP路由,体现直接从源头获取比经内部转述更可靠的设计哲学。第八条优选到Next_Hop的IGP度量最小者,即在去往同一目标有多条路径时选IGP开销最低的那条。第九至十三条是当所有以上属性完全相同时的兜底策略,包括优选最老的EBGP路由以维持路由稳定性、优选从最小Router ID邻居学来的路由以提供确定性决策等。这些兜底规则在日常运维中较少刻意使用,但在大型网络的BGP排错中如果忽略它们就很可能会走弯路。
前面提到IBGP要求全互联——N台路由器需建立N乘以N减一除以二条IBGP会话,当N达到数百甚至上千时,会话数量呈几何级增长,运维复杂度完全失控。BGP因此引入两种扩展机制来突破这个瓶颈。
路由反射器的核心思想是指定一个中心节点来转发路由,其他节点无需两两互联。反射器接收来自客户端的路由后不仅自己使用,还会反射给其他客户端和非客户端成员。为防止路由在反射过程中形成环路,引入了两个专用属性:Originator_ID记录最初产生该路由的路由器的Router ID,Cluster_List记录路由经过的反射器簇序列。反射器收到路由后在转发前检查:如果Cluster_List包含自己的簇ID,或Originator_ID等于自己的Router ID,直接判定为环路丢弃——这与AS_Path的防环逻辑在精神上完全一致。路由反射器目前几乎是所有运营商网络的标配组件。
联盟是另一种思路:将一个AS拆分为若干子AS,子AS之间运行类EBGP会话交换路由,但对外仍呈现为单一AS。子AS号通常使用私有AS范围64512到65535。联盟内部虽然像EBGP那样运行,但AS_Path中的子AS号在路由离开联盟边界时
本篇完!