OSPF Adjacency building. ExStart. Exchange.

Малък пример за OSPF adjacency building и по-специално за Database Description процеса.

Имаме серийна PPP връзка м/у два рутера – R5 и R1. Току-що сме задали hello интервал на PPP интерфейс(serial 0/1) м/у R1(Router ID: 1.1.1.254) и R5(Router ID: 1.1.1.5) на 5 секунди, което е различно от стойността по подразбиране от 10 секунди, която е настроена на R5. След изтичането на dead-интервала (4х hello, автоматично изчислен) на R1, за което време той не е получил съответстващ hello пакет от R5, R1 дропва neighbor-отношението. Използваната команда за показване на тези отношения е:

R1#debug ip ospf adj

Ето и дропването на neighbora, с log съобщение за dead timer expired на R1:

R1#
1d16h: OSPF: 1.1.1.5 address 192.168.15.2 on Serial0/1 is dead
1d16h: OSPF: 1.1.1.5 address 192.168.15.2 on Serial0/1 is dead, state DOWN
1d16h: %OSPF-5-ADJCHG: Process 1, Nbr 1.1.1.5 on Serial0/1 from FULL to DOWN, Neighbor Down: Dead timer expired
R1#

Преглед на съседите за ospf process id 1:

R1#sh ip ospf neighb

Neighbor ID Pri State Dead Time Address Interface
1.1.1.3 1 FULL/BDR
00:00:31 192.168.101.254 FastEthernet0/0.101
1.1.1.3 1 FULL/BDR
00:00:31 192.168.102.254 FastEthernet0/0.102
1.1.1.3 1 FULL/ –
00:01:50 192.168.123.3 Serial0/0
1.1.1.5 1 FULL/ –
00:01:55 192.168.123.5 Serial0/0
1.1.1.4 1 FULL/ –
00:01:49 192.168.123.4 Serial0/0
R1#

Което потвърждава, че 1.1.1.5 е flush-нат от neighbor-таблицата, за интерфейс Serial0/1 и вече не се разпознава като ospf neighbor за този интерфейс.. (Заб: в използваната топология, имаме още един директен L3 линк към 1.1.1.5 през S0/0, който е свързан през Frame Relay облак към 1.1.1.5 с ip address 192.168.123.5) В такава ситуация, автомата на съседските отношения не може да премине в състояние Two-Way, единственото което се случва с него са преходи от Down->Init при всеки получен hello пакет от 1.1.1.5 през интерфейс S0/1.

След като сме установили пропадането на neighbor отношението, можем да вдигнем отново hello-интервала на стойността по подразбиране, за да оставим neighbor-отношението да се формира отново.

R1#conf t
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)#int s0/1
R1(config-if)#ip ospf hello-interval 10
R1(config-if)#^Z
R1#

При следващият hellо, neighbor-отношението се инициализира така:

R1#
1d16h: OSPF: Rcv DBD from 1.1.1.5 on Serial0/1 seq 0x11F6 opt 0x52 flag 0x7 len 32 mtu 1500 state INIT
1d16h: OSPF: 2 Way Communication to 1.1.1.5 on Serial0/1, state 2WAY
1d16h: OSPF: Send DBD to 1.1.1.5 on Serial0/1 seq 0x1793 opt 0x42 flag 0x7 len 32
1d16h: OSPF: First DBD and we are not SLAVE
1d16h: OSPF: Rcv DBD from 1.1.1.5 on Serial0/1 seq 0x1793 opt 0x52 flag 0x2 len 192 mtu 1500 state EXSTART
1d16h: OSPF: NBR Negotiation Done. We are the MASTER
1d16h: OSPF: Send DBD to 1.1.1.5 on Serial0/1 seq 0x1794 opt 0x42 flag 0x3 len 192
1d16h: OSPF: Rcv DBD from 1.1.1.5 on Serial0/1 seq 0x1794 opt 0x52 flag 0x0 len 32 mtu 1500 state EXCHANGE
1d16h: OSPF: Send DBD to 1.1.1.5 on Serial0/1 seq 0x1795 opt 0x42 flag 0x1 len 32
1d16h: OSPF: Rcv DBD from 1.1.1.5 on Serial0/1 seq 0x1795 opt 0x52 flag 0x0 len 32 mtu 1500 state EXCHANGE
1d16h: OSPF: Exchange Done with 1.1.1.5 on Serial0/1
1d16h: OSPF: Synchronized with 1.1.1.5 on Serial0/1, state FULL
1d16h: %OSPF-5-ADJCHG: Process 1, Nbr 1.1.1.5 on Serial0/1 from LOADING to FULL, Loading Done
1d16h: OSPF: Build router LSA for area 0, router ID 1.1.1.254, seq 0x80000052
R1#

