前期回顧
open報文攜帶信息
1、自身AS號
2、bgp route id
3、BGP 版本號
4、hold time
能力協(xié)商
1、地址簇協(xié)商:ipv4單播地址簇
2、路由刷新功能
3、4字節(jié)AS號的支持
下來我們做一個簡單的實驗:直連路由器建立鄰居,然后通過抓包分析BGP的報文協(xié)議

我們看到TCP三次握手之后,互相發(fā)open 報文,然后繼續(xù)keepalive 報文,然后鄰居關(guān)系就正常建立起來了。
keepalive報文
默認每隔60s周期性發(fā)送,如果180s沒有收到keepalive報文,則認為BGP鄰居失效,斷開TCP連接。
其他報文
除此之外,BGP還有其他三種報文類型,一共五種,
分別是
update報文:BGP路由傳遞以及撤銷
Route-refresh報文:
用于手動進行BGP路由的觸發(fā)更新,或者用于ORF功能。
Notification報文:
通知報文,用于報錯,收到該報文會斷開TCP連接。
總結(jié):
open報文:
鄰居建立和能力參數(shù)協(xié)商,(至少有一個地址簇能力要一致)
keepalive報文:
默認每隔60s周期性發(fā)送,如果180s沒有收到keepalive報文,則認為BGP鄰居失效
斷開TCP連接。
updata報文:
BGP路由傳遞以及撤銷
Route-refresh報文:
用于手動進行BGP路由的觸發(fā)更新,或者用于ORF功能。
Notificationn報文:
通知報文,用于報錯,收到該報文會斷開TCP連接。

BGP狀態(tài)機
Idle(空閑):idle是bgp連接的第一個狀態(tài),在空閑狀態(tài),bgp在等待一個啟動事件,啟動事件出現(xiàn)以后,bgp初始化資源,復(fù)位連接重試計時器(Connect-Retry),發(fā)起一條TCP連接,同時轉(zhuǎn)入connect(連接)狀態(tài)。路由器再從路由表中搜索去往neighbor指定的ip地址的路由,看是否有前往該地址的路由,如果沒有明細路由的話,就會卡在這個狀態(tài),即使存在默認路由也是不可以的,因此此時不會主動發(fā)起TCP連接,如果出現(xiàn)這樣的情況,可以去查看show ip route,然后通過配置“靜態(tài)路由”或者“通過IGP來通告”neighbor地址的ip來解決這個問題。
1、沒有去往鄰居地址的路由,無法發(fā)起TCP三次握手,也無法完成TCP的三次握手。
2、鄰居發(fā)起的TCP握手,被本端拒絕,拒絕的原因是鄰居發(fā)起TCP報文的源地址,不是本端指定的鄰居地址。
Connect(連接):在Connect狀態(tài),BGP發(fā)起一個TCP連接,如果連接重傳計時器(Connect-Retry)超時,就重新發(fā)起TCP連接,并繼續(xù)保持在Connect狀態(tài),如果TCP連接成功,就會轉(zhuǎn)入OpenSent狀態(tài),如果TCP連接失敗,就轉(zhuǎn)入Active狀態(tài)。
如果搜索到了,則開始建立TCP連接,如果成功的話,鄰居狀態(tài)進入“connect”狀態(tài)。要分清楚是建立TCP連接的源地址和目標(biāo)地址是什么,是雙方的neighbor如果雙方指定的IP地址不相同,那肯定就得不到“期望”的TCP連接。
當(dāng)發(fā)起TCP連接路由器,無法收到鄰居的TCP回應(yīng)報文時,就會卡在connect狀態(tài),并且5s后重傳一次TCP連接請求,再等待32s左右,重新發(fā)起TCP連接請求,通常是由于發(fā)起端存在鄰居地址的路由,并能主動發(fā)送TCP3次握手,但無法從鄰居接收第二次握手的報文,通常是由于鄰居缺乏到對端的路由,或者是應(yīng)答報文中途被丟棄
發(fā)起tcp連接的路由器,在5s內(nèi),如果沒有得到鄰居的任何回應(yīng)報文,重傳tcp報文,在建立不起來重連
Active狀態(tài):在Acitve狀態(tài),BGP總在試圖建立TCP連接,如果連接重傳計時器(Connect-Retry)超時,就退回到Connect章臺,如果TCP連接成功,就轉(zhuǎn)入OpenSent狀態(tài),如果TCP連接失敗,就繼續(xù)保持在Acitve狀態(tài),并且繼續(xù)發(fā)起TCP連接,沒有收到 對OpenSent報文的確認 報文。
當(dāng)發(fā)送TCP連接路由器,能收到相應(yīng)的鄰居應(yīng)答報文,代表兩臺路由器能正常交互報文,但是依然無法建立起三次握手,將會進入Active狀態(tài)
鄰居之間地址可達,但是建立BGP鄰居的源地址目的地址不匹配,導(dǎo)致本段主動發(fā)起TCP連接的源地址和對端指定的鄰居地址不匹配,導(dǎo)致本段處于active,對端處于idle狀態(tài)
OpenSent (打開消息已發(fā)送:代表已經(jīng)發(fā)送open報文,并等待接收鄰居的open報文):在OpenSent狀態(tài),TCP連接已建立,BGP也已經(jīng)發(fā)送了第一個Open報文,剩下的工作,BGP就在等待其對等體發(fā)送Open報文,并對收到的Open報文進行正確性檢查,如果有錯誤,BGP就開始發(fā)送Keepalive報文,并復(fù)位Keepalive計時器,開始計時。同時轉(zhuǎn)入OpenConfirm狀態(tài)。
TCP連接建立之后,開始發(fā)送open報文,包括很多參數(shù),以讓對方去根據(jù)這個“open”來協(xié)商參數(shù)。
只要TCP建立成功,一定就可以發(fā)送出open報文,除非在接口做策略控制。
OpenConfirm(打開消息確認:代表收到鄰居的open報文,并發(fā)送keepalive報文,等待接收鄰居的keepalive報文)狀態(tài):在OpenConfirm狀態(tài),BGP發(fā)送一個Keepalive報文,同時復(fù)位保持計時器,如果收到了一個Keepalive報文,就轉(zhuǎn)入Established的階段,BGP鄰居關(guān)系就建立起來了,如果TCP連接中斷,就退回到Idle狀態(tài)。
如果參數(shù)協(xié)商成功,就會發(fā)送Keepalive報文,進行隱式確認,收到該報文之后,就進入open-confirm狀態(tài)。
如果在5s之內(nèi)依然是沒有收到Keepalive報文的話,就進入Active狀態(tài)。
@不同意openSend報文中的內(nèi)容,即參數(shù)協(xié)商不成功,就不會發(fā)送open-confirm回去。一般就是AS號不同,此時鄰居表中看到的狀態(tài)是:不停的idle和active狀態(tài)之間的切換。
Established:鄰居關(guān)系建立。
Established(連接已建立):在Established狀態(tài),BGP鄰居關(guān)系已經(jīng)建立,這時,BGP將和它的鄰居們交換Update報文,同時復(fù)位保持計時器。