当前位置:   article > 正文

OSPF工作过程之邻居建立(图文并茂)_ospf邻居建立过程

ospf邻居建立过程

目录

2.1   运行机制

2.2   报文类型

2.2.1   OSPF头部

2.2.2   Hello报文

2.2.3   DD(Database Description,数据库描述)报文

2.2.4   LSR(Link State Request,链路状态请求)报文

2.2.5   LSU(Link State Update,链路状态更新)报文

2.2.6   LSAck(Link State Acknowledgment,链路状态确认)报文

2.3   邻居状态

2.4   交互过程

2.5   报文确认机制

2.6   静默接口

2.7   影响OSPF邻居建立的因素

1、Router-ID必须唯一

2、接口区域ID:相邻的直连接口区域ID必须相同。

3、认证类型:认证类型不一致,认证会失败,会导致ospf邻居建立不起来。

4、掩码一致(MA网络中)

5、hello和dead一致,两台设备配置hello/dead时间不一致,会导致ospf邻居建立失败

6、silent-interface静默端口:在端口上配置静默端口命令,端口对于报文,不收不发,没有报文的交流,自然也就无法建立ospf邻居关系。

7、MTU值一样:

8、区域类型:stub-stub,nssa-nssa,普通-普通。

9、网络类型:MA-MA,P2P-P2P

10、DR优先级:在MA网络中,DR优先级为0不参与DR选举,会卡在2-Way状态。

11、版本一致 

 


2.1   运行机制

一、简略

  1. 建立邻居关系
  2. 邻居之间交互链路状态信息和同步LSDB
  3. 建立邻接关系
  4. 运行SPF算法计算以自己为根到达目的网络的最佳路径
  5. 维护和更新

二、详细

  1. 配置好ospf协议后,开始组播(单播)收发hello包;
  2. 若收到包含自己router-id的hello包,则视为其他路由器知道此路由器的存在,象征着邻居关系的建立,生成邻居表
  3. 开始判断是否能进行下一阶段。若不能则卡在2-way状态,仅进行hello包的周期保活。若能则建立邻接关系
  4. 发送不包含LSA头部的DBD包进行主从选举
  5. 之后主优先与从进行DBD目录交换;
  6. 交换后再使用LSR/LSU/LSack来获取未知的LSA信息
  7. 直到邻接间数据库完全一致,生成LSDB表链路状态数据库(该网络所有LSA的集合)
  8. 当区域内数据库的同步完成后
  9. 生成有向图—>最短路径树,将最佳路径加载到本地的OSPF路由表中;
  10. 网络收敛完成,hello包周期保活;
  11. 之后每30min邻接关系间周期比对下一数据库目录;(查漏补缺)

2.2   报文类型

           OSPF协议基于IP运行,协议报文直接采用IP封装,IP报文对应的协议号为89。每个OSPF报文都由OSPF header加上OSPF payload组成。

2.2.1   OSPF头部

  1. Version:OSPF版本,IPv4字段为2,IPv6字段为3
  2. Message Type:报文类型。hello(1),DD(2),LSR(3),LSU(4),LSAck(5)
  3. Packet Length:OSPF报文长度,报文头部+数据
  4. Source OSPF Router:发送此报文的路由器的router-id
  5. Area ID:发送此报文的出接口所在区域
  6. Checksum:校验和,用作校验
  7. Auth Type:认证类型,有Null(0),Simple(1)和MD5(2)
  8. Authentication:认证字段,其数值根据验证类型而定。

当验证类型为0时未作定义:

类型为1时为明文认证,此字段为密码信息:

类型为2时为密文认证,此字段包括Key ID、MD5验证数据长度、序列号的信息,MD5验证数据:

