BGP基礎(chǔ)知識
今天海翎光電的小編主要介紹一下BGP的相關(guān)基礎(chǔ)知識,文章淺顯易懂,適合對BGP完全沒有了解的同學(xué)。
AS(自治系統(tǒng)),由單一的機構(gòu)或組織所管理的一系列IP網(wǎng)絡(luò)及設(shè)備所構(gòu)成集合。 劃分AS的原因:1.整個地球上的網(wǎng)絡(luò)范圍太大,單個網(wǎng)絡(luò)收斂很慢且網(wǎng)絡(luò)延遲大;2.每個網(wǎng)絡(luò)可能是某個組織或公司組建的,他們并不想將自己辛苦組建的網(wǎng)絡(luò)交給別人管理,所以需要自治管理 為了方便對自治系統(tǒng)進(jìn)行管理,給每一個自治系統(tǒng)設(shè)計了一個號,即AS號。AS號由16位二進(jìn)制構(gòu)成,取值范圍:0 - 65535,其中1 - 64511號為公有AS號, 64512 - 65534被設(shè)定為私有AS號。 因為傳統(tǒng)的AS號存在不夠用的情況,所以,目前大部分設(shè)備均支持拓展的AS號,由32位二進(jìn)制構(gòu)成。中國由于加入互聯(lián)網(wǎng)較晚,所以中國的AS號大多都是擴(kuò)展AS號。
重發(fā)布要求AS間需要有ASBR,ASBR同時具有兩個AS的路由信息,通過ASBR實現(xiàn)路由共享;而BGP是沒有ASBR的,由于AS是自治系統(tǒng),如果有ASBR,那這個ASBR歸誰管理?如果只歸一方管理,那他可以通過路由策略提高自己AS的流量的轉(zhuǎn)發(fā)速度,所以BGP是AS間各出一個或多個運行BGP的路由器,讓這些運行BGP的路由器建立鄰居關(guān)系后交換路由信息。
重發(fā)布在導(dǎo)入路由時會洗掉開銷值,會造成選路不佳的問題,而BGP具備強大的路由策略,BGP為路由信息設(shè)計了路徑屬性,通過屬性進(jìn)行選路,是的選路過程更加靈活,可控性更高。
BGP協(xié)議是無類別的路徑矢量協(xié)議。無類別即BGP在傳遞路由時會攜帶子網(wǎng)掩碼;路徑矢量,不同與距離矢量,路徑矢量是以一個AS為單位,而距離矢量是以一個路由為單位,距離矢量是一種路由算法,而BGP不需要計算路由,它只需將以計算好的路由傳遞給了鄰居即可。 我們對IGP(內(nèi)部網(wǎng)關(guān)協(xié)議)和EGP(外部網(wǎng)關(guān)協(xié)議)的要求不同,IGP需要在一個AS內(nèi)計算路由,所以我們要求IGP選路佳、收斂快、占用資源少;而EGP不同,EGP協(xié)議只需傳遞AS以計算好的路由,所以我們對EGP的可控性、可靠性要求更高。 EGP的追求:可控性:AS之間需要傳遞大量的路由信息,所謂可控,就是可以更方便的干涉選路,更容易做策略,以彌補重發(fā)布的不足。為了保證路由傳遞的可控性,更方便干涉選路,BGP協(xié)議舍棄了開銷值,取而代之的是他為路由信息設(shè)計了很多路徑屬性。可以通過屬性進(jìn)行選路,是的選路過程更加靈活,可控性更高。 EGP的追求:可靠性:BGP協(xié)議設(shè)備間需要交互大量的路由條目,但又不能選擇周期更新來占用鏈路資源,故只能進(jìn)行觸發(fā)更新;又為了保證傳輸?shù)目煽啃裕苯?strong style="margin: 0px; padding: 0px; outline: 0px; max-width: 100%; box-sizing: border-box !important; overflow-wrap: break-word !important;">選擇TCP協(xié)議作為傳輸層的協(xié)議來完成數(shù)據(jù)收發(fā),使用的是TCP 179號端口。但使用TCP協(xié)議通訊也會造成一些問題,傳輸效率降低,只能單播通訊(TCP需要去建立會話),占用資源會加大 ,用TCP之后,便不能通過廣播或者組播去自動發(fā)現(xiàn)鄰居進(jìn)行通信了。 由于BGP依靠TCP協(xié)議傳輸數(shù)據(jù),BGP協(xié)議可以實現(xiàn)非直連建鄰,非直連建鄰的前提條件是鄰居雙方網(wǎng)絡(luò)可達(dá), BGP的非直連建鄰是建立在IGP的基礎(chǔ)上。 BGP的鄰居更準(zhǔn)確的說是BGP的對等體,我們可以根據(jù)鄰居關(guān)系的建立情況,將BGP的鄰居關(guān)系分為兩種:
因為EBGP對等體之間一般采用直連建鄰的方法,所以,我們將EBGP對等體之間的數(shù)據(jù)包中的TTL值設(shè)置為1;而IBGP對等體之間往往需要非直連建鄰,所以,IBGP對等體之間的數(shù)據(jù)報中的TTL值我們設(shè)置為255;當(dāng)然,如果EBGP對等體之間需要非直連建鄰,則需要手工修改TTL值。 EGP的追求::AS-BY-AS:BGP將一個AS作為一個單位來看待,以一個AS為一跳,
無類別路徑矢量 -----距離矢量的升級版—AS–BY–AS 使用單播更新來發(fā)送所有信息;基于TCP 179端口工作 增量更新,僅觸發(fā)更新,無周期更新 具有豐富的屬性來取代IGP中度量進(jìn)行選路,有多個參數(shù)控制協(xié)議 可以在進(jìn)項和出項對流量實施強大的策略,可控性非常強大 默認(rèn)不被用于負(fù)載均衡-----通過各種選路規(guī)則僅僅產(chǎn)生一條最佳路徑 BGP支持認(rèn)證和聚合(將現(xiàn)有的IP地址合并成較大的、具有更多主機地址的路由域)
Open包主要用來建立鄰居關(guān)系,正常進(jìn)收發(fā)一次即可,Open包會攜帶一些建鄰需要協(xié)商的參數(shù),鄰居互相認(rèn)同對方的參數(shù)才可以建立鄰居關(guān)系。以下為Open包會攜帶的一些參數(shù): AS號:在手工建立鄰居關(guān)系需要時聲明鄰居的AS號。對端收到后會檢查聲明的AS號是否和本地的AS號一致,一致才可以建立鄰居關(guān)系。 認(rèn)證:BGP在建鄰時如果做認(rèn)證的話,需要比對雙方認(rèn)證口令,不一致則無法建立鄰居關(guān)系。 Router-ID:主要區(qū)分和標(biāo)定路由器。OPEN報文中攜帶RID的目的是為了確保雙方的RID不一致。確保其唯一性,如果相同,則無法正常建立鄰居關(guān)系。
holdtime:保活時間, 這個參數(shù)默認(rèn)值為 180S,即180S內(nèi)若收不到對方發(fā)送的keeplive或者UPdate包則將判定BGP鏈接中斷。雙方建鄰時攜帶這個值,但是并不要求必須相同。但是,執(zhí)行時必須相同,所以,將會選擇二者中較小的作為執(zhí)行時間
用來保活鄰居關(guān)系,默認(rèn)周期1min查詢鄰居關(guān)系是否存在;實際保活TCP會話。 Keeplive報文的發(fā)送周期為保活時間(hold time)的1/3,保活時間默認(rèn)為180S,則周期發(fā)送時間默認(rèn)為60S。 KeepLive包還有一個作用:在收到對方發(fā)送的OPEN報文后,臨時充當(dāng)確認(rèn)包的作用。
TCP本身具有確認(rèn)機制,可以確保傳輸?shù)目煽啃裕@里的確認(rèn)主要是確認(rèn)OPEN報文中攜帶的參數(shù),如果認(rèn)同對方的參數(shù),則將回復(fù)Keeplive包進(jìn)行確認(rèn)。 |
BGP中的更新包,用來攜帶路由條目,包括目標(biāo)網(wǎng)段,子網(wǎng)掩碼信息以及BGP的各種屬性 在UPdate包中存在撤銷路由字段,我們可以直接將不可達(dá)的路由信息放在該字段下進(jìn)行通告,以達(dá)到傳遞失效信息的目的。而不需要像RIP那樣采用帶毒傳輸?shù)姆绞健?/section>
BGP設(shè)計的一個告警機制,出現(xiàn)錯誤數(shù)據(jù)時收發(fā),當(dāng)BGP檢測到一個錯誤的時候,將會用這個包進(jìn)行告警,告知對端錯誤點在哪
用于改變路由策略后請求對等體重新發(fā)送路由信息,前提是對等體雙方均支持路由刷新
idle狀態(tài):空閑狀態(tài),一旦指定鄰居,就處于idle狀態(tài),然后BGP會首先檢查指定的IP地址在本地路由表中是否可達(dá),如果可達(dá),則開始嘗試建立TCP會話,進(jìn)入下一個狀態(tài);如果不可達(dá),則將停留在idle狀態(tài) connect狀態(tài):進(jìn)行TCP會話連接的狀態(tài)。如果TCP會話建立成功,則進(jìn)入下一個狀態(tài);如果TCP會話建立失敗,則進(jìn)入Active狀態(tài),該狀態(tài)會反復(fù)嘗試TCP連接,如果嘗試超時,則放棄重連,退回到idle狀態(tài)。
注意:在建立TCP會話連接時,雙方都會嘗試建立連接,一方建立成功,則將創(chuàng)建一個雙向的TCP會話通道;雙方都建立成功,則將會出現(xiàn)兩個雙向通道。則需要關(guān)閉一個TCP通道。后面開始發(fā)送OPEN報文,其中會攜帶RID,雙方將比較RID,僅保留RID大的一端發(fā)起的TCP連接,RID小的一端發(fā)起的TCP連接通道將被斷開。 |
OpenSent:開始發(fā)送OPEN報文,報文中攜帶建立鄰居關(guān)系所需的參數(shù)。當(dāng)收到對端發(fā)送的OPEN報文后,并且報文里的參數(shù)沒有問題,則將回復(fù)一個keeplive作為確認(rèn),進(jìn)入下一個狀態(tài);
OPENConfirm:在該狀態(tài),本段在等待對端keeplive包,當(dāng)對端收到本端的Open報文且確認(rèn)參數(shù)無誤,發(fā)送keeplive包進(jìn)行確認(rèn)進(jìn)入下一個狀態(tài)。 Established :建立完成狀態(tài) ,標(biāo)志著對等體關(guān)系的建立。
配置完成后,鄰居間單播TCP三次握手,目標(biāo)端口179,建立TCP的會話;之后所有的BGP協(xié)議數(shù)據(jù)包基于該會話進(jìn)行傳輸 會話建立后,鄰居間正常收發(fā)一次open報文,并互發(fā)keeplive包進(jìn)行確認(rèn)建立BGP的鄰居關(guān)系,并生成鄰居表 鄰居關(guān)系建立后,默認(rèn)每1min,使用keeplive周期保活鄰居關(guān)系,周期保活TCP會話 鄰居關(guān)系建立后,管理員選擇性將本地路由表中通過任意來源獲取的路由條目,向BGP協(xié)議中進(jìn)行宣告;使用updata數(shù)據(jù)包進(jìn)行鄰居間路由共享;之后生成BGP表; 本地對BGP表中的路由進(jìn)行選擇,默認(rèn)將最優(yōu)路徑加載于路由表中(最優(yōu)-僅僅基于BGP的選路規(guī)則,不一定為最佳路徑;BGP默認(rèn)不支持負(fù)載均衡) 若出現(xiàn)錯誤信息,鄰居間將使用Notification報文進(jìn)行報錯操作 收斂完成,僅keeplive周期保活即可,默認(rèn)保活時間為180S,周期發(fā)送時間為60S。 若發(fā)生結(jié)構(gòu)突變,則將直接發(fā)送UPdate報文進(jìn)行觸發(fā)更新。
AS間通過EBGP對等體交換路由信息,然后通過單播將獲取到的路由信息發(fā)送給IBGP對等體,使AS所有運行BGP的設(shè)備擁有了所有AS的路由信息,如下:R3從R1學(xué)到AS100的1.0.0.0/8的路由信息,然后通過單播傳給R7,R7傳給R2,所有AS內(nèi)運行BGP的路由器都學(xué)到了1.0.0.0/8的路由信息
矢量協(xié)議的特點是誰發(fā)給我這條路由,我到這條路由就找誰,如果R7想ping1.0.0.0/8,那R7就會將ping包發(fā)送給R3,由R3轉(zhuǎn)發(fā)。在R7發(fā)送ping包時,它首先查看路由表查找R3的位置,假設(shè)R7通過R4找R3,那R7就會將ping包發(fā)給R4,當(dāng)這個ping包來到R4上,R4看二層是找自己的,解封裝看三層,發(fā)現(xiàn)這個ping包的DIP為1.0.0.0/8網(wǎng)段的,但R4上沒有運行BGP,沒有收到關(guān)于1.0.0.0/8網(wǎng)段的路由信息,所以R4就會把這個ping包丟棄,雖然R7上有1.0.0.0/8的網(wǎng)段路由信息,但無法與R1通信,這就是BGP的路由黑洞。
BGP的路由黑洞:由于BGP協(xié)議可以非直連建鄰,故可能出現(xiàn)BGP協(xié)議跨越未運行BGP協(xié)議的路由器,導(dǎo)致BGP路由傳遞后,顯示控制層面可達(dá),但是,數(shù)據(jù)層面,流量經(jīng)過未運行BGP協(xié)議的路由器時,無法通過,形成路由黑洞。
AS內(nèi)運行BGP的設(shè)備將從BGP重發(fā)布到AS內(nèi)運行的IGP協(xié)議里:通過重發(fā)布將BGP所有路由導(dǎo)入到IGP協(xié)議里,同樣需要AS內(nèi)所有設(shè)備可以承載所有AS的路由信息,同第一條一樣不現(xiàn)實。 物理、邏輯拓?fù)淙B:直接讓AS內(nèi)運行BGP協(xié)議的所有設(shè)備互相連接,使IBGP間通信不需要經(jīng)過未運行BGP協(xié)議的設(shè)備,但由一個AS地理范圍可能很大,IBGP間距離較遠(yuǎn),所以使用真實鏈路連接IBGP也不現(xiàn)實,所以我們可以用GRE/MGRE等vpn技術(shù),通過虛擬鏈路連接IBGP對等體
MPLS:當(dāng)前工程中主要使用的解決BGP路由黑洞方案,MPLS后續(xù)會講。
注意:在目前我們的學(xué)習(xí)情況下,我們在做BGP實驗時都是用第一種方法解決路由黑洞 |
下圖中有三個AS,其中AS:1的一條路由信息傳給了AS:2,AS:2將這條路由信息傳給AS:3,如果AS:3又將這條路由信息傳回給AS:1且AS:1將這條路由信息加表,就會導(dǎo)致路由環(huán)路。
BGP協(xié)議在路由條目中有一條專門記錄所經(jīng)過的AS編號的路徑屬性,在上圖中AS:1發(fā)出的路由信息會攜帶編號1,AS:2將這條路由信息轉(zhuǎn)發(fā)給R3時,添加編號2;AS:3將這條路由信息轉(zhuǎn)發(fā)給AS:1時,也會添加編號3;最終AS:1收到這條路由信息的AS_PATH屬性記錄了1、2、3,R1發(fā)現(xiàn)該屬性中有自己的編號則拒絕接受這條路由信息,避免環(huán)路產(chǎn)出。
下圖在AS:64513內(nèi),R2、R3、R4兩兩建鄰,如果R2發(fā)布一條路由信息由R4到R3,再到R2,并且R3轉(zhuǎn)發(fā)給R2的路由信息改變了R2的路由表,則會形成環(huán)路。
因為BGP的AS-BY-AS的特性,導(dǎo)致AS內(nèi)部被認(rèn)為是一個整體,在默認(rèn)情況下,路由的屬性是不會發(fā)生變化的,所以,無法通過屬性來進(jìn)行防環(huán)。 IBGP水平分割:當(dāng)一個路由器從一個IBGP對等體出學(xué)習(xí)到某一條BGP路由時,他將不再把這條路由信息通告給其他的IBGP對等體。
IBGP水平分割可以有效的解決IBGP對等體之間路由回傳造成的環(huán)路問題,但是,也會引發(fā)路由信息傳遞障礙問題。如下圖中,如果R1學(xué)到其他AS的路由信息,它會將這些路由信息傳遞給R2,但由于IBGP水平分割,R2不能將這些路由信息傳遞給R3,R3就無法獲取R1收集到的路由信息。
想要避免IBGP水平分割帶來的問題,可以讓所有AS內(nèi)部運行BGP的路由器均建立IBGP對等體關(guān)系, 這種建立全連的IBGP對等體的方案并不是最佳解決方案,因為,當(dāng)一個AS內(nèi)運行BGP協(xié)議的路由器數(shù)量較多時,建立全連的鄰居關(guān)系,將造成大量的資源浪費,并且降低網(wǎng)絡(luò)的可擴(kuò)展性。 BGP存在兩個技術(shù)專門用于解決IBGP水平分割帶來的問題:1.路由反射器,2.聯(lián)邦。
啟動BGP進(jìn)程,1 指的時該路由器所在的AS號;因為一個路由只能屬于一個AS中,所以一個路由器只能啟動一個BGP進(jìn)程
配置RID,BGP要求鄰居間的RID不能相同,可以手工配置,也可以自動獲取
1 [r1-bgp]router-id 1.1.1.1 |
-
指定建鄰的IP地址和鄰居所在的AS的編號,指定鄰居IP后,如果該鄰居可達(dá),則嘗試建立TCP會話。
1 [r1-bgp]peer 12.0.0.2 as-number 2 -- #鄰居關(guān)系指定是雙向的 |
由于鄰居在收到數(shù)據(jù)包時,會檢測該包的源IP和本地指定的鄰居IP是否相同,不同則無法建鄰。所以一旦使用環(huán)回地址作為建鄰地址,同時需要修改源IP地址未本地環(huán)回地址。
1 [r1]ip route-static 2.2.2.2 32 12.1.1.2 |
因為EBGP對等體之間一般采用直連建鄰的方法,所以,EBGP對等體之間的數(shù)據(jù)包中的TTL值設(shè)置為1,這意味著R1只能與R2的g 0/0/0口通信而不能與R2的環(huán)回通信,所以使用EBGP對等體環(huán)回建鄰時需要修改數(shù)據(jù)報的TTL值。