OSPF数据包是由多重封装构成的,解析一个OSPF数据包就像给洋葱剥皮一样,OSPF数据包的最外层是IP包的头部,封装在IP头部内的是种OSPF数据包类型的一种,每一种数据包类型都是由一个OSPF数据包头开始的,这个包头中包含了OSPF的版本,包含的数据包类型,RID,认证等信息。

我们开看一下OSPF的数据包封装结构

ospf报文heelo packet ospf报文封装_其他

OSPF数据包是直接封装在IP包头里面的,所有OSPF路由器都监听组播地址224.0.0.5。

DR/BDR:监听224.0.0.5、224.0.0.6

DROther:监听224.0.0.5

所有OSPF路由器建立邻居使用224.0.0.5,DROther将LSA发送到224.0.0.6,DR/BDR将LSU更新信息发往224.0.0.5.

OSPF Header(头部)报文解析。

ospf报文heelo packet ospf报文封装_ospf hello时间和dead_02

Version:OSPF的版本号。IPV4用的版本2,IPV6用的版本3。

Message Type:OSPF报文类型,指跟在头部后面的数据包类型。

(1=hello,2=DBD,3=LSR,4=LSU,5=LSACK)

Packet Length :整个OSPF数据包的长度,包括头部长度。

Source OSPF Router:生成此报文的路由器的RID。

Area ID:发送这个数据包的接口所在的区域ID。

Checksum:整个OSPF数据包的校验和。

Auth Type:认证类型(0代表没有,1明文认证,2是MD5认证)

Auth Data:认证密码

Hello报文解析。

ospf报文heelo packet ospf报文封装_ospf hello时间和dead_03

Network Mask:发出这个数据包的接口的掩码,如果和接收这个数据包的接口掩码不匹配将会被丢弃。

Hello Interval:OSPF的hello包的发送周期。默认10s

Options:Hello包中包含这个字段可以用来确保邻居之间的兼容性问题,后面的章节会详细介绍。

Router Priority:接口优先级,用来选举DR/BDR(默认1,为0时不参加选举)。

Router Dead Interval:邻居的死亡时间,一般为hello时间的4倍。40s

Designated Router:一个网段中DR的ip地址,不是DR的RID(0.0.0.0代表没有选举)。

Backup Designated Router:BDR的接口ip地址,不是BDR的RID(0.0.0.0代表没有选举)。

Active Neighbor:自己的邻居列表。

DBD报文解析

ospf报文heelo packet ospf报文封装_字段_04

Interface MTU:接口MTU值,在虚链路上发送时为0x0000

Optinos:DBD中包含这个字段,可以使路由器选择不转发某些LSA。

DB Description:里面包含四个选项

R隐式确认总是为0

I=1表示第一个DBD报文

M=1表示后续还有DBD报文

MS=1表示自己是主路由器

DD Sequence:DBD的序列号,选举主从之后,从路由器跟随主路由器的序列号。

LSA头部里面也有Options选项字段,之后的文章会详细说到

LSR报文解析

ospf报文heelo packet ospf报文封装_ospf hello时间和dead_05

LS Type:请求的LSA类型

Link State ID:LSA头部中和类型无关的字段。

Advertising Router:始发这条LSA的路由器的RID。

收到两个相同的LSA,通过LSA的LS Type,Link State ID,Advertising Router,就能判断出是不是一条相同的LSA。

LSU报文解析

ospf报文heelo packet ospf报文封装_OSPF_06

Number of LSAs:LSU报文包含的详细的LSA的数量。

LSA的详细信息,每一个更新包里都可以携带多个LSA,里面也有Options选项

LSACK报文解析

ospf报文heelo packet ospf报文封装_封装_07

用来对接收到的LSU报文进行确认,内容是需要确认的LSA的头部(摘要)。一个LSACK可以对多个LSA进行确认,根据不同的链路以单播或者组播形式发送。