2.2.2   Hello报文

           周期性发送,用来发现,建立和维护OSPF邻居关系。内容包括一些定时器的数值、DR(Designated Router,指定路由器)、BDR(Backup Designated Router,备份指定路由器)以及自己已知的邻居。

  1. Network Mask:发送该报文接口所在网段掩码
  2. Hello Interval [sec]:hello周期发送时间
  3. Options: 选项位,用于描述接口属于什么区域
  • E=1 N=0代表为普通区域(E=1 N一定=0,所以没有E=1 N=1的情况)
  • E=0 N=0 代表为stub区域
  • E=0 N=1 代表为NSSA区域

         E:External Routing:如果置位表示支持5类LSA

         N:NSSA Routing:如果置位表示支持7类LSA

   4.Router Priority:路由器优先级,用于竞选DR/BDR,缺省为1

   5.Router Dead Interval [sec]:失效时间=4*hello时间,如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。

   6.Designated Router:DR路由器,使用Router-id标识

   7.Backup Designated Router:BDR路由器,使用Router-id标识

   8.Active Neighbor:邻居,使用Router-id标识

2.2.3   DD(Database Description,数据库描述)报文

1、选举主从,确定序列号,为了后续可靠的交互DD报文做准备(不携带摘要信息)

2、发送描述本地LSDB的摘要信息(LSA头部),实现邻居之间LSDB的按需同步

3、自身摘要传递完毕,M会置位为0,路由器收到M置位为0的DD报文会进入Loading状态

4、LSA头部:LS Type、Link State ID、Advertising Router (三大要素标识唯一的一条LSA)

 (1)Interface MTU: 限制发出的报文大小。华为默认不检查,所以是0,如果需要则需单独开启

 (2)Options: 选项置位,都一样

 (3)DB Description:DD报文描述置位

(R)保留位,目前没使用

(I) Init:如果置位表示是第一个DD报文,用来选举主从,Router ID越大越优

(M) More:如果置位表示后续还有带有LSA摘要信息的DD报文

(MS)Master:如果置位表示发送该DD报文的是Master

 (4)DD Sequence:DD报文序列号,用于标识DD报文,只有Master产生序列号,每发送一次加1,保证DD报文有序的交互,隐形确认

2.2.4   LSR(Link State Request,链路状态请求)报文

           向对方请求所需的LSA。两台路由器互相交换DD报文之后,得知对端的路由器有哪些LSA是本地的LSDB所缺少的,这时需要发送LSR报文向对方请求所需的LSA。内容包括所需要的LSA的摘要。 

    三大要素唯一标识一条LSA:

  1. LS Type:LSA的类型
  2. Link State ID:根据LSA类型的不同,这个字段也会发生变化,如果是1类LSA则这个字段填写是路由器的Router lD
  3. Advertising Router:产生此LSA的路由器的Router ID

2.2.5   LSU(Link State Update,链路状态更新)报文

           向邻居发送其所需要的LSA详细信息。通过LSU更新与撤销路由。 

  1. LS Age:LSA产生后所经过的时间,以秒为单位。无论LSA是在链路上传送,还是保存在LSDB中,其值都会在不停的增长。
  2. Options:都一样
  3. LS Type+Link State ID+Advertising Router用来标识一个唯一的LSA
  4. Sequence Numner:LSA的序列号。当LSA每次有新产生时,序列号就会增加。该字段用于判断LSA的新旧或是否存在重复的实例
  5. Checksum:校验和,还可以判断LSA的新旧

2.2.6   LSAck(Link State Acknowledgment,链路状态确认)报文

          用来对收到的LSU报文里面的LSA进行确认,一个报文可对多个LSA进行确认。 

        根据三要素确认LSA 

2.3   邻居状态

1、 Down(没有发现任何的 OSPF 邻居):开启了 OSPF 协议,但是没有收到邻居发送的 Hello 报文。

2、 Init(代表自身发现了邻居的存在,但是邻居并没有发现自身的存在):收到了邻居的 Hello 报文,但是没有在 Hello 报文中看到自身的Router ID。

3、 Two-Way:收到了邻居的 Hello 报文,同时在 Hello 报文看到自身的 Router ID。