Кратко пояснение на формата на Database Description (DBD) пакетите:

8 бита

8 бита

16 бита

Version

Type

Packet Length

Router ID

Area ID

Checksum

AuthType

AuthInform

AuthInform

IntfcMTU

Options

0 0 0 0 0 I M MS

SequenceNm

LSAHeaders

Полетата в заглавната част се използват както следва:

  • Version – Версия на OSPF протокола, която е формирала този DBD пакет.
  • Type – тип на OSPF пакета. За DBD пакет това е type=2, или 0x02 в hex-запис.
  • Packet Length – Обща дължина на пакета, в брой 32-битови думи.
  • RouterID – ID номера на ospf процеса на изпращащия рутер.
  • Area ID – номера на area-та, в която се намира ospf интерфейса на изпращащия рутер.
  • Checksum – стандартна IP контролна сума (в самият LSA Header за контролна сума се използва контролна сума на Флечър, RFC1146, RFC905), изчислена върху целия пакет, вкл. заглавната част.
  • AuthType – вид на автентикацията за областта, в която се намира изпращащият интерфейс на изпращащият рутер.

Възможните видове автентикация са:

  • 0x0000 – Липса на автентикация, => полето AuthInform не се чете и може да съдържа каквото и да било;
  • 0x0001 – Cleartext автентикация => полето AuthInform съдържа парола в некриптиран текст, до 64 бита големина;
  • 0x0002 – MD5 Автентикация => полето AuthInform има вида (всеки ред е една 32-битова дума):

0x0000

KeyID

AuthDataLength

CryptographicSequenceNumber

където полетата са следните:

· 0x0000 – padding zeros 😉

· KeyId – конфигурираният key-id на изпращащия интерфейс на изпращащият рутер. Трябва да е същия на получаващият рутер за да работи механизма на автентикация успешно. AuthDataLength – дължина на Authentication Data информацията, т.е. на самият message-digest хеш.

· CryptographicSequenceNumber – ненамаляващ Sequence Number. Големината на полето е 32 бита => максималната му стойност е 0xFFFFFFFF или 2^32=4294967296
Заб: самият message-digest хеш се добавя след края на OSPF пакета, и не е част от хедъра.

· IntfcMTU – Maximum Transmission Unit на изпращащия рутер.

Полето Options съдържа флагове, показващи опционални възможности на изпращащия рутер и има следния вид:

*

*

DC

EA

N/P

MC

E

T

като всеки от флаговете е по 1 бит, и има следната функционалност:

· * – неспецифициран бит. В нашият случай, единия neighbor задава тези два бита като 01, а в отговора си другият рутер връща 01;

· DC – Demand Circuit – показва дали изпращащият рутер поддържа OSPF over Demand Circuits;

· EA – Показва дали изпращащият рутер поддържа External Attributes LSA;

· N/P – този флаг указва поддръжката на NSSA области:

· N – задава се в hello пакети, когато изпращащият рутер поддържа NSSA External LSA (type 7). Ako флага N е вдигнат, E трябва да е свален, защото може един рутер, който е част от NSSA да поддържа и AS External LSA(type 5) пакети.

· P – задава се в NSSA External LSA (type 7) пакети, които трябва да бъдат изпратени като AS External LSA(type 5) към останалите области от NSSA ABR рутерите. Двата флага заемат едно и също място в Options полето, защото единия (N) се използва в hello, а другият (P) се използва в LSA пакети (и де факто заема мястото на N).

· MC – показва дали изпращащият рутер поддържа multicasts (Multicast OSPF)

· E – в hello пакетите показва дали изпращащият рутер поддържа AS External LSA (type5), също така е вдигнат и във всички LSA, които произлизат от non-stub области. Флагът е свален в hello пакетите на stub, totally stubbby, и NSSA рутери, осве това директно свързани рутери с различни E-флагове не могат да станат adjacent, => можем да заключим че всички рутери в една област трябва да поддържат еднакво AS External LSA, за да станат adjacent помежду си. Същото важи и за Stub, Totally stubby и NSSA областите.
T – Показва дали изпращащият рутер поддържа Type Of Service.

