BGP 的状态机
--- 建立对等体之间的TCP会话:指定建立对等体的对象
六种状态机
Idle状态
Idle 等待状态(相当于OSPF的down状态)--- 采用TCP单播建邻
Idle 状态下,启动BGP协议后必须指定建立对等体的目标之后,才能进入下一个状态(依靠IGP协议:静态、直连等)
Connect 状态
Connect 状态下,BGP对等体之间开始建立TCP会话连接。
Opensent 状态
如果TCP会话建立成功则进入到OpenSent状态。
Active 状态
如果TCP会话建立失败则进入Active状态(尝试状态)。
OpenConfirm 状态
如果认可对等体发过来的Open报文中的参数,首先会回复一个Keepalive报文用来确认Open报文中的参数已近被我认可,并且进入OpenConfirm 状态。
OpenSent 状态
如果TCP会话(三次握手)建立成功则进入OpenSent 状态,在OpenSent状态下,开始发送Open报文去建立BGP对等体关系。
Established 状态
如果收到对等体发送的Keepalive报文,则进入Established状态。
BGP的工作过程
- 基于IGP(静态、直连、RIP、OSPF...)协议实现路由可达,原因:BGP需要建立TCP会话(单播)
- 必须指定邻居关系,邻居之间进行单播传输,通过三次握手,来建立TCP会话通道。之后所有的BGP通信都将基于TCP会话通道来传输。并且依靠TCP提供传输的可靠性。
- 使用Open报文和Keepalive报文来进行邻居关系的建立。Open报文用来建邻使用的参数,Keepalive报文用于Open报文参数的确认。最终完成对等体关系的建立。生成邻居表,存储BGP对等体关系信息。
- 建立邻居关系后,使用Update报文来共享路由条目信息。信息中将携带目标网络号,掩码及路径属性;之后,将发送以及收集到的路由信息记录在一张表中 --- BGP表
- 之后,会将BGP表中的最优的路由信息(通过路径属性选择的结果)加载到路由表中。
- 收敛完成后,将使用Keepalive报文进行对等体之间的周期保活,默认的保活时间为 180 S (hold time), 发送周期为 60 S。
- 如果这个过程中出现任何问题,都将使用Notification报文进行 告警。
- 如果拓扑结构出现突变(增加/删除),则将使用Update报文来进行触发更新,并通告给其他的对等体。
BGP的机制
BGP的路由黑洞
存在问题:控制层面的可达 、数据层面实际不可达
IGP内部没有运行BGP的设备,当访问BGP网段流量来到这些设备之后,由于控制层面可达,数据层面不可达(因为这些设备没有运行BGP,没有BGP的网段的路由信息),那么将丢弃这些流量。
解决方法:
- 所有设备均运行BGP
- 重发布
- MPLS (Multi-Protocol Label Switching 多标签交换协议)--- 最早用来专门解决BGP路由黑洞,运用MPLS - VPN 广泛。
原理:MPLS是根据标签来转发的,而不是路由条目。只要边界路由器上有BGP路由,接下来路由传播在内部路由器走MPLS,通过标签转发,即使路由有黑洞,也可以通,因为我内部走的是标签。
同步机制 --- 当设备学习到一条BGP路由时,如果本地的IGP路由不可达,则将视该BGP路由无效。 首先 可以先通告命令 查看路由条目:display ip routing-table 。 ---- 默认关闭的
BGP的防环 --- 水平分割
EBGP的水平分割
BGP 为了解决EBGP路由环路的问题,设计了一个AS - PATH的属性,设备在发出AS 时会携带本AS的AS号,当路由信息携带该AS号,那么对应该AS的设备不会接受该路由。
同时AS - PATH 属性也是BGP的一个选路依据,当其他属性一致时,会选择AS - PATH属性 更短的路径。
IBGP的水平分割
当运行BGP的设备 从IBGP对等体处学习到一条IBGP路由,那么将不再转发给其他的IBGP对等体。
解决方案 --- 在IBGP对等体直接构建全连的IBGP对等体关系
引起两个问题:
1.增加拓扑的复杂性导致网络的可拓展性差。
2.增大了资源的占用。