4、 Exstart:邻居之间发送 DD 报文(不携带任何 LSA 的摘要信息),进行主从协商,确定序列号,为了保证后续可靠的交互DD 报文做准备

• 主从协商的规则:比较路由器的 Router ID,大为主,小的为从。

5、 Exchange:从向主发送一个带有 LSA 摘要信息的 DD 报文,主设备收到从的 DD 报文之后回复一个 DD 报文(里面携带了LSA 的摘要信息)同时序列号+1 告诉从你的 DD 报文我收到。

6、 Loading:收到M=0的DD报文,会进入loading状态,继续向对方发送 LSR 报文进行请求本地 LSDB 缺失的LSA,对方收到 LSR 报文之后,回复一个 LSU 报文里面携带LSA的详细信息,本端收到 LSU 报文之后回复 LSAcK,针对LSU 里面的 LSA 进行确认。

7.、Full:本地 LSDB 没有任何 LSA 的缺失,邻接关系建立。

2.4   交互过程

 1、邻居建立过程

 (1) R1 在启动 OSPF 之后由于没有收到任何邻居发送的 OSPF 报文,因此状态为 Down,此时 R1 向外发送一个 Hello 报文,尝试发现邻居。

 (2) 当 R2 收到 R1 发送的 Hello 报文之后,由于报文中没有携带自身的 Router ID,说明 R1 没有发现 R2 的存在,因此状态为Init。此时 R2 已经收到了 R1 发送的 Hello 报文,因此 R2 在向外发送 Hello 报文的时候会将 R1 的 Router ID 添加到已发现的邻居字段中(Active Neighbors)表示之前已经接收到了 R1 发送的 Hello 报文。

 

 (3)当 R1 收到 R2 发送的 Hello 报文之后,由于报文携带了自身的 Router ID,说明 R2 之前已经收到了 R1 发送的 Hello 报文,证明 R2 已经知道了 R1 的存在。此时 R1 的状态会切换到 2-Way。由于 R1 已经收到了 R2 发送的 Hello 报文,因此 R1 在向外发送 Hello 报文的时候会将 R2 的 Router ID添加到已发现的邻居字段中(Active Neighbors)表示之前已经接收到了 R2 发送的 Hello 报文。

 

 (4)当 R2 收到 R1 发送的 Hello 报文之后,由于报文携带了自身的 Router ID,说明 R1 之前已经收到了 R2 发送的 Hello 报文,证明 R1 已经知道了 R2 的存在。此时 R2 的状态会切换到 Tow-Way。

 (5)双方的状态都进入到 2-Way 之后,OSPF 的邻居关系就建立成功了。

2、邻接建立过程

(6)在 DR 和 BDR 选举完成后,R1和R2会同时发送空的DD报文确定主从关系,同时状态变成Exstar状态,该 DD 报文格式为:

  •   R1 发:DD(seq=X I=1 M=1 MS=1)第一个 DD 报文,认为自己是主

R2 发:DD(seq=Y I=1 M=1 MS=1)第一个 DD 报文,认为自己是主 

由于 R2 的 router ID 更大,所以 R1 收到 R2 发送的 DD 报文后会承认R2 为主,同时主动发送使用序号为主的含有LSA摘要的DD(seq=Y I=0 M=1或0  MS=0)报文开始交互 LSA 摘要信息。如果摘要信息过多,会发送多条M=1 的DD报文,发最后一条DD报文的时候,M=0。R1进入Exchange状态,R2邻居状态依然Exstart。 

(7)R2收到R1的DD后会发送LSR,并发送新的DD(seq=Y+1 I=0 M=1或0 MS=1)报文来描述自己的LSA摘要,同时进入Exchange状态。

 

DD报文隐式确认机制  R1是从,R2是主。

R1 通过重复R2 的序列号来确认已收到R2的DD报文。