Следващото поле е изписано като “flags” в debug-output-а по-горе. То е характерно за DBD пакетите и има такъв формат:

  • 0000 – padding zeros 😉 след котйто следват флаговете:
  • I – Initial – показва дали този DBD пакет е е първият за изпращащия рутер в текущия DBD обмен.
  • M – More – показва дали този DBD пакет е последният за изпращащия рутер в текущия обмен. Ако флага е вдигнат, това показва че този DBD пакет не е последен.
  • MS – Master/Slave – показва дали изпращащият рутер е master в текущия обмен. Както се вижда от debug output-а по-горе, този флаг винаги е вдигнат в първите DBD пакети, които се обменят (ExStart състояние на автомата на neighbor отношението).

Да вземем първия получен DBD пакет от R5:

1d16h: OSPF: Rcv DBD from 1.1.1.5 on Serial0/1 seq 0x11F6 opt 0x52 flag 0x7 len 32 mtu 1500 state INIT

Попълнен с OSPF информацията от конкретната ситуация, използвайки първия debug-нат пакет от 1.1.1.5, пакета би изглеждал така:

|0x02|0x02|0x0020|
|0x01010105|
|0x00000000|
|Chcksum|0x0000|
|0x00000000|
|0x00000000|
|0x05DC|0x0000|
01010010|0000|111|
|0x11F6|
|LSA Headers|

С човешки думи ;), пакетът казва, че рутер 1.1.1.5 поддържа External Attriibutes LSA, поддържа AS External LSA, това е първият (Initial) DBD който изпраща, последван от други (More) и текущият рутер се смята за Master в текущия DBD обмен. Заб: вижда се, че neighbor-автомата на 1.1.1.5 е състояние INIT, а след изпращането на този пакет е влязъл в състояние ExSTART, за договаряне на Master-Slave отношенията за DBD обмена. На този DBD пакет, R1 отговаря със следния DBD пакет (който освен всичко друго ще покаже на link neighbor-a, че R1 същто вече е в EXSTART):

|0x02|0x02|0x0020|
|0x010101FE|
|0x00000000|
|Chcksum|0x0000|
|0x00000000|
|0x00000000|
|0x05DC|0x0000|01000010|0000|111|
|0x1793|
|LSA Headers|

R1 изпраща собствен DBD пакет, като включва собственото си Router ID 1.1.1.254, или 0x010101FE. Интересното в случая са опциите:
първите два (unused по спецификация) бита, са инвертираната стойност (10) на съответните битове от опциите на R1 (01). В RFC 2328 е указано, че устройство което получава пакети със сетнати unused-битове, трябва да ги резетва на нули, но тук явно не е така, което не съм убеден дали не е начин за означаване посоката на даден пакет към определен рутер в процеса на DBD обмен, иlи пък нещо друго ;). Освен това виждаме, че R1 не е означил поддържка за External Attributes LSA, което обаче не е причина за разпадане на adjacencyто. R1, също както и R5 (и двата са в една област – backbone 0) показва поддръжка за AS External LSA (type 5), което е нормално. R1 от своя страна също вдига и трите флага (I-Initial, M-More, MS-Master), заа да покаже че това също е неговият начален DBD пакет, след него има още, и той трябва да стане master за DBD сесията на този линк. R1 всъщност има пълното право 😉 да се обозначи като Master, защото неговото Router ID (1.1.1.254) е по-голямо от RouterID-то на линк-съседа(1.1.1.5). Оттук нататък, R5 трябва да приеме R1 за Master, от което следват две неща:
1. R5 няма да праща повече DBD пакети с вдигнат MS флаг;
2. R5 ще използва контекста за номериране на R1, т.е. DBD пакетите, които той праща ще бъдат номерирани с номерата на R1.
Debug съобщението “OSPF: First DBD and we are not SLAVE” на R1 показва това още един път.

1d16h: OSPF: Send DBD to 1.1.1.5 on Serial0/1 seq 0x1793 opt 0x42 flag 0x7 len 32
1d16h: OSPF: First DBD and we are not SLAVE

Можем да видим отговора на R5 в следващия получен DBD пакет (R5 е в състояние EXSTART):

1d16h: OSPF: Rcv DBD from 1.1.1.5 on Serial0/1 seq 0x1793 opt 0x52 flag 0x2 len 192 mtu 1500 state EXSTART

