OSPF详解二之OSPF邻接关系剖析

OSPF邻接关系建立过程剖析

在OSPF网络中,为了交换路由信息,邻居设备之间首先要建立邻接关系,邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不同的概念。

邻居关系:OSPF设备启动后,会通过OSPF接口向外发送Hello报文,收到Hello报文的OSPF设备会检查报文中所定义的参数,如果双方一致就会形成邻居关系,两端设备互为邻居。

邻接关系:形成邻居关系后,如果两端设备成功交换DD报文和LSA,才建立邻接关系。

OSPF状态机

OSPF共有8种状态机,分别是:Down、Attempt、Init、2-way、Exstart、Exchange、Loading、Full。

1、Down:邻居会话的初始阶段,表明没有在邻居失效时间间隔内收到来自邻居路由器的Hello数据包。

2、Attempt:该状态仅发生在NBMA网络中,表明对端在邻居失效时间间隔(dead
interval)超时后仍然没有回复Hello报文。此时路由器依然每发送轮询Hello报文的时间间隔(poll
interval)向对端发送Hello报文。

3、Init:收到Hello报文后状态为Init。

4、2-way:收到的Hello报文中包含有自己的Router
ID,则状态为2-way;如果不需要形成邻接关系则邻居状态机就停留在此状态,否则进入Exstart状态。

5、Exstart:开始协商主从关系,并确定DD的序列号,此时状态为Exstart。

6、Exchange:主从关系协商完毕后开始交换DD报文,此时状态为Exchange。

7、Loading:DD报文交换完成即Exchange done,此时状态为Loading。

8、Full:LSR重传列表为空,此时状态为Full。

OSPF邻接关系建立过程图解:

注:此图为网图,谅解博主懒病犯了。哈哈。。

邻接关系建立过程详解(Broadcast类型):【对比着图更容易理解哦】

1、在Down状态下路由器发出第一个hello包。当R2收到一个Hello包,并且在这个hello包中看不到自已的ID,则将自已和邻居的关系转到Init状态。Init是一个one way 状态,当R1和R2都认识对方后就会进入2-Way状态。

2、当收到包含自己router-id的hello包时,将自己和邻居的状态置为2-way。在Two Way时,将选举DB/BDR(MA网络)。进入Two way状态后(即从Exstart开始),表示这两个路由器已经建立了邻居关系了。但最终能不能邻接关系要看最后是不是FULL。

3、Exstart:Exstart交互的是firstDBD,主要是用于选举主从关系(router-id大的为主),确定接下来DD报文的序列号(用主的序列号),为lsdb同步做准备。

进入Exstart状态后,R1和R2分别向对方发送firstDBD报文,并将I位置为1,代表是第一个DBD报文;M位置为1,代表不是最后一个DBD报文;MS位置为1,最初会自己认为自己是主。当收到对方的first DBD报文后,通过router-id选举出主从,由主来决定seq的值。

根据上图中能看到第二个DBD报文中包含seq值,第一个报文的seq值为n+1,以此类推。当主发送以此DBD报文,从必须给予一次回复,这是由于OSPF是基于IP的,没有确认机制,需要seq做隐式确认,保证了可靠性。

4、Exchange: Exchange是通过DBD交换LSA的头部信息。

5、Loading:等待收到M位为0的DD报文时,才进入loading。

进入Loading之后,R1开始向R2发送LS request报文,请求那些在Exchange状态下通过DD报文发现的,而且在本地LSDB中没有的链路状态信息。R2收到LS Request报文之后,向R1发送LS Update报文,在LS Update报文中,包含了那些被请求的链路状态的详细信息。R1收到LS Update报文之后,R1向R2发送LS Ack报文,确保信息传输的可靠性。

6、FULL:lsdb同步完成,邻接关系的完整建立。

OSPF报文类型

OSPF共有5类报文,分别为Hello、DD、LSR、LSU、LSAck,以下为博主实验抓包现像剖析内容及作用。

Hello报文:建立和维持邻居关系

DBD报文:分为first DBD报文和DBD报文。

1、First DBD报文不携带LSA头部,通过firstDBD确认主从关系,主的作用只是为了控制序列号的同步。主从选举方式为Router-ID高的将成为主。

2、DBD报文只携带LAS的头部信息,没有携带LAS的具体信息。承载完整LAS是LASUpdate包。

LS Resquest报文:是不携带LAS头部的,只通过(公告ID,LSA L类型,linkID)来请求具体的条目。

LS Update报文:含有真正LSA完整信息的,用来回应LSRequest。

LSAck报文:对LSU的确认

若邻居关系建立不起来,出现的疑难杂症

若邻居关系无法建立,当然从建立邻居关系的过程分析,到2-way状态就可以证明邻居关系已经建立,中间一般出现问题会停留在init状态。Hello报文可能影响的因素有如下几点:

1、路由器ID

2、接口的区域ID

3、接口的地址掩码(MA网络):Broadcast、NBMA、P2MP都会检查掩码

4、接口的认证:认证后面分出来细讲,请关注

5、接口的hello时间和dead时间:dead时间是hello时间的4倍

6、option字段:E位和N位,E位置为1,代表普通区域,;N位置为1,代表NSSA区域

根据hello报文解析:

从上面图中可以看到箭头位置都会影响到邻居关系的建立,由于邻居关系的建立中只会涉及到hello报文,所以基本上可能影响到的都概括了。

若出现邻接关系建立不了的原因呢?

1、MTU值不一致

华为默认是不检查MTU的,在DD报文中查看MTU值为0。抓包可以看到,箭头标识:

从抓包可以看到接口MTU值为0,但接口MTU值默认为1500,这里设为0,代表不检测MTU。从ensp中查看路由器接口可以看到,截图如下:

