Care este semnificația de a avea două stări diferite în FSM atunci când ambele încearcă să stabilească conexiunea TCP?
Răspuns
Colegii BGP încep în Inactiv stare. În starea de repaus, colegii au fost configurați pentru a forma o adiacență unul cu celălalt, dar nu au inițiat sau primit încă nicio comunicare.
BGP folosește TCP ca transport. Deci, pentru a exista o Adiacența BGP, primul pas este de a stabili o conexiune TCP. În timp ce ambii colegi sunt în starea IDLE, fiecare va încerca periodic să inițieze o conexiune TCP la intervale independente (în funcție de momentul în care configurația de peering BGP a fost finalizată efectiv).
Când un peer inițiază strângerea de mână în trei direcții TCP cu un SYN, acel tranziție peer în Activ . Această stare indică faptul că routerul local activ încearcă să inițieze o conexiune TCP.
Când celălalt peer primește TCP SYN din colegul său, va trece în starea Connect . Această stare indică faptul că routerul local a primit o inițiere TCP de la celălalt router și este / a răspuns cu un SYN ACK.
De acolo, ambii colegi continuă prin restul stărilor: Open Sent, Open Confirmed, Stabilit.
Pentru a rezuma:
- Activ stat – local routerul tocmai a trimis un TCP SYN
- Conectare stat – router local tocmai a primit un TCP SYN de la colegul său
Tranzițiile stării „inițiatorului„ difuzorului BGP ”pentru a forma adiacența vor fi: Idle
, Active
, Open Sent
, Open Received
, Established
Tranzițiile de stare ale „difuzorului BGP” care răspund pentru a forma adiacența vor fi: Idle
, Connect
, Open Sent
, Open Received
, Established
Observați, doar peer-ul care a inițiat strângerea de mână TCP trece prin starea Active
. Și numai peer-ul care NU a inițiat strângerea de mână TCP trece prin starea Connect
.
Adăugarea unor depanări care dovedesc comportamentul. Acesta este codul routerului Cisco Versiunea 15.4 (1) T.
Acesta provine dintr-o sesiune de peering BGP între R1 (9.9.12.1) și R2 (9.9.12.2).
R2 este inițiatorul pentru această sesiune TCP:
router1# show ip bgp neighbors | i ^BGP|host BGP neighbor is 9.9.12.2, remote AS 2323, external link Local host: 9.9.12.1, Local port: 179 Foreign host: 9.9.12.2, Foreign port: 43876
Confirmat pe celălalt router:
router2# show ip bgp neighbors | i ^BGP|host BGP neighbor is 9.9.12.1, remote AS 1111, external link Local host: 9.9.12.2, Local port: 43876 Foreign host: 9.9.12.1, Foreign port: 179
Acesta este depanarea (filtrată) pe R2, inițiatorul:
$ cat BGP-Peering_Initiator.txt | grep -e "TCP src" -e "went from" *Oct 28 17:06:36.971: BGP: 9.9.12.1 active went from Idle to Active *Oct 28 17:06:36.972: TCP src=43876, dst=179, seq=1526684246, ack=0, win=16384 SYN *Oct 28 17:06:36.975: TCP src=179, dst=43876, seq=2072809595, ack=1526684247, win=16384 ACK SYN *Oct 28 17:06:36.975: TCP src=43876, dst=179, seq=1526684247, ack=2072809596, win=16384 ACK *Oct 28 17:06:36.977: BGP: 9.9.12.1 active went from Active to OpenSent *Oct 28 17:06:36.982: TCP src=43876, dst=179, seq=1526684247, ack=2072809596, win=16384 ACK PSH *Oct 28 17:06:36.985: TCP src=179, dst=43876, seq=2072809596, ack=1526684304, win=16327 ACK *Oct 28 17:06:36.985: TCP src=179, dst=43876, seq=2072809596, ack=1526684304, win=16327 ACK PSH *Oct 28 17:06:36.985: BGP: 9.9.12.1 active went from OpenSent to OpenConfirm *Oct 28 17:06:36.985: TCP src=43876, dst=179, seq=1526684304, ack=2072809653, win=16327 ACK PSH *Oct 28 17:06:36.987: TCP src=179, dst=43876, seq=2072809653, ack=1526684304, win=16327 ACK PSH *Oct 28 17:06:36.987: BGP: 9.9.12.1 active went from OpenConfirm to Established
Și aceasta este depanarea (filtrată) de pe R1, răspunsul:
$ cat BGP-Peering_Responder.txt | grep -e "TCP src" -e "went from" *Oct 28 17:06:36.973: TCP src=43876, dst=179, seq=1526684246, ack=0, win=16384 SYN *Oct 28 17:06:36.974: TCP src=179, dst=43876, seq=2072809595, ack=1526684247, win=16384 ACK SYN *Oct 28 17:06:36.976: TCP src=43876, dst=179, seq=1526684247, ack=2072809596, win=16384 ACK *Oct 28 17:06:36.976: BGP: 9.9.12.2 passive went from Idle to Connect *Oct 28 17:06:36.983: TCP src=43876, dst=179, seq=1526684247, ack=2072809596, win=16384 ACK PSH *Oct 28 17:06:36.984: TCP src=179, dst=43876, seq=2072809596, ack=1526684304, win=16327 ACK *Oct 28 17:06:36.984: BGP: 9.9.12.2 passive went from Connect to OpenSent *Oct 28 17:06:36.984: BGP: 9.9.12.2 passive went from OpenSent to OpenConfirm *Oct 28 17:06:36.985: TCP src=179, dst=43876, seq=2072809596, ack=1526684304, win=16327 ACK PSH *Oct 28 17:06:36.986: TCP src=179, dst=43876, seq=2072809653, ack=1526684304, win=16327 ACK PSH *Oct 28 17:06:36.986: TCP src=43876, dst=179, seq=1526684304, ack=2072809653, win=16327 ACK PSH *Oct 28 17:06:36.986: BGP: 9.9.12.2 passive went from OpenConfirm to Established
Comentarii
- De fapt, aveți stările Active și Connect înapoi. De exemplu, RFC spune acest lucru despre starea activă: " Starea activă: În această stare, BGP FSM încearcă să dobândească un peer ascultând și acceptarea unei conexiuni TCP. " De asemenea, " Stare conectare: În această stare, BGP FSM așteaptă finalizarea conexiunii TCP. " După ce a trimis TCP SYN.
- Bună @RonMaupin. Nu ' cred că o fac. Am devenit curios după ce l-am scris și l-am testat și confirmă stările Active / Connect funcționează așa cum le-am descris. ' voi încerca să pun laolaltă " " ieșire de depanare și să o adaug la răspuns.
- @RonMaupin Tocmai a adăugat depanările, vezi mai sus. De asemenea, eu ' sunt mult mai preocupat de ceea ce face Cisco decât de ceea ce spune Cisco . Simțiți-vă liber să-mi spuneți dacă vedeți / bănuiți că ' interpretez erorile în mod incorect.
- Privind, singurul lucru pe care îl văd este că răspunsul a mers de la Repaus la Conectare după conexiunea TCP finalizată. În răspunsul meu am spus că a fost după ce am trimis SYN / ACK. Se pare că de fapt trece după ce a primit ACK final.
- Aș interpreta linia " 28 oct. 17: 06: 36.971: BGP: 9.9.12.1 activ de la Idle la Active " întrucât R1 merge de la Idle la Active. Deoarece R2 inițiază sesiunea TCP, acest lucru ar confirma vizualizarea @RonMaupins.
Răspuns
TCP creează o conexiune între doi colegi, iar BGP utilizează TCP. Un peer TCP va încerca să se conecteze la celălalt peer TCP și acesta este starea connect
.Un partener poate asculta o conexiune (mai ales după o încercare eșuată de conectare din partea sa) și acesta este starea active
.
BGP are mai multe stări și fiecare este clar documentat în RFC 4271, A Border Gateway Protocol 4 (BGP-4) . Descrierile stărilor și trecerea de la una la alta (și / sau înapoi) sunt într-adevăr prea mari pentru a fi discutate aici. Mai jos este o imagine care descrie BGP Finite State Machine (FSM):
RFC are o descriere completă a diferitelor stări ale FSM și a ceea ce se întâmplă în fiecare etapă .
Începând cu starea de repaus, când are loc un eveniment ManualStart sau AutomaticStart, acesta își schimbă starea în Connect, dar versiunile pasive ale acelor evenimente (ManualStart_with_PassiveTcpEstablishment sau AutomaticStart_with_PassiveTcpEstablishment) se întâmplă, apoi își schimbă starea în Active. Practic, atunci când i se spune să se conecteze la un peer, acesta se schimbă în Connect, dar când i se spune să asculte un peer, se schimbă în Active.
Când se află în starea Connect, dacă conexiunea TCP eșuează, își schimbă starea în Active pentru a asculta o conexiune de peer.
Când se află în starea Active și se întâmplă evenimentul ConnectRetryTimer_Expires, atunci încearcă conexiunea TCP și intră în starea Connect.
Într-adevăr este mult mai mult decât atât, dar este mult prea mare pentru un site ca acesta.