最近刚刚了解到BGP协议。从各类文档和教材中都可以看到BGP协议依靠TCP传输,首先通过TCP三次握手建立连接,发送open报文,然后发送keepalive报文。
但是在实际抓包过程中,我发现BGP邻居的建立并不是简单的三次握手这么简单
1.在设备开启BGP后(R1)会有功能后即具备监听179端口能力,设备在指定邻居后等待32秒开始向邻居发送TCP建立连接请求报文对应图中3-8号报文,但是如果对端没有开启BGP协议则会显示为端口被拒绝。
2.当对端(R2)开启BGP协议后,R2具备监听179端口能力。但是此时R2并没有配置邻居信息,因此R2会通过置位RST回复R1请求即对应9-12号报文。
3.当R2指定邻居信息后,R2具备了建立连接的能力,R1发送的TCP连接会经历3次握手,此时R1建立TCP成功,具备发送open报文能力发送了Open报文。
4.但是R2(本人猜测)虽然具备了处理TCP的能力,但是R2的状态机并没有到达OpenSent状态,因此R2发送FIN置位并通过ACK置位确认了R1发送的Open报文。
5.R1收到FIN置位,为R2回复ACK,此时R1建立的链接已经经历了两次挥手(TCP建立连接3次握手,4次挥手)
6.为保证状态一致,R2发送与R1建立连接的TCP请求,R2与R1通过三次握手建立连接;
7.R2通过TCP建立连接成功后具备了发送open报文的能力,R1就会回复ACK对Open报文进行确认,同时置位FIN结束掉R1与R2建立的链接。
8.R2对FIN置位消息进行确认,R1向R2建立的TCP连接经过完整的四次挥手断开连接。此时还剩下R2向R1发起的TCP请求。双方都具备发送open报文的能力并经过了ACK确认,因此进入下一个阶段。
由于本人尚处学习之中,欢迎各位专家批评指正提出意见。