OSPF数据包是由多重封装构成的,解析一个OSPF数据包就像给洋葱剥皮一样,OSPF数据包的最外层是IP包的头部,封装在IP头部内的是种OSPF数据包类型的一种,每一种数据包类型都是由一个OSPF数据包头开始的,这个包头中包含了OSPF的版本,包含的数据包类型,RID,认证等信息。
我们开看一下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(头部)报文解析。
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报文解析。
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报文解析
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报文解析
LS Type:请求的LSA类型
Link State ID:LSA头部中和类型无关的字段。
Advertising Router:始发这条LSA的路由器的RID。
收到两个相同的LSA,通过LSA的LS Type,Link State ID,Advertising Router,就能判断出是不是一条相同的LSA。
LSU报文解析
Number of LSAs:LSU报文包含的详细的LSA的数量。
LSA的详细信息,每一个更新包里都可以携带多个LSA,里面也有Options选项
LSACK报文解析
用来对接收到的LSU报文进行确认,内容是需要确认的LSA的头部(摘要)。一个LSACK可以对多个LSA进行确认,根据不同的链路以单播或者组播形式发送。