OSPF邻居建立过程及报文详解
R1配置如下:
router ospf 1
router-id 1.1.1.1
network 2.2.2.2 0.0.0.0 area 0
network 192.168.1.0 0.0.0.3 area 0
R2配置如下:
router ospf 1
router-id 10.10.10.10
network 10.10.10.10 0.0.0.0 area 0 //在相应网段的接口上开启OSPF,属于区域0
network 192.168.1.0 0.0.0.3 area 0
OSPF邻接已经建立成功,下面我们就来分析下整个邻接建立过程:
首先来总结一下OSPF邻接各个阶段:
1.down state:路由器还末收到邻居发来的HELLO包
2.init state:路由器收到邻居发来的HELLO包,但在邻居阶段中看不到自己的ROUTER-ID
3.two-way state:路由器在收到邻居发来的HEELO包中,能够看到自己的ROUTER-ID,就进入该状态(需要选举DR和BDR的在这阶段选举)
4.exstart state:在选举DR和BDR之后,开始选主从(ROUTER-ID大的为主,作用为了同步DBD的序列号)
5.exchange state:主从协商完成后,进行DBD的同步
6.loading state:DBD同步完成后,进行LSA的同步
7.full state:LSA同步完成之后
在NBMA还有个attempt(尝试状态):为NBMA网络中的一个正常过滤状态,即我发送了HELLO等待对方的回应,如果对方不回应则一直滞留在此状态。
现在我们来分析一下每个报文的作用:
1.R1的接口上启用了OSPF后,会向外组播发送OSPF的HELLO报文。SIP=192.168.1.1 DIP:224.0.0.5 TTL=1 (有DR和BDR网络中,DR和BDR路由器向外送LSA的目标地址为224.0.0.5,DRother路由器向DR和BDR发送LSA的目标地址为224.0.0.6)
OSPF的头部格式
Version:OSPF的版本号,对于OSPFv2来说,其值为2,IPV6为3。
Message Type:OSPF报文的类型。数值从1到5,分别对应Hello报文、DD报文、LSR报文、LSU报文和LSAck报文。
Packet length:OSPF报文的总长度,包括报文头在内,单位为字节。
Router ID:始发该LSA的路由器的ID。(优先采用手工指定,没有则looopback最大的,再接口IP最大的,必须得有)
Area ID:始发LSA的路由器所在的区域ID。
Checksum:对整个报文的校验和。
AuType:验证类型。可分为不验证、简单(明文)口令验证和MD5验证,其值分别为0、1、2。
Authentication:其数值根据验证类型而定。当验证类型为0时未作定义,为1时此字段为密码信息,类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息。
说明:MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。
HELLO报文格式:
Network Mask:发送Hello报文的接口所在网络的掩码
HelloInterval:发送Hello报文的时间间隔。
Router-id Pri:路由器优先级。如果设置为0,则该路由器接口不能成为DR/BDR(0-255)。
RouterDeadInterval:失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。
Designated Router:指定路由器的接口的IP地址。
Backup Designated Router:备份指定路由器的接口的IP地址。
Neighbor:邻居路由器的Router ID。(上图中还没有形成邻居所以没有)
2.R2的接口上启用了OSPF后,会向外组播发送OSPF的HELLO报文。SIP=192.168.1.2 DIP:224.0.0.5 TTL=1 (有DR和BDR网络中,DR和BDR路由器向外送LSA的目标地址为224.0.0.5,DRother路由器向DR和BDR发送LSA的目标地址为224.0.0.6)
格式同上!
3.R1收到对方发来的HELLO包,并在邻居字段中能看到自己的ROUTER-ID,进入TWO-WAY状态。
active neighbor字段中为R1的ROUTER-ID 1.1.1.1 ,进入TWO-WAY状态
4.R2收到对方发来的HELLO包,并在邻居字段中能看到自己的ROUTER-ID,进入TWO-WAY状态。
active neighbor字段中为R1的ROUTER-ID 10.10.10.10 ,进入TWO-WAY状态
需要选举DR和BDR的在这个阶段中开始选举,接口优先级高的优先成为DR或BDR,优先级相等时,ROUTER-ID大的为DR或BDR,其它的路由器为DRother。
5.在选举DR和BDR(或不需要选举DR和BDR)后,进入exstart state,开始选主从(ROUTER-ID大的为主,作用为了同步DBD的序列号)R1和R2分别向外发DBD报文,都认为自己为主,其中的I、M、MS位分别置1,I表示为第一个包,M表示后面还有更多包,MS表示为主
DBD报文的格式:
包括OSPF的首部信息+DBD信息 OSPF首部格式看前面有介绍,这里不说了
Interface MTU:在不分片的情况下,此接口最大可发出的IP报文长度为1500。
options:可选项(见下面)
I(Initial):当发送连续多个DD报文时,如果这是第一个DD报文,则置为1,否则置为0。
M(More):当连续发送多个DD报文时,如果这是最后一个DD报文,则置为0。否则置为1,表示后面还有其他的DD报文。
MS(Master/Slave):当两台OSPF路由器交换DD报文时,首先需要确定双方的主(Master)从(Slave)关系,Router ID大的一方会成为Master。当值为1时表示发送方为Master。
DD Sequence Number:DD报文序列号,由Master方规定起始序列号,每发送一个DD报文序列号加1,Slave方使用Master的序列号作为确认。主从双方利用序列号来保证DD报文传输的可靠性和完整性。
OSPF的可选项,但功能都是一样的,下面讲一下各个可选项的作用:
DN:用于基MPLS的×××
O:表明始发路由器是支持Opaque LSA(类型9、10和11)
DC:当始发路由器支持按需电路上的OSPF能力时,该位被设置
L:包含链路本地信念
N/P:只用在Hello包中N=1说明支持NSSA 外部LSA,N=0,那么路由器不发送和接收NSSA外部LSA  P只用在NSSA中头部 通知ABR把7类LSA转化成5类LSA
MC :当路由器具有转发IP组播能力时,被设置
E:E=1,接收5类LSA,=0不接收5类LSA
MT:设置了该位表示始发路由器支持多拓扑OSPF(MT-OSPF)
6.通过比较ROUTER-ID,R2的ID大所以成为主,R1成为备,R1使用R2的序列号497发送LSA的头部信息给R2(I=0,M=1,MS=0)不为第一个包,后面还有包,为从
在BDB的主从协商完毕就进入了exchange状态了。
7.R2收到R1发来的DBD中的LSA头部信息,同时向R1发送DBD报文,携带LSA的头部。
(I=0,M=1,MS=1)不为第一个包,后面还有包,为主,序列号+1为498
同时R2先知道自己的数据库是否同步,所以发送LSR,请求没同步的LSA
LSA的头部格式:
LS age:LSA产生后所经过的时间,以秒为单位。LSA在本路由器的链路状态数据库(LSDB)中会随时间老化(每秒钟加1),但在网络的传输过程中却不会。
LS type:LSA的类型。常用有1、2、3、4、5、7类LSA。
Link State ID:具体数值根据LSA的类型而定。
Advertising Router:始发LSA的路由器的ID。
LS sequence number:LSA的序列号,其他路由器根据这个值可以判断哪个LSA是最新的。
LS checksum:除了LS age字段外,关于LSA的全部信息的校验和。
length:LSA的总长度,包括LSA Header,以字节为单位。
R2发送LSR请求,请求末同步的LSA,就是一些LSA的头部信息
LS type:LSA的类型号 //上图中为路由器LSA
Link State ID:链路状态标识,根据LSA的类型而定。 //LDID 1.1.1.1
Advertising Router:产生此LSA的路由器的Router ID。//通告AD 1.1.1.1
8.R1收到R2发过来的BDB,要发送DBD的确认给DBD的主路由器也就R2,同时R1没有DBD的包了,所以M=0,表示为最后一个DBD包。(但如果主再发DBD包过来,从还是要发DBD进行确认,这叫隐式确认)
DBD的确认就是发送一个DBD包,序列号为主的序列号,这叫隐式确认。
同时,R1也知道自己的数据库哪些末同步,也向R2发送LSR请求末同步的LSA,也就是一些LSA的头部信息
LS type:LSA的类型号 //上图中为路由器LSA 1类LSA
Link State ID:链路状态标识,根据LSA的类型而定。 //LDID 10.10.10.10
Advertising Router:产生此LSA的路由器的Router ID。//通告AD 10.10.10.10
在发送LSR时就进入了loading状态。
R1收到R2发过来的LSR请求,则发回LSU给R1
发达LSU给LSR请求的路由(包含具体的LSA信息)
Number of LSAs:该报文包含的LSA的数量。
LSAs:该报文包含的所有LSA。
9.R2收到R1发来的LSU要对收到的LSU进行确认,发送LSACK叫做显式确认。
LSAck报文用来对接收到的LSU报文进行确认,内容是需要确认的LSA的Header。一个LSAck报文可对多个LSA进行确认。
LSA Headers:该报文包含的LSA头部。
同时接收到R1的LSR请求,发送LSU
包含多条LSA的具体信息
同时R2后面没有DBD数据包了,要发送出最后一个DBD(M=0),告诉R1没有DBD包了
10.R1收到LSU后,对该LSU发送确认LSACK
R1收到R2发来的最后一个DBD包后,还是要发回确认的。
exchange和loading之间没有严格的界限,在exchange状态也会传送LSR、LSU、LSACK等信息,大家明白就好,不必太追究。这期间可能还有更多的LSA请求、更新、确认,直到LSDB的完全同步。
至此R1和R2的LSDB完全同步了,进入FULL状态,R1和R2建立邻接关系,每隔10s发送HELLO报文,运行SPF算法计算路由,把最最佳路由加入到全局路由表中。
PS:写博文有半个多月了,虽然写得不怎么样,但毕竟还是原创,写起来还真不是一件易事,每次写一篇至少要花2-3个小时,希望大家多多支持啊,你们的支持是我的动力!谢谢各位!