1. BGP的報文和狀態
1.1. BGP報文
1.1.1. BGP報文結構
BGP所有的報文都是單播
1.1.2. BGP報文類型
BGP報文由BGP報文頭和具體報文內容兩部分組成
消息最長爲4096字節,最短爲19字節(只包含報文頭)
BGP報文報頭
BGP報文頭包括三個部分,總長19字節
Marker(16字節):用於檢查BGP對等體的同步信息是否完整,以及用於BGP驗證的計算。不使用驗證時所有比特均爲1(十六進制則全“FF”)。
Length(2個字節):BGP消息總長度(包括報文頭在內),以字節爲單位。長度範圍是19~4096
Type(1個字節):BGP消息的類型。Type有5個可選值,表示BGP報文頭後面所接的5類報文(其中,前四種消息是在RFC4271中定義的,而Type5的消息則是在RFC2918中定義的)
Open報文
如果BGP報文頭中的TYPE爲1,則該報文爲OPEN報文,OPEN報文用於建立BGP連接
version:表示協議的版本號,現在BGP的版本號爲4
My autonomous System:發送者自己的AS域號
Hold Time:用於協商BGP對等體間保持建立連接關係,發送Keeplive或Update等報文的時間間隔。BGP的狀態機必須在收到對等體的Open報文後,對發送和接收的Open報文的Hold time時間作比較,選擇較小的時間作爲協商結果。Hold Time的值可爲零(不發送Keeplive報文)或大於等於3,系統默認180
BGP Identifier:發送者的router id
Opt Parm Len:表示Optional Parameters(可選參數)的長度。如果此值爲0,表示沒有可選參數
Optional Paramters:此值爲BGP可選參數列表,每一個可選參數是一個TLV格式的單元(RFC3392)
Update報文
如果BGP報文頭中的TYPE爲2,則該報文爲UPDATE報文,UPDATE報文用於通告路由
Unfeasible Routes Length:標明Withdrawn Routes部分的長度。其值爲零時,表示沒有撤銷的路由
Withdrawn Routes:包含要撤銷的路由列表,列表中的每個單元包含一字節的Length域和Prefix域
Total Path Attribute Length:表明Path Attributes部分的長度。其值爲零的時,表示沒有路由和路由屬性通告
Path Attribute:含要更新的路由屬性列表,按其類型號從小到大的順序排序,填寫更新路由的所有屬性。每一個屬性單元包括屬性類型,屬性長度,屬性值三部分,其編碼採用TLV格式
1. Attr.TYPE(2個字節):包括1字節的Flags和1字節的Type Code
Attr.Flags(1個字節):表示屬性的標記,其每個bit位的意義如下顯示
1. O: Optional bit, 屬性的可選性。決定屬性是否爲必攜帶屬性。帶可選屬性(optional)設爲1,公認屬性(well-known)設爲零。
2. T: Transitive bit 屬性的可傳遞性。對於可選屬性,是可傳遞的設爲1,非可傳遞的設爲0。對於公認屬性必須設爲1。
3. P: Partial bit 屬性的局部性。對於可傳遞的可選屬性是局部的設爲1,是完全的設爲零。對於非可傳遞的的可選屬性和公認屬性,必須設爲零。
4. E: Extended Length bit 決定該屬性的長度的字段(即Attr. Length)是否需要擴展。不需要擴展則設爲零,Attr. Length佔1個字節;需要擴展則設爲1,Attr. Length佔2個字節。
5. U: Unused bits 低4位沒有使用,發送時必須全部設爲零,並且在接收時被忽略
Attr.Type Code:(1個字節),表示屬性的類型號
2. Attr.Length:長度字節
3. Attr.Value:根據不同的屬性類型填寫不同的內容
Network Layer Reachability Information(NLRI):含要更新的地址前綴列表,每一個地址前綴單元由一個LV二元組(prefix length, the prefix of the reachable route)組成,其編碼填寫方法與Withdrawn Routes的填寫方法相同
Notification報文
如果BGP報文頭中的TYPE爲3,則該報文爲NOTIFICATION報文,NOTIFICATION報文用於處理BGP進程中的各種錯誤
Error code(1個字節):定義錯誤的類型,非特定的錯誤類型用零表示
Error subcode(1個字節):指定錯誤細節編號,非特定的錯誤細節編號用零表示
Data:指定錯誤數據內容
Keeplive報文
如果BGP報文頭中的TYPE爲4,則該報文爲KEEPALIVE報文。KEEPALIVE報文用於保持BGP連接。
KEEPALIVE報文只有BGP報文頭,沒有具體內容,故其報文長度應固定爲19個字節
Route-refresh報文
如果BGP報文頭中的TYPE爲5,則該報文爲REFRESH報文,REFRESH報文用於動態的請求BGP路由發佈者重新發布UPDATE報文,進行路由更新
1.2. BGP狀態
1.2.1. BGP狀態類型
Idle狀態:即空閒狀態,不接受任何BGP連接,等待Start事件的產生。如果有Start事件的產生,系統開啓ConnectRetry定時器,向BGP鄰居發起TCP連接,並將狀態變爲Connect
Connect狀態:即連接狀態,系統會等待TCP連接建立完成。
若TCP建立完成,則拆除ConnectRetry定時器,併發送Open消息,將狀態置爲Open-Sent狀態;
若TCP建立失敗,則會重置ConnectRetry定時器(定時器的時間會依次翻倍)並轉爲Active狀態
Active狀態:即活躍狀態,表示TCP建立失敗,會重新建立連接,建立成功後變爲Open-sent
Open-Sent:即發送狀態,該狀態中系統和已經向鄰居發送了Open報文,等待鄰居的Open消息。如果沒有錯誤發送,收到鄰居的Open消息後,進入Open-confirm狀態
Open-confirm:即確認狀態,該狀態表明系統已經發送了Keeplive報文,等待對方的keeplive。
Open-confirm:即確認狀態,該狀態表明系統已經發送了Keeplive報文,等待對方的keeplive。
如果keeplive定時器超時,則重置Holdtime定時器
如果收到notification報文,則斷開連接
Established狀態:即連接建立狀態,說明BGP連接建立可以完成了,可以發送Update消息交換路由信息。
1.2.2. BGP鄰居關係建立
1.2.3. BGP狀態機
1.2.4. BGP活躍狀態驗證
活躍(Active):路由器進行TCP連接,等待響應
狀態可能在活躍和連接之間不斷循環
由於以下原因,鄰居可能不知道如何返回到該路由器
1. 指定鄰居的地址和源地址不一樣
2. 鄰居與錯誤的地址建立對等體關係
3. 不存在該路由器的鄰居聲明
4. AS號配置錯誤
2. BGP路由宣告
2.1. BGP數據庫
2.2. BGP路由宣告原則
缺省條件下,BGP不發佈任何本地路由
只有明確宣告的網絡纔會發送給鄰居
宣告的網絡必須能精確地在路由表中找到
收到多條路由時,只選最優的給自己使用
只把自己使用的最優路由宣告給鄰居
從EBGP學習到的路由會宣告給所有鄰居
從IBGP學習到的路由不會宣告給IBGP
從IBGP學習到的路由會宣告給EBGP
2.3. BGP路由宣告方法
本地宣告(Network)
Network命令是逐條將IP路由表中已存在的路由引入到BGP路由表中
引入宣告(Import)
Import命令是根據運行的路由協議(RIP,OSPF,ISIS等)將路由引入到BGP路由表中,同時import命令開可以
2.4. BGP下一跳
BGP在給鄰居傳遞路由時的下一跳=等於更新源
在EBGP間傳遞時會修改下一跳爲自己的更新源
在IBGP間傳遞時不會修改下一跳爲自己的更新源