(8)当R2发送最后一个DD(M=0)报文时,R1收到后认为LSA信息即将加载完成,于是将邻居状态变成loading状态(收到对方发送的 M=0的DD报文才会进入loading状态),R1作为Slave,R1需要对Master发送的最后一个DD报文进行确认,如果没有LSA就发送M=0空的DD报文同时用来帮助R2邻居状态变为loading,于是R2收到后也变成loading状态。

    注意:如果主路由器的LSA较多,从路由器的LSA先描述完,依然会发送多个空DD(Seq=主,M=0)报文,第一个M=0的DD报文用来帮助主路由器邻居状态变为loading同时作为主路由器DD报文的确认,后续从路由器依然会发送M=0的报文对主路由器发送含有摘要的DD报文进行确认,最后当主路由器发送M=0的DD报文时,从路由器还会发送M=0的DD确认。

     如果从的LSA较多,此时主的LSA先描述完,主为了报文的有序进行,会发送(seq+1 M=0)的空DD报文继续推进从发送含有LSA的摘要。

(9)最后,LSA全部加进LSDB完成后双方进入Full状态。

  注意:LSR,LSU和邻居状态的变化无关,LSA加载完成就会进入FULL状态。

(10)OSPF 邻居关系和邻接关系区别:

邻居关系:只代表邻居之间互相发现彼此的存在,双方的LSDB并没有同步。

邻接关系:邻居之间不止互相发现了,同时LSDB 也进行了同步。

2.5   报文确认机制

    由于OSPF是被IP协议直接封装的路由协议(工作在网络层之上的路由协议),IP协议不具备可靠性机制。因此OSPF需要自己建立一套可靠性机制保障邻居能成功的同步。

  1. Hello报文10S维护,40S老化。
  2. DD报文用seq来做隐式确认
  3. LSR报文,使用LSU报文作为确认回复。
  4. LSU报文,使用LSACK报文作为确认回复,5S超时重新发送LSU。

2.6   静默接口

    在一个OSPF区域中,区域间的设备会周期性的发送路由更新信息,而非OSPF设备并不需要接收这些信息,并且这些信息还占用一定的带宽,因此可以将连接非OSPF设备的路由器接口配置为静默接口

   当路由器的接口被配置为静默接口后,该接口可以生成LSA,但是不再收发和处理OSPF报文。

1、单个静默接口

[AR1-ospf-1]silent-interface GigabitEthernet 0/0/0

2、静默所有,放行需要建邻居的接口

  1. [AR1-ospf-1]silent-interface all
  2. [AR1-ospf-1]undo silent-interface GigabitEthernet0/0/0

2.7   影响OSPF邻居建立的因素

1、Router-ID必须唯一

(1)相邻路由器的router-id 不能相同,相同不能建立邻居。

(2)同一个区域不相邻设备的router-id可以相同,LSA泛洪有问题

2分别可以和1、3建立邻居 

频繁刷新泛洪LSU报文,路由计算出现问题,产生路由震荡

解释一:收到了与自身设备产生的一样的LSA,会直接产生一条SEQ+1的LSA发布出去,影响路由计算。

解释二:假设 R1  宣告(network)一条路由 10.10.10.0/24,R1  会把这条 LSA(adv=1.1.1.1,type=1, LS ID=1.1.1.1 ,seq=80000001) 发送给 R2 ,R2 收到后会发给他的邻居 R3 ,R3 收到发现通 告者是 1.1.1.1 ,但是自己又没有这个网段,于是会给 R2 发送一个自己的 LSA1  (age=1s , seq=80000002),R2 收到后会与之前 adv=1.1.1.1  的 LSA1  进行比较,选择这条 seq  更大 的 LSA1,然后也会转发给 R1 ,R1  收到后发现自己有这个网段,又会发送一条新的 LSA1    (seq=80000003),会一直出现这样重复的情况,而导致路由动荡。

 实验现象: R2 有时候有路由,有时候没路由,在一段时间后,有一台会自己修改Router ID

