BGP報文頭基本格式(RFC4271)
報文格式
BGP報文由BGP報文頭和具體報文內容兩部分組成。(RFC4271)
BGP的運行是通過消息驅動的,共有5種消息類型,這些消息有相同的報文頭。這些消息通過TCP協議進行傳播(端口號是179)。消息最長為4096字節,最短為19字節(只包含報文頭)。
BGP報文頭包括三的部分,總長19字節。各個部分的格式和功能如下:(RFC4271)
圖1 BGP報文頭格式
- Marker:占16字節,用於檢查BGP對等體的同步信息是否完整,以及用於BGP驗證的計算。不使用驗證時所有比特均為1(十六進制則全“FF”)。
- Length:占2個字節(無符號位),BGP消息總長度(包括報文頭在內),以字節為單位。長度范圍是19~4096。
- Type:占1個字節(無符號位),BGP消息的類型。Type有5個可選值,表示BGP報文頭后面所接的5類報文(其中,前四種消息是在RFC4271中定義的,而Type5的消息則是在RFC2918中定義的):
TYPE值 |
報文類型 |
1 |
OPEN |
2 |
UPDATE |
3 |
NOTIFICATION |
4 |
KEEPALIVE |
5 |
REFRESH(RFC2918) |
BGP OPEN報文格式
報文格式
如果BGP報文頭中的TYPE為1,則該報文為OPEN報文。報文頭后面所接的報文內容如下,OPEN報文用於建立BGP連接:
圖1 OPEN報文格式
字段 |
長度 |
含義 |
|||
Version |
1個字節(無符號位) |
表示協議的版本號,現在BGP的版本號為4。 |
|||
My Autonomous System |
2個字節(無符號位) |
發送者自己的AS域號 |
|||
Hold Time |
2個字節(無符號位) |
發送者自己設定的hold time值(單位:秒),用於協商BGP對等體間保持建立連接關系,發送KEEPALIVE或UPDATE等報文的時間間隔。BGP的狀態機必須在收到對等體的OPEN報文后,對發出的OPEN報文和收到的OPEN報文兩者的hold time時間作比較,選擇較小的時間作為協商結果。Hold Time的值可為零(不發KEEPALIVE報文)或大於等於3,我們系統的默認為180。 |
|||
BGP Identifier |
4個字節(無符號位) |
發送者的router id。 |
|||
Opt Parm Len |
1個字節(無符號位) |
表示Optional Parameters(可選參數)的長度。如果此值為0,表示沒有可選參數。 |
|||
Optional Parameters |
|
此值為BGP可選參數列表,每一個可選參數是一個TLV格式的單元(RFC3392)。 0 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-... | Parm. Type | Parm. Length | Parameter Value (variable) +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-...
Capability Code為1: Capability Value值是一個TLV三元組,共占4個字節: 0 7 15 23 31 +-------+-------+-------+-------+ | AFI | Res. | SAFI | +-------+-------+-------+-------+ AFI:地址族標識(Address Family Identifier),占2個字節,能力所支持地址族標識信息,用以和SAFI一同確定網絡層協議和IP地址間的關系,編碼方式與多協議擴展中的規定相同。其值按照RFC1700中ADDRESS FAMILY NUMBERS的定義; Res:保留位,占1個字節,發送者應將其設置為零,在接受的時候忽略; SAFI:子地址族標識(Address Family Identifier),占1個字節,能力所支持的子地址族標識信息,用以和AFI一同確定網絡層協議和IP地址間的關系,編碼方式與多協議擴展中的規定相同。其值按照RFC1700中ADDRESS FAMILY NUMBERS的定義。 Capability Code為2(RFC2918) 表示支持路由刷新能力,即Route Refresh Capability。此能力的code為2,length為零,無value部分。 需要說明的是,只有在能力協商中使能了支持Route Refresh Capability,路由器才能處理REFRESH報文。我們的實現是默認情況下,支持IPv4單播能力與路由刷新能力,其他能力需要另外設定。 |
|||
|
表1 AFI及SAFI編碼說明 |
||||
|
AFI編碼 |
AFI說明 |
SAFI編碼 |
SAFI說明 |
說明 |
|
1 |
IPv4地址族 |
1 |
單播 |
IPv4單播 |
|
2 |
組播 |
IPv4組播 |
||
|
128 |
VPN |
IPv4的L3VPN |
||
|
2 |
IPv6地址族 |
1 |
單播 |
IPv6單播 |
|
2 |
組播 |
IPv6組播 |
||
|
128 |
VPN |
IPv6的L3VPN |
||
|
196 |
二層 |
128 |
VPN |
L2VPN的Kompella方式 |
BGP UPDATE報文格式
如果BGP報文頭中的TYPE為2,則該報文為UPDATE報文。報文頭后面所接的報文內容如下(RFC 4271),UPDATE報文用於通告路由。
報文格式
圖1 UPDATE報文格式
字段 |
長度 |
含義 |
Withdrawn Routes Length |
2個字節(無符號位) |
標明Withdrawn Routes部分的長度。其值為零時,表示沒有撤銷的路由。 |
Withdrawn Routes |
變長 |
包含要撤銷的路由列表,列表中的每個單元包含1字節的Length域和可變長度的Prefix域。
Mask掩碼(十進制) Length Prefix 32 20 C8 C8 C8 C8 25 19 C8 C8 C8 80 20 14 C8 C8 C0 15 0F C8 C8 |
Total Path Attribute Length |
2個字節(無符號位) |
標明Path Attributes部分和Network Layer Reachability Information兩部分的長度。其值為零時,表示沒有路由及其路由屬性要通告。 |
Path Attributes |
變長 |
包含要更新的路由屬性列表,按其類型號從小到大的順序排序,填寫更新的路由的所有屬性。每一個屬性單元包括屬性類型,屬性長度,屬性值三部分。其編碼采用TLV格式。如下所示。 圖2 BGP路徑屬性TLV格式 其中,Attr.TYPE占2個字節(無符號位),包括1字節的Flags(無符號位)和1字節的Type Code(無符號位)。 圖3 TLV結構-Type Attr.Flags:占1個字節(8個bit),表示屬性的標記,其每個bit位的意義如下顯示: O: Optional bit, 屬性的可選性。決定屬性是否為必攜帶屬性。帶可選屬性(optional)設為1,公認屬性(well-known)設為零。 T: Transitive bit 屬性的可傳遞性。對於可選屬性,是可傳遞的設為1,非可傳遞的設為0。對於公認屬性必須設為1。 P: Partial bit 屬性的局部性。對於可傳遞的可選屬性是局部的設為1,是完全的設為零。對於非可傳遞的的可選屬性和公認屬性,必須設為零。 E: Extended Length bit 決定該屬性的長度的字段(即Attr. Length)是否需要擴展。不需要擴展則設為零,Attr. Length占1個字節;需要擴展則設為1,Attr. Length占2個字節。 U: Unused bits 低4位沒有使用,發送時必須全部設為零,並且在接收時被忽略。 Attr.Type Code:占1個字節(無符號位),表示屬性的類型號。設置如下表2。 Attr.Value:根據不同屬性的類型填寫不同內容。 |
Network Layer Reachability Information(NLRI) |
變長 |
包含要更新的地址前綴列表,每一個地址前綴單元由一個LV二元組(prefix length, the prefix of the reachable route)組成,其編碼填寫方法與Withdrawn Routes的填寫方法相同。 |
|
表1 路由屬性的類型號列表 |
|
|
屬性類型 |
屬性值 |
|
1:Origin |
IGP |
|
EGP |
|
|
Incomplete |
|
|
2:As_Path |
AS_SET |
|
AS_SEQUENCE |
|
|
AS_CONFED_SET |
|
|
AS_CONFED_SEQUENCE |
|
|
3:Next_Hop |
下一跳的IP地址 |
|
4:Multi_Exit_Disc |
MED用於判斷流量進入AS時的最佳路由 |
|
5:Local_Pref |
Local_Pref用於判斷流量離開AS時的最佳路由 |
|
6:Atomic_Aggregate |
BGP Speaker選擇聚合后的路由,而非具體的路由 |
|
7:Aggregator |
發起聚合的路由器ID和AS號 |
|
8:Community |
團體屬性 |
|
9:Originator_ID |
反射路由發起者的Router ID |
|
10:Cluster_List |
反射路由經過的反射器列表 |
|
14:MP_REACH_NLRI |
多協議可達NLRI |
|
15:MP_UNREACH_NLRI |
多協議不可達NLRI |
|
16:Extended Communtities |
擴展團體屬性 |
BGP的NOTIFICATION報文格式
如果BGP報文頭中的TYPE為3,則該報文為NOTIFICATION報文。報文頭后面所接的報文內容如下(RFC 4271),NOTIFICATION報文用於處理BGP進程中的各種錯誤。
圖1 NOTIFICATION報文格式
各字段解釋如下:
- Error code:占1個字節(無符號位),定義錯誤的類型,非特定的錯誤類型用零表示。
- Error subcode:占1個字節(無符號位),指定錯誤細節編號,非特定的錯誤細節編號用零表示。
- Data:指定錯誤數據內容。
錯誤碼 |
錯誤子碼 |
|
1:消息頭錯誤 |
1:連接未同步 |
|
2:錯誤的消息長度 |
||
3:錯誤的消息類型 |
||
2:Open消息錯誤 |
1:不支持的版本號 |
|
2:錯誤的對等AS |
||
3:錯誤的BGP標識符 |
||
4:不支持的可選參數 |
||
5:認證失敗 |
||
6:不可接受的保持時間 |
||
7:不支持的能力 |
||
3:Update消息錯誤 |
1:畸形屬性列表 |
|
2:不可識別的公認屬性 |
||
3:缺少公認屬性 |
||
4:屬性標志錯誤 |
||
5:屬性長度錯誤 |
||
6:無效Origin屬性 |
||
7:AS路由環路 |
||
8:無效Next_Hop屬性 |
||
9:可選屬性錯誤 |
||
10:無效網絡字段 |
||
11:畸形AS_Path |
||
4:Hold Timer溢出 |
0:沒有特別的錯誤子碼定義。 |
|
5:有限狀態機錯誤 |
0:沒有特別的錯誤子碼定義。 |
|
6:終止 |
1:前綴超過最大值。 |
|
2:管理關閉 |
||
3:刪除鄰居 |
||
4:管理重置 |
||
5:連接失敗 |
||
6:其他配置改變 |
||
7:連接沖突 |
||
8:資源短缺 |
||
9:BFD斷開連接 |
||
Error Code |
Error Subcode |
|
1: Message header error |
1: connection not synchronized |
|
2: error message length |
||
3: error message type |
||
2: Open message error |
1: unsupported version number |
|
2: error peer AS |
||
3: error BGP identifier |
||
4: unsupported optional parameter |
||
5: authentication failed |
||
6: unacceptable Holdtime |
||
7: unsupported capability |
||
3: Update message error |
1: malformed attribute list |
|
2: unrecognized well-known attribute |
||
3: well-known attribute is missing |
||
4: attribute flags error |
||
5: attribute length error |
||
6: invalid origin attribute |
||
7: AS routing loop |
||
8: invalid Next-Hop attribute |
||
9: error optional attribute |
||
10: invalid network field |
||
11: abnormal AS-Path |
||
4: Hold timer expired |
0: no special definition of the error subcode |
|
5: Finite state machine error |
0: no special definition of the error subcode |
|
6: Cease |
1: maximum number of prefixes reached |
|
2: administrative shutdown |
||
3: peer de-configured |
||
4: administrative reset |
||
5: connection rejected |
||
6: other configuration change |
||
7: connection collision resolution |
||
8: out of resources |
||
9: BFD session Down |
BGP KEEPALIVE報文格式
報文格式
如果BGP報文頭中的TYPE為4,則該報文為KEEPALIVE報文。KEEPALIVE報文用於保持BGP連接。
KEEPALIVE報文只有BGP報文頭,沒有具體內容,故其報文長度應固定為19個字節。
BGP的REFRESH報文格式
如果BGP報文頭中的TYPE為5,則該報文為REFRESH報文。報文頭后面所接的報文內容如下(RFC 2918),REFRESH報文用於動態的請求BGP路由發布者重新發布UPDATE報文,進行路由更新。
報文格式
圖1 REFRESH報文格式
Field字段 |
Length長度 |
Description描述 |
AFI |
2字節(無符號位) |
表示地址族id,與UPDATE報文中的定義相同。 |
Res. |
1字節(無符號位) |
所有為應全為零,在接收報文時,此位被忽略。 |
SAFI |
1字節(無符號位) |
與UPDATE報文中的定義相同。 |