|0x02|0x02|0x00C0|
|0x01010105|
|0x00000000|
|Chcksum|0x0000|
|0x00000000|
|0x00000000|
|0x05DC|0x0000|
01010010|0000|010|
|0x1793|
|LSA Headers|

DBD пакета е много подобен на предишния изпратен от R5, със следните разлики:

  • дължина на пакета е различна(0x00C0), заради съдържаните LSA хедъри;
  • Флаговете Init(това вече е втори DBD пакет от R5, не е Initial) и MS(1.1.1.5 не е Master в текущия DBD обмен) вече са свалени, и флаговетв са 010, или 0x02.
  • Очевидно R5 евче е разбрал от DBD пакета на R1, че той(R5) не е Master в текущия DBD обмен,затова е свалил MS флага в собствените си DBD пакети. Освен това, както се вижда от полето SequenceNm (0x1793, или същото като SequenceNm на R1), R5 номерира своите DBD пакети в контекста на R1, като дори използва същия номер, като изпратения от R1, с което де факто прави и DBD Acknowledgement, потвърждавайки успешното получаване на DBD пакета на R1.

След получаването на такъв DBD пакет линк-съседа, R1 вече е сигурен, че е приет за master от отсрещната страна на линка, което се потвърждава от съобщението:

1d16h: OSPF: NBR Negotiation Done. We are the MASTER

Оттук нататък, R1 може да продължи с описанието на собствената си Link-State база данни, и да получава обратно потвържденията на R5, съдържащи собствената му LSDB.

1d16h: OSPF: Send DBD to 1.1.1.5 on Serial0/1 seq 0x1794 opt 0x42 flag 0x3 len 192

|0x02|0x02|0x00C0|
|0x010101FE|
|0x00000000|
|Chcksum|0x0000|
|0x00000000|
|0x00000000|
|0x05DC|0x0000|01000010|0000|011|
|0x1794|
|LSA Headers|

SequenceNm от 0x1794 показва, че това е следващият DBD пакет от номерацията на Master-рутера, Initial флага е свален, вдигнат е флага More, и флага MS, за Master. Следва потвърждение R5, което показва, че от предишния пакет и той вече е в съсояние Exchange:

1d16h: OSPF: Rcv DBD from 1.1.1.5 on Serial0/1 seq 0x1794 opt 0x52 flag 0x0 len 32 mtu 1500 state EXCHANGE

|0x02|0x02|0x0020|
|0x01010105|
|0x00000000|
|Chcksum|0x0000|
|0x00000000|
|0x00000000|
|0x05DC|0x0000|
01010010|0000|000|
|0x1794|
|LSA Headers|

Флаговете са вече 000, което значи, че този DBD пакет е последният от R5. R1 праща обратно следният DBD пакет:

1d16h: OSPF: Send DBD to 1.1.1.5 on Serial0/1 seq 0x1795 opt 0x42 flag 0x1 len 32

|0x02|0x02|0x0020|
|0x010101FE|
|0x00000000|
|Chcksum|0x0000|
|0x00000000|
|0x00000000|
|0x05DC|0x0000|01000010|0000|001|
|0x1795|
|LSA Headers|

От който се вижда, че това е последният пакет и от неговият Database Description процес. Следва потвърждение от R5:

1d16h: OSPF: Rcv DBD from 1.1.1.5 on Serial0/1 seq 0x1795 opt 0x52 flag 0x0 len 32 mtu 1500 state EXCHANGE

|0x02|0x02|0x0020|
|0x01010105|
|0x00000000|
|Chcksum|0x0000|
|0x00000000|
|0x00000000|
|0x05DC|0x0000|01010010|0000|000|
|0x1795|
|LSA Headers|

С това процеса на DBD обмен трябва да приключи, всеки от рутерите да влезе в състояние на LOADING или FULL:

1d16h: OSPF: Exchange Done with 1.1.1.5 on Serial0/1
1d16h: OSPF: Synchronized with 1.1.1.5 on Serial0/1, state FULL

Следва нормалното Syslog съобщение за вдигнат съсед:

1d16h: %OSPF-5-ADJCHG: Process 1, Nbr 1.1.1.5 on Serial0/1 from LOADING to FULL, Loading Done

Както и изпращане на Router LSA за област area 0:

1d16h: OSPF: Build router LSA for area 0, router ID 1.1.1.254, seq 0x80000052
R1#

С което процесът приключва.

Tagged , , , , , , . Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *