OSPF协议报文采用IP封装,IP报文头部中对应的协议号为89,使用组播地址作为目的ip地址。

组播地址224.0.0.5:所有的OSPF路由器都会监听该组播地址。

组播地址224.0.0.6:所有的OSPF DR路由器都会监听该组播地址。

一、OSPF五种报文类型:

1、Hello报文:用于发现直连链路上的OSPF邻居,并维护OSPF邻居关系;

2、DD报文(Database Description,数据库描述):用于描述LSDB,报文中携带了LSDB中LSA的头部数据(非完整LSA内容,类使用摘要信息);

3、LSR报文(Link State Request,链路状态请求):用于向OSPF邻居请求LSA;

4、LSU报文(Link State Update,链路状态更新):用于发送LSA,报文中携带了完整的LSA数据;    //LSA承载在LSU中进行泛洪

5、LSAck(Link State Acknowledgment,链路状态确认):设备收到LSU后,LSAck用于对接收到的LSA进行确认。

二、OSPF报文头:所有OSPF报文类型都有统一的头部,长度24bit。

1、版本:Version,占用8bit,OSPFv2对应的字段值为2;

2、类型:Type,占用8bit,描述报文类型。该字段值1表示Hello报文,2表示DD报文,3-表示LSR报文,4表示LSU报文,5表示LSAck;

3、报文长度:Packet Length,占用16bit,整个OSPF报文的长度,单位默认为字节数Byte;

4、路由器ID:Router-ID,长度32bit,OSPF域中路由器的唯一标识;

5、区域ID:Area ID,报文所属的区域ID,一个32bit的数值;

6、校验和:Checksum,16bit,用于校验报文有效性的字段;

7、认证类型:Authentication Type,16bit,报文使用的认证类型;

8、认证数据:Authentication Data,64bit,用于报文认证的内容。

三、Hello报文:用于发现直连链路上的邻居,并维护邻居关系。Hello报文携带了OSPF邻居关系建立的各项参数,在邻居关系建立过程中,这些参数会被检查并进行匹配,匹配成功后才能正确的建立邻居关系。

除了OSPF报文头外,Hello报文还有以下字段:

1、网络掩码:Network Mask,占用32bit。路由器接口激活OSPF后,接口开始发送Hello报文,本字段填充的是该接口的网络掩码。两台OSPF路由器如果通过以太网接口直连,则双方的直连接口必须配置相同的网络掩码,否则接收端将忽略该Hello报文,邻居关系无法建立成功;

2、Hello间隔:Hello Interval,占用16bit,接口周期性发送Hello报文的时间间隔。两台OSPF路由器要建立邻居关系,则接口的Hello Interval必须保持一致。    //默认情况下,NBMA、P2MP类型的接口Hello间隔为30s,P2P、Broadcast类型接口Hello间隔为10s。

3、可选项:Options,占用8bit,每个比特位用于指示该路由器的某个特定的OSPF特性。路由器设置相应的Options比特位来通告自己支持某种特性或者某种能力。直连链路两端的OSPF路由器Options不一致,可能会影响到OSPF邻接关系的建立。

4、路由器优先级:Router Priority,也称为DR优先级,占用8bit,用于DR、BDR的选举。华为设备中,默认情况下,OSPF接口的DR优先级为1。

5、路由器失效时间:Router Dead Interval,占用8bit,在邻居路由器被视为无效前,需等待收到对方Hello报文的时间。两台直连OSPF路由器接口的路由器失效时间必须保持一致,邻居关系才能成功建立。    //默认情况下,OSPF路由器接口的路由器实现时间为该接口的Hello间隔的4倍

6、指定路由器:Designated Router,占用32位,网络中DR的接口ip地址;    //如果该字段值为0.0.0.0,则表示没有DR或者DR还未选举出来

7、备份指定路由器:Backup Designated Router,占用32位,网络中BDR的接口ip地址;    //如果该字段值为0.0.0.0,则表示没有BDR或者BDR还未选举出来

8、邻居:Neighbor,占用32位,直连链路上发现的有效邻居,字段值为该邻居的Router-ID。如果有多个邻居,则包含多个邻居字段。

四、DD报文:用于描述LSDB,该报文中携带了LSDB中LSA的头部数据(非完整LSA内容)。OSPF建立完邻居关系后,开始邻接关系的建立过程中,互为邻居的路由器之间会交互DD报文。在交互DD报文前,两台路由器需要协商主/从(Master/Slave)关系。值得注意的是,两台路由器协商主/从关系也是通过交互空的DD报文(不含任何LSA头部信息的DD报文)来完成的。

主/从关系(Master/Slave)协商机制:比较OSPF报文头中的Router-ID字段,Router-ID更大的路由器成为Master路由器。

主/从关系确立后,双方开始使用DD报文描述各自的LSDB,此时的DD报文包含了LSA的头部信息。为了确保DD报文传输的有序和可靠,Master路由器的DD序列号字段用来对DD报文进行确认。

DD序列号的确认及交换过程:Master路由器发送DD报文给对端,对端Slave接收后提取其中的DD序列号用来作为自己向Master发送DD报文的序列号。所以,两端的交互是一来以往的,如果Master或者Slave有多个DD报文需要交互,则需要Master先发送一个比如序列号为1的DD报文,Slave接收到该报文后,向Master也发送一个序列号为1的DD报文;然后Master继续发送序列号为2的DD报文,Slave接收到后再向Master发送一个序列号为2的DD报文。依次轮流发送,Slave必须等到Master发送了含有新的序列号的DD报文后,才能根据该序列号向Master发送相同序列号的DD报文。

除了OSPF报文头外,DD报文还有以下字段:

1、接口最大传输单元:Interface Maximum Transmission Unit,占用16bit,定义接口的MTU。华为设备中,默认情况下,无论接口的实际MTU是多少,该字段值都为0。    //只有通过命令手动修改了接口MTU后,该字段值才会显式显式自定义的MTU值

2、可选项:OPtions,占用8bit,路由器支持的OSPF可选项。

3、I位:1bit,Initial Bit,初始化位,当DD报文用于Master/Slave协商时,该位被置为1;协商完成后,该位被设置为0;

4、M位:1bit,More Bit,该位置为1,表示后续还有更多的DD报文;该位置为0,则表示这是最后一个DD报文;

5、MS位:1bit,Master Bit,Master路由器发送DD报文时将该位置为1,Slave则置为0;

6、DD序列号:32bit,DD Sequence Number,在DD报文交互过程中,DD序列号逐次加1,用于确保DD报文传输的有序和可靠性。DD序列号由Master路由器决定,Slave路由器使用Master路由器发送的DD序列号来发送自己的DD报文;

7、LSA头部:一个DD报文可能包含一条或多条LSA的头部。

五、LSR报文:OSPF邻居交换DD报文后,路由器获取到邻居的LSDB摘要,将向邻居发送LSR报文来请求所需的LSA的完整数据。LSR报文中通过链路状态类型(Link-State Type)、链路状态ID(Link-State ID)和通告路由器(Advertising Router)三个元素来标识路由器请求的LSA。如果请求多个LSA,则LSR报文中将包含多个上述三元组。

除了OSPF报文头外,LSR报文还有以下字段:

1、链路状态类型:Link-State Type,32bit,指示本条LSA的类型。    //LSA类型有1-Router LSA、2-Network LSA、3-Network Summary LSA、4-ASBR Summary LSA、5-AS External LSA等

2、链路状态ID/标识:Link-State ID,32bit,LSA的标识。

3、通过路由器:Advertising Router,32bit,产生该LSA的路由器的Router-ID。

六、LSU报文:OSPF路由器接收到邻居发送过来的LSR后,会以LSU报文进行回应,LSU报文中包含了对方请求的LSA的完整信息,一个LSU报文可以包含多个LSA。

如果网络发生变化,OSPF会触发更新,进行LSU泛洪,以便通知OSPF区域中其他路由器。

LSU触发更新过程:MA网络中,非DR、BDR路由器向224.0.0.6组播地址发送LSU报文,DR、BDR会侦听这个组播地址;DR接收到LSU报文后,向224.0.0.5组播地址发送LSU报文,所有的OSPF路由器都会侦听224.0.0.5这个组播地址,从而将更新信息泛洪到整个OSPF区域。

LSU报文由OSPF报文头+LSA组成,没有其他的控制字段。

七、LSAck报文:为了确保LSA能够可靠送达,当一台路由器接收到邻居发送过来的LSU报文时,会向对方发送一个LSAck报文对接收到的报文中包含的LSA进行确认。

LSAck报文包含OSPF报文头和LSA的头部(LSA头部长度为20bit)