报文类型

BGP的邻居状态和报文类型_重传

BGP的邻居状态和报文类型_TCP_02

BGP的邻居状态和报文类型_TCP_03

可以看到建立完BGP后经过3次握手后就会发open报文

BGP报文:
主要有两部分组成,分别是BGP报文头,和具体报文内容:
1、BGP报文头:
marker:占用16个字节,默认为全F,用于检查BGP邻居头部的消息是否完整。
length:占用2字节,用于描述BGP报文的总长度。包括报文头+具体报文内容
type  :用于描述当前BGP报文类型的,分为 1 2 3 4 5
2、OPEN报文:
version:BGP版本,默认都是4
my as  :用于描述发出该open报文的路由器所述AS号,
				同时校验对端的AS号和本地配置的AS号是否一致
hold time:描述路由器邻居失效时间,默认情况为keepalive时间的3倍,
					当两端holdtime时间不一致时,需要协商为数值较低的执行。
BGP ID : 用来描述发出该Open报文的路由器BGP router-id
Optional Parmeters length:BGP协商参数字段长度
Optional Parmeters:BGP协商参数

BGP邻居状态机

BGP的邻居状态和报文类型_重传_04

1.Idle (初始状态)

 BGP的初始状态,一旦在BGP中配置了peer后,或者重置了已经存在的peer,就会进入到idle状态。在这个状态中BGP不会向这个peer发送tcp三层握手,同时会拒绝这个peer发来的三次握手。

我们把上面的实验中的R2的bgp中peer删除了。抓包可以看到R1一直在发送syn的tcp报文,但是R2不会发送tcp报文还会拒绝这个报文。

BGP的邻居状态和报文类型_邻居状态机_05

在进入idle状态后,会触发华为的start事件,这个事件是32S,在这个事件之后就开始建立peer的三次握手,建立TCP链接,发送SYN以后,状态就变成了connect。

常见的几种卡在idle状态:

a. 如果没有去往该peer的路由,那么就无法发送syn,那么此时的peer会一直卡在idle状态

b.收到了notification报文后会会退到idle状态

c.手动挂起邻居

peer 12.1.1.2 ignore  //手动挂起邻居   在邻居表中表现为:Idle(Admin)

2.connect(连接状态)

这个状态下,BGP会启动连接重传定时器(connect retry 默认是32秒)用于等待tcp的三次握手。

2.1 向邻居发起syn后互进入到这个状态,并在这个状态完成3次握手

2.2如果TCP3次握手成功,那么就向该邻居发送open报文,然后转到opensent状态

2.3 如果TCP3次握手失败,那么将这个peer状态改为active

BGP的邻居状态和报文类型_邻居状态机_06

2.4如果重传定时器超时,BGP没有收到邻居的响应,那么会卡在connect状态

常见的几种卡在connect状态的原因

a邻居没有给我响应

b我的syn发送的时候发现目的不可达,即路由不可达

cEBGP邻居没有设置TTL多跳

总之就是卡在connect状态就是邻居没有给我响应。

3、active状态(活跃的)

 当TCP三次握手失败,才会进入这个状态。在这个状态下,BGP总是试图去建立TCP三次握手。

 3.1 如果在多次尝试下,TCP3次握手成功了,那么BGP会向该peer发送open报文,关闭重传定时器,转至opensent状态。

 3.2 如果在多次尝试下,TCP3次握手仍然失败,那么BGP会将该peer停留在active状态。

 3.3 如果重传定时器32s超时,且没有得到该peer的响应,那么会转至connect状态。

4、opensent状态(open报文已发送状态)

 在这个状态下,BGP已经向该peer发送了OPEN报文,在等待对方给我发送Open报文。

 4.1 如果收到了对方发来的Open报文,参数协商成功,则会向该peer发送keepalive报文,然后转到openconfirm状态。

 4.2 如果收到了对方发来的open报文,参数协商失败,则会向该peer发送notification报文,然后转到idle状态。

5、openconfirm状态(open协商成功状态)

 5.1 在这个状态下,BGP等待对方的keepalive报文,如果收到了对方发来的keepalive报文则转换为established状态。

 5.2 在这个状态下,BGP如果收到了notification报文,则转换为idle状态。

6、established(连接已建立)

 在这个状态下说明邻居已经建立完毕,这个状态下可以交互的报文:update,notification,keepalive,route-refresh

 6.1 如果在这个状态下,收到正确的update和keepalive报文,那么BGP会认为邻居处于正常状态,继续保持。

 6.2 如果在这个状态下,收到错误的update和Keepalive报文,那么BGP会认为邻居处于异常状态,会发送notification报文,转到idle状态

 6.3 route-refresh报文的发送不影响邻居关系

BGP的邻居状态和报文类型_TCP_07