若华为设备需要OSPF邻接关系建立检查MTU值,怎么办?

在接口下开启ospf mtu-enable即可,注意两端接口都需开启哦。

开启之后,再抓包查看:

发现DD报文中接口MTU值为1500了。

若开启接口MTU检查后,MTU值不一样的话OSPF邻接关系将无法建立,卡在exstart状态下。因为OSPF没有定义任何分片方式,只能依赖IP包分片。如果没规定MTU一致性的话,发送发的数据包(通常是LSU)一旦过大,超过接收方最大能接收的数据包大小,就会在接收方这里丢包。

2、NBMA类型下没有写broadcast;(现实环境中帧中继的环境已经少之又少了)

大家可以在评论中讨论一个问题,在2-way状态下,到底是先选DR还是先选BDR。TCP/ip卷中说的是先选BDR,华为文档中说的是先选DR,做实验看出来的结果不太明显。跪求给位大佬给小弟解疑。

下一章 OSPF详解三之OSPF LSA详解

时间: 2024-10-08 19:35:20

OSPF详解二之OSPF邻接关系剖析的相关文章

OSPF详解之三:OSPF LSA详解

OSPF LSA详解 OSPF V2版本中常用的主要有6类LSA,分别是Router-LSA.Network-LSA.Network-summary-LSA.ASBR-summary-LSA.AS-External-LSA.NSSA-LSA,接下来我将一步一步为大家解析. Type 1:Router-LSA 每个设备都会产生,描述了设备的链路状态和开销,在所属的区域内传播. 谈到1类LSA,大家必然会想到它的链路类型,链路类型分为4类:P2P.Stub.Transit.Vritual link.

UINavigationController详解二(转)页面切换和SegmentedController

原文出自:http://blog.csdn.net/totogo2010/article/details/7682433,非常感谢. 1.RootView 跳到SecondView 首先我们需要新一个View.新建SecondView,按住Command键然后按N,弹出新建页面,我们新建SecondView 2.为Button 添加点击事件,实现跳转 在RootViewController.xib中和RootViewController.h文件建立连接 在RootViewController.m

Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)

[Android布局学习系列]   1.Android 布局学习之——Layout(布局)详解一   2.Android 布局学习之——Layout(布局)详解二(常见布局和布局参数)   3.Android 布局学习之——LinearLayout的layout_weight属性   4.Android 布局学习之——LinearLayout属性baselineAligned的作用及baseline    Layout Parameters(布局参数): 在XML文件中,我们经常看到类似与lay

CSS3中的弹性流体盒模型技术详解(二)

在上一篇文章<CSS3中的弹性流体盒模型技术详解(一)>里,我给大家列出了,从css1到css3各版本中盒子模型的基本元素.本篇我会把余下的属性进行详细讲解. box-pack 作用:用来规定子元素在盒子内的水平空间分配方式 box-pack 语法:box-pack: start | end | center | justify; start 对于正常方向的框,首个子元素的左边缘吸附在盒子的左边框显示 对于相反方向的框,最后子元素的右边缘吸附在盒子的右边框显示 end 对于正常方向的框,最后子

php学习之道:WSDL详解(二)

3.定义服务使用的逻辑消息 当服务的操作被调用时,服务被定义为消息交换.在wsdl文档中,这些消息被定义message元素.这些消息由称之为part元素的部分组成. 一个服务的操作,通过指定逻辑消息的方式来定义.当操作被调用时,逻辑消息被交换.(也就是说,逻辑消息代表了服务的操作)这些逻辑消息,将在网络上传输的数据定义为xml文档.他包含了所有的参数,这些参数是方法调用的一部分.(也就是说,逻辑消息里的参数,是操作对应方法的参数集合) 消息和参数列表:每一个被服务暴露的操作能且仅能有一个输入消息

LinearLayout详解二:从其父类View说起

这个View类说来就话长了,但我们又不得不说,要说呢,就得说的彻底,要让大家看得一清二楚,明明白白.所以我们就从源代码角度来看一个view是如何被加载的吧. 如果大家不知道怎么下载android的源代码,或者说懒得去下载(因为源代码确实比较大,大概有10G)的话,教大家几个取巧的办法: 1.直接在google中输入"android view.java"即可.这种方法成功率非常高,一般android的比较重要的类都能搜到. 2.给大家提供一个人家用于放源码的的git:[email pro

jquery validate 详解二

原文:http://blog.sina.com.cn/s/blog_608475eb0100h3h2.html 这里只是第二篇,前面的内容请参阅上一篇 五.常用方法及注意问题 1.用其他方式替代默认的SUBMIT 1 $().ready(function() { 2 $("#signupForm").validate({ 3 submitHandler:function(form){ 4 alert("submitted"); 5 form.submit(); 6

cocos2dx 启动过程详解二:内存管理和回调

在上一篇的第二部分中,我们有一句代码待解释的: // Draw the Scene void CCDirector::drawScene(void) { -- //tick before glClear: issue #533 if (! m_bPaused) //暂停 { m_pScheduler->update(m_fDeltaTime);   //待会会解释这里的内容 } -- } 这里是一个update函数,经常会写像this->schedule(schedule_selector(X

PopUpWindow使用详解(二)——进阶及答疑

相关文章:1.<PopUpWindow使用详解(一)——基本使用>2.<PopUpWindow使用详解(二)——进阶及答疑> 上篇为大家基本讲述了有关PopupWindow的基本使用,但还有几个相关函数还没有讲述,我们这篇将着重看看这几个函数的用法并结合源码来讲讲具体原因,最后是有关PopupWindow在使用时的疑问,给大家讲解一下. 一.常用函数讲解 这段将会给大家讲下下面几个函数的意义及用法,使用上篇那个带背景的例子为基础. [java] view plain copy pu