BGP概述
BGP是一种实现自治系统AS之间的路由可达,并选择最佳路由的矢量性协议
BGP的特点:
- 使用TCP作为其传输层协议(端口号为179),使用触发式路由更新
- 能够承载大批量的路由信息,能够支撑大规模网络
- 提供了丰富的路由策略,能够灵活的进行路由选路,并能指导邻居按策略发布路由
- 能够支撑MPLS/VPN的应用,传递客户VPN路由
- 提供了路由聚合和路由衰减功能用于防止路由振荡,能有效地提高网络稳定性
BGP特征1
使用TCP为传输层协议,TCP端口号179。路由器之间的BGP会话基于TCP连接而建立
运行BGP的路由器被称为BGP发言者(BGP Speaker)或BGP路由器
两个建立BGP会话的路由器互为邻居(Peer),BGP邻居间交换BGP路由表
BGP路由器只发送增量的BGP路由更新,或进行触发式更新(不会周期性更新)
BGP能够承载大批量的路由前缀,可以在大规模网络中应用
BGP特征2
BGP被称为路径矢量路由协议
每条BGP路由都携带多种路径属性(Path attribute),BGP可以通过这些路径属性控制路径选择,而不像IS-IS、OSPF只能通过Cost控制路径选择,因此在路径选择上,BGP具有丰富的可操作性,可以在不同场景下选择最合适的路径控制方式。
BGP对等体关系
BGP的会话是基于TCP建立的,建立BGP对等体关系的两台路由器并不要求必须直连
BGP存在两种对等体关系类型:EBGP及IBGP
EBGP(External BGP):位于不同自治系统的BGP路由器之间的BGP对等体关系。两台路由器之间要建立EBGP对等体关系,必须满足两个条件
BGP对等体关系建立
先启动BGP的一端先发起TCP连接
首先R1先启动BGP,R1使用随机端口号向R2的179端口发起TCP连接,完成TCP连接的建立。
三次握手建立完成之后,R1、R2之间相互发送Open报文,携带参数用于对等体建立,参数协商正常之后双方相互发送Keepalive报文,收到对端发送的Keepalive报文之后对等体建立成功,同时双方定期发送Keepalive报文用于保持连接。
BGP建立对等体的对等体都会发起TCP三次握手,所以会建立两个TCP连接,但是实际BGP只会保留其中一个TCP连接,从Open报文中获取对端BGP router-id之后BGP对等体会比较本端的Router ID和对端的Router ID大小,如果本端Router ID小于对端Router ID,则会关闭本地建立的TCP连接,使用由对端主动发起创建的TCP连接进行后续的BGP报文交互
![](https://img-blog.csdnimg.cn/direct/2bd9ec50f81845b9b1e06ce468645aa8.png)
BGP对等体关系建立之后,BGP路由器发送BGP Update(更新)报文通告路由到对等体。
TCP连接源地址
![](https://img-blog.csdnimg.cn/direct/ea05e0a3db5446aeb3c4b3fd8ee0cf9d.png)
BGP报文类型
BGP存在5种类型
报文名称 | 作用 | 发送时刻 |
Open | 协商BGP对等体参数,建立对等体关系 | BGP TCP连接建立成功之后 |
Update | 发送BGP路由更新 | BGP对等体关系建立之后有路由需要发送或路由变化时向对等体发送Update报文 |
Notification | 报告错误信息,中止对等体关系 | 当BGP在运行中发现错误时,发送Notification报文将错误通告给BGP对等体 |
Keepalive | 标志对等体建立,维持BGP对等体关系 | BGP路由器收到对端发送的Keepalive报文,将对等体状态置为已建立,同时后续定期发送keepalive报文用于保持连接 |
Route-refresh | 用于在改变路由策略后请求对等体重新发送路由信息。只有支持路由刷新能力的BGP设备会发送和响应此报文 | 当路由策略发生变化时,触发请求对等体重新通告路由 |
BGP状态
Peer状态名称 | 用途 |
Idle | 开始准备TCP的连接并监视远程对等体,启用BGP时,要准备足够的资源 |
Connect | 正在进行TCP连接,等待完成中,认证都是在TCP建立期间完成的。如果TCP连接建立失败则进入Active状态,反复尝试连接 |
Active | TCP连接没建立成功,反复尝试TCP连接 |
OpenSent | TCP连接已经建立成功,开始发送Open包,Open包携带参数协商对等体的建立 |
OpenConfirm | 参数、能力特性协商成功,自己发送Keepalive包,等待对方的Keepalive包 |
Established | 已经收到对方的Keepalive包,双方能力特性经协商发现一致,开始使用Update通告路由信息 |
Idle状态
没有去往BGP对等体的路由,导致BGP路由器状态一直处于idle状态
Connect状态
BGP启动连接重传计时器,等待TCP连接成功
TCP连接成功,BGP向邻居发送open报文,转至opensent
TCP连接失败,转至Active
重传连接计时器超时,如果还没收到邻居的回应,继续和别的邻居进行TCP连接,停在connect
配置完BGP邻居并成功查找到去往邻居地址的路由之后,会发起TCP三次握手,TCP三次握手建立过程中处于Connect状态,如果TCP连接长期无法建立则进入Active状态。
Active状态:BGP总是在试图建立TCP连接
TCP连接成功,BGP向邻居发送open报文,关闭重传计时器,转至opensent
TCPl连接失败,BGP会停留在Active
重传计时器超时,仍然没有收到邻居的回应,回到connect
OpenSent状态
BGP路由器等待邻居的open报文,并对收到open报文中的AS号,版本号,认证码等信息检查
当收到的open报文正确,对邻居发送keeplive,转至openconfirm
当收到错误的open报文,对邻居发送notification,回到idle
openconfirm状态
BGP路由器等待keep live或者notification报文,收到keep live报文转至established,收到notification报文,回到idle
establish状态
收到正确的update或者keep live,BGP路由器认为邻居处于正常状态,保持tcp连接
收到错误的update或者keep live,BGP路由器会向邻居发送notification报文,回到idle
Route-refresh报文不会改变BGP状态
收到Notification报文,BGP转至Idle状态
如果收到TCP拆链通知,那么BGP断开连接,转至Idle状态
BGP通告原则
1.只发布最优且有效(即下一跳地址可达)路由。
2.从EBGP对等体获取的路由,会发布给所有对等体
如上图,R2从EBGP邻居(R1)获取的BGP路由,会发布给所有EBGP、IBGP对等体。
3.从IBGP对等体获取的BGP路由,不会再发送给其他IBGP对等体
如图所示,如果IBGP对等体学习到的路由会继续传递给其他的IBGP对等体:
R2将一条路由传递给了IBGP对等体R3
R3收到路由之后传递给IBGP对等体R1
R1继续传递给IBGP对等体R2
这种情况已经产生了路由环路,所以从IBGP对等体获取的BGP路由,不能发送给其他IBGP对等体
,否则产生路由环路
第三条原则可能会带来新的问题
上图,当BGP路由器R2将路由传递给BGP路由器R1时,由于第三条原则限制,R1无法将BGP路由传递给R3,R3将无法学习到路由
方法:采用AS内IBGP全互联
R2、R3之间建立非直连的IBGP邻居关系
BGP同步
当一台路由器从自己的IBGP邻居学习到一条BGP路由时(IBGP路由),它将不能使用该条路由或把这条路由通告给自己的EBGP对等体,除非它又从IGP协议(OSPF,静态路由)学习到这条路由
AS200域内未运行BGP的路由器并无从BGP学习到的路由条目,查找路由失败,导致R1丢弃报文
当BGP的路由条目也存在于IGP路由表时才对外发送
如上图,当R3查看IGP路由表,OSPF路由表中并无路由10.0.4.0/24,因此并不会向R5发送该路由,也不会产生后续的访问失败
解决方法:
将BGP路由重分发到IGP(已经淘汰)
建立全互联的IBGP对等体关系,让全网所有路由器都拥有BGP路由(推荐方案)