BGP基礎知識
-
AS(自治系統),由 單一的機構或組織所管理的一系列IP網路及裝置所構成集合。 -
劃分AS的原因:1.整個地球上的 網路範圍太大,單個網路收斂很慢且網路延遲大;2.每個網路可能是某個組織或公司組建的,他們並不想將自己辛苦組建的網路交給別人管理,所以需要 自治管理 -
為了方便對自治系統進行管理,給每一個自治系統設計了一個號,即AS號。AS號由16位二進位制構成,取值範圍:0 - 65535,其中 1 - 64511號為公有AS號, 64512 - 65534被設定為私有AS號。 -
因為傳統的AS號存在不夠用的情況,所以,目前大部分裝置均支援 擴充的AS號,由32位二進位制構成。中國由於加入網際網路較晚,所以中國的AS號大多都是擴充套件AS號。
-
重發布要求AS間需要有ASBR,ASBR同時具有兩個AS的路由資訊,透過ASBR實現路由共享;而BGP是沒有ASBR的,由於AS是自治系統,如果有ASBR,那這個ASBR歸誰管理?如果只歸一方管理,那他可以透過路由策略提高自己AS的流量的轉發速度,所以BGP是AS間各出一個或多個執行BGP的路由器,讓這些執行BGP的路由器建立鄰居關係後交換路由資訊。
-
重發布在匯入路由時會洗掉開銷值,會造成選路不佳的問題,而BGP具備強大的路由策略,BGP為路由資訊設計了路徑屬性,透過屬性進行選路,是的選路過程更加靈活,可控性更高。
-
BGP協議是 無類別的 路徑向量協議。無類別即BGP在傳遞路由時會 攜帶子網掩碼;路徑向量,不同與距離向量,路徑向量 是以一個AS為單位,而距離向量是以一個路由為單位,距離向量是一種路由演算法,而 BGP不需要計算路由,它只需將以計算好的路由傳遞給了鄰居即可。 -
我們對IGP(內部閘道器協議)和EGP(外部閘道器協議)的要求不同,IGP需要在一個AS內計算路由,所以我們要求IGP選路佳、收斂快、佔用資源少;而EGP不同,EGP協議只需傳遞AS以計算好的路由,所以我們 對EGP的可控性、可靠性要求更高。 -
EGP的追求:可控性:AS之間需要傳遞大量的路由資訊,所謂可控,就是可以 更方便的干涉選路,更容易做策略,以彌補重發布的不足。為了保證路由傳遞的可控性,更方便干涉選路,BGP協議 捨棄了開銷值,取而代之的是他為路由資訊設計了很多 路徑屬性。可以透過屬性進行選路,是的選路過程更加靈活,可控性更高。 -
EGP的追求: 可靠性:BGP協議裝置間需要互動大量的路由條目,但又不能選擇週期更新來佔用鏈路資源,故只能進行觸發更新;又為了保證傳輸的可靠性,直接 選擇TCP協議作為傳輸層的協議來完成資料收發,使用的是TCP 179號埠。但使用TCP協議通訊也會造成一些問題,傳輸效率降低, 只能單播通訊(TCP需要去建立會話),佔用資源會加大 ,用TCP之後, 便不能透過廣播或者組播去自動發現鄰 居進行通訊了。 -
由於BGP依靠TCP協議傳輸資料,BGP協議可以 實現非直連建鄰,非直連建鄰的前提條件是 鄰居雙方網路可達, BGP的非直連建鄰是建立在IGP的基礎上。 -
BGP的鄰居更準確的說是 BGP的對等體,我們可以根據鄰居關係的建立情況,將BGP的鄰居關係分為兩種:
-
因為EBGP對等體之間一般採用直連建鄰的方法,所以,我們將 EBGP對等體之間的資料包中的TTL值設定為1;而IBGP對等體之間往往需要非直連建鄰,所以, IBGP對等體之間的資料包中的TTL值我們設定為255;當然,如果EBGP對等體之間需要非直連建鄰,則需要 手工修改TTL值。 -
EGP的追求::AS-BY-AS:BGP將一個AS作為一個單位來看待,以一個AS為一跳,
-
無類別路徑向量 -----距離向量的升級版—AS–BY–AS -
使用單播更新來傳送所有資訊;基於TCP 179埠工作 -
增量更新,僅觸發更新,無週期更新 -
具有豐富的屬性來取代IGP中度量進行選路,有多個引數控制協議 -
可以在進項和出項對流量實施強大的策略,可控性非常強大 -
預設不被用於負載均衡-----透過各種選路規則僅僅產生一條最佳路徑 -
BGP支援認證和聚合(將現有的IP地址合併成較大的、具有更多主機地址的路由域)
-
Open包主要用來建立鄰居關係,正常進收發一次即可,Open包會攜帶一些建鄰需要協商的引數,鄰居互相認同對方的引數才可以建立鄰居關係。以下為Open包會攜帶的一些引數: -
AS號:在手工建立鄰居關係需要時宣告鄰居的AS號。對端收到後會檢查宣告的AS號是否和本地的AS號一致,一致才可以建立鄰居關係。 -
認證:BGP在建鄰時如果做認證的話,需要比對雙方認證口令,不一致則無法建立鄰居關係。 -
Router-ID:主要區分和標定路由器。OPEN報文中攜帶RID的目的是為了確保雙方的RID不一致。確保其唯一性,如果相同,則無法正常建立鄰居關係。
|
-
holdtime:保活時間, 這個引數預設值為 180S,即180S內若收不到對方傳送的keeplive或者UPdate包則將判定BGP連結中斷。雙方建鄰時攜帶這個值,但是並不要求必須相同。但是,執行時必須相同,所以,將會選擇二者中較小的作為執行時間
-
用來保活鄰居關係,預設週期1min查詢鄰居關係是否存在;實際保活TCP會話。 -
Keeplive報文的傳送週期為保活時間(hold time)的1/3,保活時間預設為180S,則週期傳送時間預設為60S。 -
KeepLive包還有一個作用:在收到對方傳送的OPEN報文後,臨時充當確認包的作用。
TCP本身具有確認機制,可以確保傳輸的可靠性,這裡的確認主要是確認OPEN報文中攜帶的引數,如果認同對方的引數,則將回復Keeplive包進行確認。 |
-
BGP中的更新包,用來攜帶路由條目,包括目標網段,子網掩碼資訊以及BGP的各種屬性 -
在UPdate包中存在撤銷路由欄位,我們可以直接將不可達的路由資訊放在該欄位下進行通告,以達到傳遞失效資訊的目的。而不需要像RIP那樣採用帶毒傳輸的方式。
-
BGP設計的一個告警機制,出現錯誤資料時收發,當BGP檢測到一個錯誤的時候,將會用這個包進行告警,告知對端錯誤點在哪
-
用於改變路由策略後請求對等體重新傳送路由資訊,前提是對等體雙方均支援路由重新整理
-
idle狀態:空閒狀態,一旦指定鄰居,就處於idle狀態,然後BGP會首先檢查 指定的IP地址在本地路由表中是否可達,如果可達,則開始嘗試建立TCP會話,進入下一個狀態;如果不可達,則將停留在idle狀態 -
connect狀態:進行TCP會話連線的狀態。如果 TCP會話建立成功,則進入下一個狀態;如果TCP會話建立失敗,則進入Active狀態,該狀態會反覆嘗試TCP連線,如果嘗試超時,則放棄重連,退回到idle狀態。
注意:在建立TCP會話連線時,雙方都會嘗試建立連線,一方建立成功,則將建立一個雙向的TCP會話通道;雙方都建立成功,則將會出現兩個雙向通道。則需要關閉一個TCP通道。後面開始傳送OPEN報文,其中會攜帶RID,雙方將比較RID,僅保留RID大的一端發起的TCP連線,RID小的一端發起的TCP連線通道將被斷開。 |
-
OpenSent:開始傳送OPEN報文,報文中攜帶建立鄰居關係所需的引數。當收到對端傳送的OPEN報文後,並且報文裡的引數沒有問題,則將回復一個keeplive作為確認,進入下一個狀態;
-
OPENConfirm:在該狀態,本段在等待對端keeplive包, 當對端收到本端的Open報文且確認引數無誤,傳送keeplive包進行確認進入下一個狀態。 -
Established :建立完成狀態 ,標誌著 對等體關係的建立。
-
配置完成後,鄰居間單播TCP三次握手,目標埠179,建立TCP的會話;之後所有的BGP協議資料包基於該會話進行傳輸 -
會話建立後,鄰居間正常收發一次open報文,並互發keeplive包進行確認建立BGP的鄰居關係,並生成鄰居表 -
鄰居關係建立後,預設每1min,使用keeplive週期保活鄰居關係,週期保活TCP會話 -
鄰居關係建立後,管理員選擇性將本地路由表中透過任意來源獲取的路由條目,向BGP協議中進行宣告;使用updata資料包進行鄰居間路由共享;之後生成BGP表; -
本地對BGP表中的路由進行選擇,預設將最優路徑載入於路由表中(最優-僅僅基於BGP的選路規則,不一定為最佳路徑;BGP預設不支援負載均衡) -
若出現錯誤資訊,鄰居間將使用Notification報文進行報錯操作 -
收斂完成,僅keeplive週期保活即可,預設保活時間為180S,週期傳送時間為60S。 -
若發生結構突變,則將直接傳送UPdate報文進行觸發更新。
-
AS間透過EBGP對等體交換路由資訊,然後透過單播將獲取到的路由資訊傳送給IBGP對等體,使AS所有執行BGP的裝置擁有了所有AS的路由資訊,如下:R3從R1學到AS100的1.0.0.0/8的路由資訊,然後透過單播傳給R7,R7傳給R2,所有AS內執行BGP的路由器都學到了1.0.0.0/8的路由資訊
-
向量協議的特點是誰發給我這條路由,我到這條路由就找誰,如果R7想ping1.0.0.0/8,那R7就會將ping包傳送給R3,由R3轉發。在R7傳送ping包時,它首先檢視路由表查詢R3的位置,假設R7透過R4找R3,那R7就會將ping包發給R4,當這個ping包來到R4上,R4看二層是找自己的,解封裝看三層,發現這個ping包的DIP為1.0.0.0/8網段的,但R4上沒有執行BGP,沒有收到關於1.0.0.0/8網段的路由資訊,所以R4就會把這個ping包丟棄,雖然R7上有1.0.0.0/8的網段路由資訊,但無法與R1通訊,這就是BGP的路由黑洞。 -
BGP的路由黑洞:由於BGP協議可以 非直連建鄰,故可能出現BGP協議跨越未執行BGP協議的路由器,導致BGP路由傳遞後,顯示 控制層面可達,但是,資料層面 ,流量經過未執行BGP協議的路由器時,無法透過,形成路由黑洞。
-
AS內執行BGP的裝置將從BGP重發布到AS內執行的IGP協議裡:透過重發布將BGP所有路由匯入到IGP協議裡,同樣需要AS內所有裝置可以承載所有AS的路由資訊,同第一條一樣不現實。 -
物理、邏輯拓撲全連:直接讓AS內執行BGP協議的所有裝置互相連線,使IBGP間通訊不需要經過未執行BGP協議的裝置,但由一個AS地理範圍可能很大,IBGP間距離較遠,所以使用真實鏈路連線IBGP也不現實,所以我們可以用GRE/MGRE等vpn技術,透過虛擬鏈路連線IBGP對等體
-
MPLS:當前工程中主要使用的解決BGP路由黑洞方案,MPLS後續會講。
|
注意:在目前我們的學習情況下,我們在做BGP實驗時都是用第一種方法解決路由黑洞 |
-
下圖中有三個AS,其中AS:1的一條路由資訊傳給了AS:2,AS:2將這條路由資訊傳給AS:3,如果AS:3又將這條路由資訊傳回給AS:1且AS:1將這條路由資訊加表,就會導致路由環路。
-
BGP協議在路由條目中有一條專門記錄所經過的AS編號的路徑屬性,在上圖中AS:1發出的路由資訊會攜帶編號1,AS:2將這條路由資訊轉發給R3時,新增編號2;AS:3將這條路由資訊轉發給AS:1時,也會新增編號3;最終AS:1收到這條路由資訊的AS_PATH屬性記錄了1、2、3,R1發現該屬性中有自己的編號則拒絕接受這條路由資訊,避免環路產出。
-
下圖在AS:64513內,R2、R3、R4兩兩建鄰,如果R2釋出一條路由資訊由R4到R3,再到R2,並且R3轉發給R2的路由資訊改變了R2的路由表,則會形成環路。
-
因為BGP的AS-BY-AS的特性,導致AS內部被認為是一個整體,在預設情況下,路由的屬性是不會發生變化的,所以,無法透過屬性來進行防環。 -
IBGP水平分割:當一個路由器從一個IBGP對等體出學習到某一條BGP路由時,他將不再把這條路由資訊通告給其他的IBGP對等體。
-
IBGP水平分割可以有效的解決 IBGP對等體之間路由回傳造成的環路問題,但是,也會 引發路由資訊傳遞障礙問題。如下圖中,如果R1學到其他AS的路由資訊,它會將這些路由資訊傳遞給R2,但由於IBGP水平分割,R2不能將這些路由資訊傳遞給R3,R3就無法獲取R1收集到的路由資訊。
-
想要避免IBGP水平分割帶來的問題,可以讓所有AS內部執行BGP的路由器均建立IBGP對等體關係, 這種建立全連的IBGP對等體的方案並不是最佳解決方案,因為,當一個AS內執行BGP協議的路由器數量較多時,建立全連的鄰居關係,將造成大量的資源浪費,並且降低網路的可擴充套件性。 -
BGP存在兩個技術專門用於解決IBGP水平分割帶來的問題:1.路由反射器,2.聯邦。
-
啟動BGP程式,1 指的時該路由器所在的AS號;因為一個路由只能屬於一個AS中,所以一個路由器只能啟動一個BGP程式
|
-
配置RID,BGP要求鄰居間的RID不能相同,可以手工配置,也可以自動獲取
1 [r1-bgp]router-id 1.1.1.1 |
-
指定建鄰的IP地址和鄰居所在的AS的編號,指定鄰居IP後,如果該鄰居可達,則嘗試建立TCP會話。
1 [r1-bgp]peer 12.0.0.2 as-number 2 -- #鄰居關係指定是雙向的 |
|
-
由於鄰居在收到資料包時,會檢測該包的源IP和本地指定的鄰居IP是否相同,不同則無法建鄰。所以一旦使用環回地址作為建鄰地址,同時需要修改源IP地址未本地環回地址。
1 [r1]ip route-static 2.2.2.2 32 12.1.1.2 |
-
因為EBGP對等體之間一般採用直連建鄰的方法,所以,EBGP對等體之間的資料包中的TTL值設定為1,這意味著R1只能與R2的g 0/0/0口通訊而不能與R2的環回通訊,所以使用EBGP對等體環回建鄰時需要修改資料包的TTL值。
|
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70012489/viewspace-2934157/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 學習網路BGP必備基礎知識
- 基礎知識
- Envoy基礎知識
- DockerFile基礎知識Docker
- Webpack 基礎知識Web
- js基礎知識JS
- React基礎知識React
- 程式基礎知識
- Docker基礎知識Docker
- qml基礎知識
- Mybatis基礎知識MyBatis
- python基礎知識Python
- Hadoop基礎知識Hadoop
- webpack基礎知識Web
- AI 基礎知識AI
- JSP基礎知識JS
- Dart基礎知識Dart
- RabbitMQ基礎知識MQ
- Android基礎知識Android
- 1、基礎知識
- 前端基礎知識前端
- Camera基礎知識
- Kafka 基礎知識Kafka
- Vue基礎知識Vue
- java基礎知識Java
- linux基礎知識Linux
- PRML 基礎知識
- SpringCloud 基礎知識SpringGCCloud
- javascript基礎知識JavaScript
- python 基礎知識Python
- Laravel基礎知識Laravel
- Redis基礎知識Redis
- CSS基礎知識CSS
- ThinkPHP基礎知識PHP
- PHP基礎知識PHP
- Nginx基礎知識Nginx
- CSS 基礎知識 初識CSS
- LUA的基礎知識