各位小伙伴们:大家好,!今天让我们来继续一起聊聊OSPF协议;通过上一节的介绍,我们已经知道OSPF路由设备之间交流的是LSA(链路状态通告),并不是路由表;后续几节想给大家讲讲OSPF邻居之间是如何工作的;今天我们先看看OSPF的报文类型;在介绍之前,我们需要知道以下几个重要概念
1. OSPF协议基于IP运行,协议的数据报文直接采用IP封装,在IP报文头部中对应的协议字段号为89
2. OSPF协议报文使用组播地址作为目的IP地址,其中224.0.0.5该组播地址指所有的OSPF路由器。224.0.0.6该组播地址指所有的OSPF DR路由器。(有关DR、BDR的概念后续会提到)。
我们已经知道路由器接口一旦激活OSPF,就会发送OSPF报文;OSPF一共定义了5种报文类型;这些报文类型有一个统一的报文头部,这个头部的长度为24byte。报文头格式如下:
![f39dd3526d7aeea955fd3786f7e3cc7b.png](https://img-blog.csdnimg.cn/img_convert/f39dd3526d7aeea955fd3786f7e3cc7b.png)
我们来解释一下几个关键字段的含义:
1》 版本:OSPF有两个版本:OSPFV2和OSPFV3;对于OSPFV2,该字段的值恒为2.
2》 类型:表示OSPF报文类型,该字段的值与报文类型的对应关系是:1---Hello;2---DD;3----LSR;4---LSU;5---LSAck;即:OSPF定义的5种报文类型。
3》 报文长度:整个OSPF报文的长度;
4》 路由器ID:路由器的OSPF Router-ID
5》 区域ID:该报文所属的区域ID
6》 校验和:用于校验报文有效性
7》 认证类型:指示该报文使用的认证类型;
8》 认证数据:用于报文认证的内容;
首先我们来看看OSPF的第一种报文类型
1、---Hello报文
Hello报文用于发现直连链路上的邻居,以维护邻居关系。OSPF路由器一旦在接口上激活OSPF,相应的接口就会发送和侦听Hello报文,Hello报文种携带着用于OSPF邻居关系建立的各项参数,在邻居关系建立的过程种,这些参数会被检查,只有参数匹配,双方才能建立邻居关系。OSPF Hello报文的格式如下:
![88bf7edca2fdcd412de3d673ddaf2451.png](https://img-blog.csdnimg.cn/img_convert/88bf7edca2fdcd412de3d673ddaf2451.png)
我们来解释一下几个关键字段的含义:
1》 网络掩码:一旦路由器的某个接口激活了OSPF,该接口就开始发送Hello报文,该字段填充的是该接口的网络掩码;如果一方在接口上收到的Hello报文中“网络掩码”字段与本接口不同,则忽略该Hello报文,邻居关系无法建立。
2》 Hello间隔:接口周期性发送Hello报文的时间间隔;两台直连路由器要建立OSPF邻居关系,需确保接口的Hello时间间隔相同。
3》 可选项:每个比特位用于指示该路由器的某个特定OSPF特性。
4》 路由器优先级:该字段用于DR、BDR的选举;注意:在多路访问网络中会进行DR(指定路由器)和BDR(备用指定路由器)的选举。
5》 路由器失效时间:在邻居路由器被视为无效前,需等待收到对方Hello报文的时间。
6》 指定路由器:网络中DR的接口IP地址,如果该字段的值为:0.0.0.0,则表示没有DR,或DR没有被选出。
7》 备份指定路由器:网络中BDR的接口IP地址;如果该字段的值为:0.0.0.0,则表示没有BDR,或BDR没有被选出。
8》 邻居:在直连链路上发现的有效邻居,此处填充的是邻居的Router-ID,如果发现多个邻居,则包含多个“邻居”字段。
2、----DD报文
DD报文用于描述LSDB,该报文中携带的是LSDB中LSA头部数据(也就是并非完整的LSA内容,仅仅是头部数据);在两台路由器开始使用DD报文描述自己的LSDB之前,双方需要协商Master/Slave,即主/从。所以,Master/Slave的协商也是通过DD报文的交互来完成的,但是需要注意的是这种DD报文并不携带任何LSA头部信息,在这可以理解为“空的”DD报文。
Master/Slave确定后,双方就开始使用DD报文描述各自的LSDB,在这种DD报文中包含着LSDB里的LSA头部。路由器可以使用多个DD报文来描述LSDB。OSPF DD报文格式如下:
![b316d2e88b882dc0839af0753ca65f0c.png](https://img-blog.csdnimg.cn/img_convert/b316d2e88b882dc0839af0753ca65f0c.png)
我们来解释一下几个关键字段的含义:
1》 接口最大传输单元:接口的MTU;缺省时接口发送的DD报文中,无论该接口实际的MTU的值是多少,该字段的值都为0。
2》 可选项:路由器支持的OSPF可选项。有如下几个:
I位:也即初始化位,当该DD报文用于协商Mater/Slave路由器时,该比特位值为1,Mater/Slave选举完成后,该比特位被置为0。
M位:该比特位置为1,则表示后续还有更多的DD报文,如果被置为0,则表示这是最后一个DD报文。
MS位:Master路由器在自己发送的DD报文中将该比特位置为1;Slave路由器将其置为0。
3》 DD序列号:在DD报文的交互过程中DD序列号被逐渐加1,用于确保DD报文传输的可靠性。注意:DD序列号必须由Master路由器来决定,Slave路由器只能使用Master路由器发送来的DD序列号来发送自己的DD报文。
4》 LSA头部:当路由器使用DD报文来描述自己的LSDB时,LSA头部信息被包含在此处。一个DD报文可能包含一条或多条LSA头部。
3----LSR报文
在与OSPF邻居交换DD报文之后,路由器就知道了邻居的LSDB摘要,它将向邻居发送LSR报文来请求所需的LSA完整数据。LSR报文格式如下:
![ab5eddee6de3e4b7a0f17370a1360b71.png](https://img-blog.csdnimg.cn/img_convert/ab5eddee6de3e4b7a0f17370a1360b71.png)
我们来解释一下几个关键字段的含义:
1》 链路状态类型:指示本条LSA的类型。OSPF定义了多种LSA类型,我们会在后续中详细讨论。
2》 链路状态ID:LSA标识。不同LSA类型对该字段的定义是不同的。
3》 通告路由器:产生该LSA的路由器的Router-ID
注意:LSR报文中的链路状态类型、链路状态ID、通告路由器的三个元素标识了路由器请求的LSA;如果请求多个LSA,则LSR可能包含多个上述三元组。
4-----LSU报文
路由器收到邻居发送过来的LSR报文后,会以LSU报文进行回应;在LSU报文中就包含了对方请求的LSA完整数据。一个LSU报文可以包含多个LSA。另外,当路由器感知到网络发生变化时,也可以触发LSU报文的泛洪。
注意:在多路访问网络中,非DR及BDR路由器向224.0.0.6这个组播地址发送LSU报文;而DR及BDR会侦听这个组播地址,DR在接收LSU报文后向224.0.0.5发送LSU报文,从而将更新信息泛洪到整个OSPF域,所有的OSPF路由器都会侦听224.0.0.5这个组播地址。
LSU报文格式如下:
![63ac88ea85e7bad879f660b0b870c24f.png](https://img-blog.csdnimg.cn/img_convert/63ac88ea85e7bad879f660b0b870c24f.png)
5-----LSAck报文
当一台路由器收到邻居发送过来的LSU报文时,需要对报文中包含的LSA进行确认,这个确认可以时回复一个LSAck报文。
LSAck报文中包含这路由器所确认的LSA头部。LSAck的报文格式如下:
![07ff5dea4ed55ff1db665aa773b7c2ca.png](https://img-blog.csdnimg.cn/img_convert/07ff5dea4ed55ff1db665aa773b7c2ca.png)
好了,小伙伴们今天就暂时分享这些吧!OSPF是目前网络中使用率最高的路由协议之一,它看似配置简单,但原理很复杂;我们必须深入理解它的工作原理才能更好的在实际工作中很好的应用OSPF;这一期只是给大家简单的分享了一些OSPF的报文类型,下一期我们将深入讨论OSPF的邻接关系,注意不是邻居关系哦,这两个概念千万不能搞混淆呀;具体细节我们下次讨论;最后请大家关注实验笔记,实验笔记就是你身边的学习笔记!