计算机网络课程总结 --BGP 协议
路由器工作在 IP 层,其作用是根据 IP 地址将数据包传输到正确的目的地,因此路由器必须要知道网络的 “地图” 才能正确投递,而这个网络的 “地图” 就是存储在路由表中的路由规则,简称为路由。
根据获得路由的方式可以将其分为静态路由和动态路由,静态路由就是管理员静态配置的路由,动态路由则是路由器通过算法动态地学习和调整而得到的路由。而常说的路由协议就是指这些动态路由的学习算法,根据其作用域的不同,又可分为内部网管协议 (IGP) 和边界网络协议 (BGP);内部网络协议包括 RIP,OSPF 等,边界网关协议则包括 BGP 等。
本文主要讲述 BGP 相关的一些知识。
当网络过大的时候,也会导致路由表过大而难以维护,这时候采用分治的方法,将一个大网络划分为若干个小网络,这些小网络称为自治系统 (AS),BGP 的诞生就是用于自治系统间的通信。其在网络中的位置如下
那么是不是 AS 之间的通信都要使用 BGP?答案并不是,只有当两 AS 间存在多条路径,需要做路由策略和选择才需要 BGP;如果 AS 只有一个出口或者所有出口指向一个 ISP 的时候,是不需要 BGP 的。
基本概念
BGP 允许基于策略(policy-based)的路由选择,策略与政治、安全和经济等因素相关,由 AS 的网络管理者确定,也就是说人为影响的因素较大。
从上面可知,每个划分后的小网络称为 AS,每个 AS 都有自己独特的 AS 号码 (ASN),ASN 的原来使用 16 位表示。但是由于和和 IP 地址一样,ASN 同样面临分配告罄的危机,自 2006 年 12 月 1 日起,原为 16 位 (1-65535) 的 ASN 扩展为 32 位空间。
AS 根据其位置的不同,也被分为为不同类型的 AS。
一般来说,AS 号码只是在一家 ISP 与至少两家 ISP 做对等互联,交换路由的时候才需要用到,也就是说一个国家的 AS 号码的数量实际上是跟大中型 ISP 的数量有关。
BGP 是运行在 TCP 协议上的,与其他路由协议对比如下
BGP 是一种距离矢量路由协议,但避免了环路;其避免环路的策略是不仅仅记录路径代价,还记录下全路径信息。如下图所示
BGP 有两种邻居,其中运行在同一个 AS 内的 BGP 邻居称为 IBGP (Interior BGP), 不同 AS 间的邻居称为 EBGP (Exterior BGP),注意无论是 IBGP 或者 EBGP,上面都必须运行着 BGP 协议,也就是说与 BGP 路由器直连的内部路由器不一定是它的 IBGP,如下图所示
注意:BGP 邻居不是自动发现的,而是手动配置的,原因有以下两点: 1)可以与对端设备用任何 IP 地址建立邻居,而不限于某个固定的接口 IP。这样,当两台 设备采用环回地址而非直连地址建立 BGP 邻居时,即使主链路中断了,也可以切换到备份链路 上,保持邻居不断。这种稳定性正是 BGP 作为大型网络路由承载的必要特质。 2)可以跨越多台设备建立邻居。当一个 AS 有多个设备运行 BGP 建立域内全连接时,不必每台设备物理直连,只要用 IGP 保证建立邻居的地址可达,即可建立全网连接,减少不必要的链路建设。
BGP 报文
BGP 报文类型有以下四种:
- Open 报文:打招呼,“你好,交个朋友吧”(协商参数)
- Keepalive 报文:我还活着,别不理我(30 秒钟交换一次)
- Update 报文:有新闻(链路的变化)
- Notification 报文:我不跟你玩了(异常情况的通报,终止连接)
BGP 的工作机制也可以通过这四种报文描述: 1)通过 TCP 建立 BGP 连接时,发送 OPEN 报文 2)连接建立后,如果有路由器需要发送路由或路由发生变化时,发送 UPDATE 报文 3)稳定后,周期发送 KEEPALIVE 报文,维持连接有效性 4)当本地 BGP 运行中发生错误时,发送 NOTIFICATION 报文通告 BGP 对端
路由注入及通告
首先要明确一点,BGP 路由器的路由注入和通告都是为了修改 BGP 路由表。
当路由器之间建立 BGP 邻居之后,就可以相互交换 BGP 路由。一台运行了 BGP 协议的路由器,会将 BGP 得到的路由与普通路由分开存放,所以 BGP 路由器会同时拥有两张路由表。
一张是存放普通路由的路由表,被称为 IGP 路由表,就时平时我们使用命令 show ip route
看到的路由表,IGP 路由表的路由信息只能从 IGP 协议和手工配置获得,并且只能传递给 IGP 协议;另外一张就是运行 BGP 之后创建的路由表,称为 BGP 路由表,需要通过命令 show ip bgp
才能查看,BGP 路由表的路由信息只能传递给 BGP 协议,如果两台 BGP 邻居的 BGP 路由表为空,就不会有任何路由传递。
在初始状态下,BGP 的路由表为空,没有任何路由,要让 BGP 传递相应的路由,只能先将该路由注入 BGP 路由表,之后才能在 BGP 邻居之间传递。注入的方式有多种,如 1)动态注入:将 IGP (如 OSPF) 发现的路由纯动态地注入到 BGP 路由表中,这种方式配置简单,但操控性差,可能不稳定。具体过程及配置如下图所示: 2)半动态路由注入:通过 IGP 协议 (如 OSPF) 学习到的路由,再通过 network 发布到 BGP 中。具体过程及配置如下图所示:
3)静态路由注入:工配置的静态路由,再由 network 发布到 BGP 中。具体过程及配置如下图所示:
在 BGP 路由表注入路由后,BGP 路由器之间会将这些路由在 BGP 路由器间进行通告。通告要遵守以下规则
- BGP 路由器只把自己使用的路由通告给相邻体
- BGP 路由器从 EBGP 获得的路由会向它的所有 BGP 相邻体通告(包括 EBGP 和 IBGP)
- BGP 路由器从 IBGP 获得的路由不会向它的 IBGP 相邻体通告(避免内部产生环路)
- BGP 路由器从 IBGP 获得的路由是否通告给它的 EBGP 相邻体要依 IGP 和 BGP 同步的情况而定
对于最后一条,只有当 IGP 与 BGP 同步时(也就是该路由可以通过 IGP 获得),才能通告,反之不通告,这样做的目的是为了避免路由黑洞。
路径属性
在默认情况下,到达同一目的地,BGP 只走单条路径,并不会在多条路径之间执行负载均衡。对于 IGP 路由协议,当有多条路径可以到达同一目的地时,则根据最小 metric 值来选择最优路径,而 BGP 存在多条路径到达同一目的地时,对于最优路径的选择,BGP 并不会以 metric 值大小为依据,BGP 对于最优路径的选择,需要靠比较路由条目中的 Path Attributes,即路径属性,只有在比较多条路由的属性之后,才能决定选择哪条为最优路径。
BGP 的路径属性可以划分为以下四类:
- 公认强制 (Well-Known Mandatory): 所有的路由中都需要写入公认强制属性
- 公认自选 (Well-Known Discretionary):能够理解和支持即可,不一定要写入路由
- 可选可传递 (Optional Transitive):不一定要理解或支持
- 可选不可传递(Optional Nontransitive):只有特定的 BGP 路由器才能理解和传递
对于任何一台运行 BGP 的路由器,都必须支持公认强制属性,并且在将路由信息发给其它 BGP 邻居时,必须在路由中写入公认强制属性,这些属性是被强制写入路由中的,一条不带公认强制属性的路由被 BGP 路由器被视为无效而被丢弃,一个不支持公认强制属性的 BGP,是不正常的,不合法的 BGP。BGP 路由必须携带的公认强制属性有三个:Origin,Next_Hop,AS-path
。
origin 属性
origin 属性为起源属性,描述路由是以何种方式注入到 BGP 路由表中的,主要有以下两种情况 1)以 network
命令注入到 BGP 路由表中,origin 属性为 IGP 2)以 redistribute
命令注入到 BGP 路由表中,origin 属性为 Incomplete 其中,IGP 优先级比 Incomplete 的要高。
AS Path 属性
描述了该路由经过的 AS 组成的路径,AS 路径中不能算上自己的 AS,从离自己最近的 AS 开始,以目的网络的 AS 结束。下图为 AS5 到 AS1 的路由的 AS Path 属性
借助路由的 AS Path 属性,可以避免环路,具体操作就是收到一条 AS Path 属性中含有自己 AS 的路由的时候丢弃该路由。
在选路的时候,优先选 AS PATH
最短的那条,如果 AS PATH
距离相等,则优选本 AS 内到出口路由器最短的那根,如果还相等,则选择 Router_ID(发送路由的路由器)最小的那根
但是要注意,这种选择并不总是明智的,如下图所示
Next Hop 属性
指示下一个 AS 的路由器入口的网段,同一个 AS 内 Next hop 的值不变,如下图所示
local pref 属性
可选的属性,用于引导流量,local pref 的缺省值是 100,如下图所示
MED (Multi Exit Distiguisher) 属性
当 AS 有多个出口的时候,告诉上游的 AS 如何选最优的路,MED 值越小,优先级越高
BGP 选路的策略为
其他概念
BGP 过滤 BGP 拥有强大的过滤功能,可以按照以下规则进行过滤:
- 可按照路由的 IP 地址过滤
- 可依照路由经过的 AS-Path 过滤
- 可以依照路由的属性过滤
- 可以依照路由到来的接口过滤
BGP 聚合 由于 BGP 路由器的路由表庞大,往往超过 10 万条,通过 BGP 聚合 (BGP 支持 CIDR) 解决这个问题,如下图 AS100 先将内部的路由聚合再通告给 AS200
BGP 联盟和反射 从前面的描述可知,从 IBGP 收到的路由不会通告给其他的 IBGP(避免环路),所以 AS 内部的 IBGP 必须全连接。但是 IBGP 相邻体过多,逻辑全链接不现实,实际中通过 BGP 联盟和反射解决这个问题。
BGP 联盟就是将大的 AS 分割成小的 AS,从而减少全连接的数目。
BGP 反射是通过将网络内的路由器划分为客户机,非客户机以及路由反射器的角色,从而减少 IBGP 间的连接,如下图所示:
BGP 反射中需要遵循以下规则
- 来自客户机的路由通告给其它的客户机和非客户机
- 来自非客户机的路由只通告给它的客户机
- 来自 EBGP 的路由向所有相邻体通告
BGP 衰减 BGP 衰减是为了处理不稳定的路由(如路由频繁更新),避免影响整个互联网络的稳定运行
路由抑制可以阻止公布不稳定的路由,它为每条路由分配一个动态的度量数字用来反映稳定程度,当一条路由出现摆动,就给他分配一个惩罚值,摆动得越多,惩罚值越大。当一段时间不摆动,惩罚值降低,在一个半衰期后,降到原来的一半。如果惩罚值超过抑制上限,该路由就被抑制,只有当一个半衰期后惩罚值降低到重新使用界限时,才重新使用。
BGP 配置
通常在路由器配置 BGP 需要开启 BGP 进程,指定 AS 号码,指定邻居 (EBGP 或 IBGP) 并注入 BGP 路由,如下是一个简单的例子1
2
3
4
5
6//开启BGP进程,指定AS号
Router(config)#router bgp as-number
//注入BGP路由
Router(config-router)#network network-number [mask network-mask]
//指定EBGP或IBGP(as-number 决定)
Router(config-router)#neighbor ip-address remote-as as-number
除此以外,还有一些检查 BGP 工作情况的命令如下所示