OSPF协议报文格式详解
OSPF协议报文格式详解
OSPF(开放最短路径优先)协议使用IP报文直接封装协议报文,协议号为89。OSPF协议主要包括5种类型的报文:Hello报文、DD(Database Description)报文、LSR(Link State Request)报文、LSU(Link State Update)报文和LSAck(Link State Acknowledgment)报文。
报文头格式
OSPF的五种报文具有相同的报文头格式,长度为24字节。如图1所示。
图1 报文头格式
表1 OSPF报文头格式字段解释
字段名 | 长度 | 含义 |
---|---|---|
Version | 8比特 | OSPF的版本号。对于OSPFv2,其值为2。 |
Type | 8比特 | OSPF报文的类型:1:Hello报文。2:DD报文。3:LSR报文。4:LSU报文。5:LSAck报文。 |
Packet length | 16比特 | OSPF报文的总长度,包括报文头在内,单位为字节。 |
Router ID | 32比特 | 发送该报文的路由器标识。 |
Area ID | 32比特 | 发送该报文的路由器的所属区域。 |
Checksum | 16比特 | 包含除了认证字段的整个报文的校验和。 |
AuType | 16比特 | 验证类型:0:不验证。1:简单认证。2:密文认证。说明:MD5算法安全性低,存在安全风险。 |
Authentication | 64比特 | 其数值根据验证类型而定:0:不对此字段作定义。1:此字段为密码信息。2:此字段包括Key ID、MD5验证数据长度和序列号的信息。 |
MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。
Hello报文
Hello报文是最常用的一种报文,主要用于建立和维护邻接关系,周期性地在启用了OSPF的接口上发送。报文内容包括一些定时器的数值、DR(Designated Router)、BDR(Backup Designated Router)以及已知的邻居。Hello报文格式如图2所示。
图2 Hello报文格式
表2 Hello报文格式字段解释
字段名 | 长度 | 含义 |
---|---|---|
Network Mask | 32比特 | 发送Hello报文的接口所在网络的掩码。 |
HelloInterval | 16比特 | 发送Hello报文的时间间隔。 |
Options | 8比特 | 可选项:E:允许Flood AS-External-LSAs。MC:转发IP组播报文。N/P:处理Type-7 LSAs。DC:处理按需链路。 |
Rtr Pri | 8比特 | DR优先级。默认为1。说明:如果设置为0,则路由器不能参与DR或BDR的选举。 |
RouterDeadInterval | 32比特 | 失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。 |
Designated Router | 32比特 | DR的接口地址。 |
Backup Designated Router | 32比特 | BDR的接口地址。 |
Neighbor | 32比特 | 邻居,以Router ID标识。 |
Hello报文在不同网络中的发送地址类型、发送时间间隔类型和时间间隔缺省值不同,参见表3。
表3 Hello报文的属性
网络类型 | 发送地址类型 | 发送时间间隔类型 | 时间间隔缺省值 |
---|---|---|---|
广播 | 组播地址 | HelloInterval | 缺省情况下,接口发送Hello报文的时间间隔的值为10秒。 |
NBMA | 单播地址 | DR、BDR、有能力成为DR的路由器时,发送时间间隔为HelloInterval。邻居的状态为Down时,发送时间间隔为Pollinterval,其它情况为HelloInterval。 | 缺省情况下,接口发送Hello报文的时间间隔的值为30秒。缺省情况下,接口发送Pollinterval间隔为120秒。 |
P2P | 组播地址 | HelloInterval | 缺省情况下,接口发送Hello报文的时间间隔的值为10秒。 |
P2MP | 组播地址 | HelloInterval | 缺省情况下,接口发送Hello报文的时间间隔的值为30秒。 |
在同一网段上的路由器,其HelloInterval和RouterDeadInterval必须分别一致,否则不能形成邻居关系。对于NBMA网络,还存在PollInterval属性,该属性也必须两端一致。
DD报文
两台路由器在邻接关系初始化时,用DD报文描述本端路由器的LSDB(链路状态数据库),进行数据库的同步。报文内容包括LSDB中每一条LSA(链路状态通告)的Header(LSA的Header可以唯一标识一条LSA)。LSA Header只占一条LSA的整个数据量的一小部分,这样可以减少路由器之间的协议报文流量,对端路由器根据LSA Header就可以判断出是否已有这条LSA。在两台路由器交换DD报文的过程中,一台为Master,另一台为Slave。由Master规定起始序列号,每发送一个DD报文序列号加1,Slave方使用Master的序列号作为确认。
DD报文格式如图3所示。
图3 DD报文格式
表4 DD报文格式字段解释
字段名 | 长度 | 含义 |
---|---|---|
Interface MTU | 16比特 | 在不分片的情况下,此接口最大可发出的IP报文长度。 |
Options | 8比特 | 可选项:E:允许Flood AS-External-LSAs。MC:转发IP组播报文。N/P:处理Type-7 LSAs。DC:处理按需链路。 |
I | 1比特 | 当发送连续多个DD报文时,如果这是第一个DD报文,则置为1,否则置为0。 |
M(More) | 1比特 | 当发送连续多个DD报文时,如果这是最后一个DD报文,则置为0,否则置为1,表示后面还有其他的DD报文。 |
M/S(Master/Slave) | 1比特 | 当两台OSPF设备交换DD报文时,首先需要确定双方的主从关系,Router ID大的一方会成为Master。当值为1时表示发送方为Master。 |
DD sequence number | 32比特 | DD报文序列号。主从双方利用序列号来保证DD报文传输的可靠性和完整性。 |
LSA Headers | - | 该DD报文中所包含的LSA的头部信息。 |
LSR报文
两台路由器互相交换过DD报文之后,需要发送LSR报文向对方请求更新LSA,内容包括所需要的LSA的摘要信息。LSR报文格式如图4所示。
图4 LSR报文格式
表5 LSR报文格式字段解释
字段名 | 长度 | 含义 |
---|---|---|
LS type | 32比特 | LSA的类型号。 |
Link State ID | 32比特 | 与LS Type一起描述路由域中唯一一个LSA。 |
Advertising Router | 32比特 | 产生此LSA的路由器的Router ID。 |
LS type、Link State ID和Advertising Router可以唯一标识出一个LSA。当两个LSA一样时,需要根据LSA中的LS sequence number、LS checksum和LS age来判断出所需要LSA的新旧。
LSU报文
LSU报文用来向对端路由器发送其所需要的LSA或者泛洪本端更新的LSA,内容是多条LSA(全部内容)的集合。LSU报文在支持组播和广播的网络中是以组播形式将LSA泛洪出去。为了实现Flooding的可靠性传输,需要LSAck报文对其进行确认,对没有收到确认报文的LSA进行重传,重传的LSA是直接发送到邻居的。LSU报文格式如图5所示。
图5 LSU报文格式
表6 LSU报文格式字段解释
字段名 | 长度 | 含义 |
---|---|---|
Number of LSAs | 32比特 | LSA的数量。 |
LSA | - | LSA的具体内容。 |
LSAck报文
LSAck报文用来对接收到的LSU报文进行确认,内容是需要确认的LSA的Header(一个LSAck报文可对多个LSA进行确认)。LSAck报文根据不同的链路以单播或组播的形式发送,LSAck报文格式如图6所示。
图6 LSAck报文格式
表7 LSAck报文格式字段解释
字段名 | 长度 | 含义 |
---|---|---|
LSAs Headers | 由需要确认的LSA的Header长度决定。 | 通过LSA的头部信息确认收到该LSA。 |