(3)不同区域不相邻的设备的router-id相同(前提区域内正常,代表ABR的router ID不一致)

  在计算域间路由的时候由于3类LSA填充的ADV为ABR的Router ID,所以不影响路由计算。

  在计算域外路由的时候,LSA泛洪有问题,会影响路由计算。

2、接口区域ID:相邻的直连接口区域ID必须相同。

3、认证类型:认证类型不一致,认证会失败,会导致ospf邻居建立不起来。

4、掩码一致(MA网络中)

   (1) MA网路中掩码必须一致,因为 MA 网络中所有路由器共用一个网段,只有一个 2类LSA来描述当前的网络拓扑和网络号,所以当掩码不一致时,无法通过一个2类LSA描述不同的掩码。

     R2的一类LSA的TransNet描述的LS ID是10.0.234.3,而10.0.234.3附带的设备是R2和R3。即使可以建立邻居,虽然R2可以收到10.0.234.4这条2类LSA,但是R2自身的1类LSA的拓扑信息中并没有描述10.0.234.4这个信息,描述的是10.0.234.3这个DR,通过这个2类LSA描述的SPF节点中没有R4,从而与R4和R5断开连接,学不到彼此的路由。所以掩码和网段必须一致 

   (2) P2P网络中掩码之所以可以不一致是因为 P2P中有1类LSA 的 stub 类型来描述每一个网络的掩码信息,并且在PPP链路中 NCP 阶段,两台路由器会互推自己的 IP地址,并且以 32 位主机路由的方式加入自己的路由表,所以P2P网络中建立邻居不需要掩码一致。

    注意:如果底层为MA网络,通过命令修改成P2P网络,两个设备可以建立邻居,但是不通,因为在封装二层的时候还是需要MAC地址,ARP依然会请求mac,ARP为广播报文,两者不在一个网段,ARP请求不到对方MAC,封装二层失败,导致不通。

5、hello和dead一致,两台设备配置hello/dead时间不一致,会导致ospf邻居建立失败

6、silent-interface静默端口:在端口上配置静默端口命令,端口对于报文,不收不发,没有报文的交流,自然也就无法建立ospf邻居关系。

7、MTU值一样:

(1)如果slave接口MTU<master接口MTU,那么从路由器的邻居状态将卡在exstart,主路由器中的邻居状态将卡在exstart:

R1:Router ID=10.1.1.1,MTU=1500,R2:Router ID=10.2.2.2,MTU=1600

两者互相发送不含摘要的DD(I=1,M=1,MS=1)报文,由于R2接口MTU大于R1接口MTU,R1收到R2的DD会丢弃,没人和自己竞选,选举不出主从来,一直发空DD报文,卡在Exstart状态;R2收到R1的DD报文会比较Router ID,比较结果自己是Master,等待slave发送含有摘要的DD报文,但没人发,R2还会发选举主从的DD报文,所以也卡在Exstart状态。

(2)如果slave接口MTU>master接口MTU,那么从路由器的邻居状态将卡在exchange,主路由器的邻居状态将卡在exstart:

R1:Router ID=10.1.1.1,MTU=1600,R2:Router ID=10.2.2.2,MTU=1500

R1收到R2的DD可以处理,比较出自己是从,会主动发Seq为R2含有摘要的DD报文,进入Exchange状态;R2收到R1的DD不会处理,没人和自己竞选,选举不出主从来,一直发空DD报文,卡在Exstart状态。

8、区域类型:stub-stub,nssa-nssa,普通-普通。

9、网络类型:MA-MA,P2P-P2P

10、DR优先级:在MA网络中,DR优先级为0不参与DR选举,会卡在2-Way状态。

FAQ:查看邻居建立失败的原因:

display ospf error

查看最近down掉的邻居的信息:

display ospf 1 peer last-nbr-down 

11、版本一致 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/755056
推荐阅读
  

闽ICP备14008679号