BGP建立邻居前的几种状态(BGP有限状态机)

:IDLE状态

在这个状态下路由器会查找路由表,查看路由表中有没有我要建立邻居地址的路由,如果有的话,则进行TCP三次握手;如果没有的话,则一直停止在这个状态。

A)BGP通常以Idle状态(Idle state)开始。当一个事件开始出现(比如正常状态,突然去掉可达路由)BGP过程初始化所有资源打开重试连接计时器(Connection Retry),初始化到邻居的tcp连接,接听来自邻居的tcp初始化消息并将它的状态转到Connect状态(被动接受状态);

形象理解:Idle开始,出问题希望别人来主动连接解决!

B)开始事件由于手动重启路由器或重置BGP已经存在的进程或者管理员手动配置BGP过程;

A中事件的具体解释!

C)当然一个差错会导致BGP过程状态转为Idle,为了避免一个正常的开始事件后,防止持续性的差错事件导致的摆动。当路由器第一次回到空闲状态时,路由器会自动开启重试连接计时器,第一次时间为60S,下一次为前一次的2倍,即120S,成指数的形式增加。

其实,过程大致是idle—正常–(故障)–(恢复)–idle—-正常–(故障)–(恢复)–idle—-正常–(故障)–(恢复)……避免此种情况,过渡消耗资源,所以采取了延时查找的方式。另一种情形是idle—正常—故障,一直停步如此,导致设备以一定的频率在查找,所以会过度消耗资源,故也会采取延时查找方式,而此过程大多数都是路由缺失,在查找路由!

:Active状态(主动状态)—-和Connect状态是邻居的一对状态

这个状态,BGP试图与邻居建立TCP连接

A)如果TCP连接成功,BGP过程将ConnectRetry计时器清零,并完成初始化,给邻居发送一个Open消息并转移到发送Open消息状态,Hold计时器设置为4分钟;

此时,应该处于Open sent状态,而且坚持计时器设定在4 minus

B)如果在激活状态,ConnectRetry计时器超时,将回到ConnectState并且重置ConnectRetry计时器,并发起一个到对等体的TCP连接并继续监听来自对等体的连接;

如果在正常的Active连接状态,因未知故障,重试计时器超时了,此时计时器重置,而且变为被动状态connect状态。

C)如果邻居试图与一个未知IP建立TCP会话,同时ConnecRetry计时器重置,连接被拒绝并保持在Active状态;

Active是主动连接的,任何连接于我的被拒绝,我自岿然不动!

D)还有最常见的一种情况:没有路由(双方都是默认路由)或者指向错误的Neighbor or AS;

:Connect状态(被动状态)—-和Active状态是邻居的一对状态

该状态下,BGP过程会等到TCP连接完成之后再决定后续的动作。

A)如果TCP连接成功,BGP过程将ConnectRetry计时器清零,并完成初始化,给邻居发送一个Open消息并转移到发送Open消息状态。

这个状态和在Active状态时的TCP连接成功是完全一样的!

B)如果TCP连接建立失败,BGP将继续监听由邻居发起的连接,并重置ConnectRetry计时器并转移到Active状态。

这个状态和在Active状态时的TCP连接失败是完全一样的!

C)如果在连接状态下,ConnectRetry超时,计时器将重新开始,并再次试图与邻居建立TCP连接,BGP保持Connect状态,此时如果有任何其他输入事件则直接转入Idle状态。

:OpenSent状态

该状态下,已经发送了Open消息,BGP等待邻居发过来的Open消息。

A)当收到一个Open消息,如果发现差错,将给邻居发一个Notification消息并转入Idle状态;

形象理解:开口说话,当收到一个有毛病的语气话语时,直接断开,为idle,88.

B)如果收到Open消息,如果没有问题,则给邻居发送一个Keepalive消息并将Keepalive计时器清零,此时协商一个较短的Holdtime。

形象理解:会面正常,聊天愉快,下次约定时间再见面。

C)如果收到一个TCP断开消息,则本地断开BGP连接并重置ConnectRetry计时器,并转入Active状态。

:Open Confirm状态

该状态下BGP会等待一个Keepalive消息(正常消息)Notification消息(不正常消息)

A)如果收到一个Keepalive消息,则转入Establish状态;

B)如果收到一个Notification消息,则转入idle状态,并断开TCP连接;

C)如果Hold计时器超时,检测到差错或出现Stop事件,则BGP将给邻居发送一个Notification消息并断开TCP连接,进入idle状态。

:Establish状态

该状态下,BGP对等体已经完全正常建立,双方可以自由交换Update报文、Keepalive报文和Notification消息,如果收到Notification消息,则自动转入idle状态,并断开TCP连接。

TCP使用的四种计时器:

1、重传计时器(资源打开重试计时器,默认120S)–ConnectRetry Timer

TCP发送报文段时,就创建该特定报文段的重传计时器。

1.1、若在计时器截止时间到(通常60秒)之前收到了对此特定报文段的确认,则撤销此计时器。

1.2、若在计时器截止时间之前没有收到对此特定报文的确认,则就认为该报文丢失,需要重传此报文段,并将计时器复位(复位后开始进行计时重传)

2、坚持计时器–Holdtime Timer

假设TCP收到了一个窗口大小为0报文段,发送TCP就停止传送报文段,直到接收TCP发送一个非零的窗口大小。但是这个确认有可能丢失,若确认丢了,接收TCP并不会知道,而是认为他已经完成任务了。但是发送TCP由于没有收到确认,就会一直等待接收方发送确认来通知窗口的大小。双方的TCP这时就会造成死锁,所以要使用一个计时器来避免死锁的发送。

TCP收到一个窗口大小为0的确认时,就要启动坚持计时器。当坚持计时器期限到时,发送TCP就发送一个特殊的探测报文,这个探测报文段只有一个字节数据,它有一个序号,但是它的序号永远不需要确认。探测报文段提醒对端,确认已丢失,必须重传。

坚持计时器的值设置为重传时间的数值。若没有收到从接收端来的响应,需要发送一个探测报文,并将坚持计时器的值加倍和复位,直到这个值增大到门限值(通常60秒)为止。在这以后,发送端每隔60秒发送一个探测报文,直到窗口重新打开。

3、保活计时器–Keepalive Timer

保活计时器用来防止两个TCP之间的连续出现长时间的空闲。

假定客户已主动与服务器建立了TCP链接。然后这个客户端出现故障。在这种情况下,这个链接就会永远的处于打开状态。而服务器维护一个链接,也是要耗费一定的资源的,所以必须采取措施,使服务器不能白白等下去。

要解决这种问题,就要对服务器设置保活计时器。每当服务器收到客户的信息,就将计时器复位,保活时间通常设置为2小时。若服务器过了两小时还没有收到客户的信息,他就发送一个探测报文,以后每隔75秒就发一次,连续发送10个探测报文后客户端仍然没有响应,服务器就认为客户端出现了故障,接着就关闭这个链接。

4、时间等待计时器–Time_Wait Timer

当客户端进入TIME-WAIT状态的时候,链接还没有释放掉,必须等待2倍的MSL(最长报文段寿命)后,客户端才能关闭连接。在时间等待期间,链接还处于一种过渡状态。这就可以使重复的FIN报文段(若果有的话)可以到达目的站因而可将其丢弃。

本文来自博客园,作者:{艳花三月下春秋},转载请注明原文链接:{https://www.cnblogs.com/longshao0918/}