OSPF邻接关系创建过程剖析网络
在OSPF网络中,为了交换路由信息,邻居设备之间首先要创建邻接关系,邻居(Neighbors)关系和邻接(Adjacencies)关系是两个不一样的概念。ide
邻居关系:OSPF设备启动后,会经过OSPF接口向外发送Hello报文,收到Hello报文的OSPF设备会检查报文中所定义的参数,若是双方一致就会造成邻居关系,两端设备互为邻居。ui
邻接关系:造成邻居关系后,若是两端设备成功交换DD报文和LSA,才创建邻接关系。spa
OSPF状态机3d
OSPF共有8种状态机,分别是:Down、Attempt、Init、2-way、Exstart、Exchange、Loading、Full。router
一、Down:邻居会话的初始阶段,代表没有在邻居失效时间间隔内收到来自邻居路由器的Hello数据包。blog
二、Attempt:该状态仅发生在NBMA网络中,代表对端在邻居失效时间间隔(dead interval)超时后仍然没有回复Hello报文。此时路由器依然每发送轮询Hello报文的时间间隔(poll interval)向对端发送Hello报文。接口
三、Init:收到Hello报文后状态为Init。ci
四、2-way:收到的Hello报文中包含有本身的Router ID,则状态为2-way;若是不须要造成邻接关系则邻居状态机就停留在此状态,不然进入Exstart状态。路由
五、Exstart:开始协商主从关系,并肯定DD的序列号,此时状态为Exstart。
六、Exchange:主从关系协商完毕后开始交换DD报文,此时状态为Exchange。
七、Loading:DD报文交换完成即Exchange done,此时状态为Loading。
八、Full:LSR重传列表为空,此时状态为Full。
OSPF邻接关系创建过程图解:
注:此图为网图,谅解博主懒病犯了。哈哈。。
邻接关系创建过程详解(Broadcast类型):【对比着图更容易理解哦】
一、在Down状态下路由器发出第一个hello包。当R2收到一个Hello包,而且在这个hello包中看不到自已的ID,则将自已和邻居的关系转到Init状态。Init是一个one way 状态,当R1和R2都认识对方后就会进入2-Way状态。
二、当收到包含本身router-id的hello包时,将本身和邻居的状态置为2-way。在Two Way时,将选举DB/BDR(MA网络)。进入Two way状态后(即从Exstart开始),表示这两个路由器已经创建了邻居关系了。但最终能不能邻接关系要看最后是否是FULL。
三、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作隐式确认,保证了可靠性。
四、Exchange: Exchange是经过DBD交换LSA的头部信息。
五、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报文,确保信息传输的可靠性。
六、FULL:lsdb同步完成,邻接关系的完整创建。
OSPF报文类型:
OSPF共有5类报文,分别为Hello、DD、LSR、LSU、LSAck,如下为博主实验抓包现像剖析内容及做用。
Hello报文:创建和维持邻居关系
DBD报文:分为first DBD报文和DBD报文。
一、First DBD报文不携带LSA头部,经过firstDBD确认主从关系,主的做用只是为了控制序列号的同步。主从选举方式为Router-ID高的将成为主。
二、DBD报文只携带LAS的头部信息,没有携带LAS的具体信息。承载完整LAS是LASUpdate包。
LS Resquest报文:是不携带LAS头部的,只经过(公告ID,LSA L类型,linkID)来请求具体的条目。
LS Update报文:含有真正LSA完整信息的,用来回应LSRequest。
LSAck报文:对LSU的确认
路由更新
当邻接关系创建完成后,后面发生路由更新,路由器之间的处理流程:
注释:在广播型网络中,DRothers只和DR、BDR造成邻接关系,所以更新数据包将发送到组播地址224.0.0.6,相应的DR路由器也将以组播方式发送包含LSA的更新包到网络上全部与之创建关系的路由器,此时的组播地址为224.0.0.5。接着,全部路由将从全部其余的接口上泛洪扩散LSA。虽然BDR路由器也使用组播方式收到和记录了来自DRothers路由器的LSA通告,可是它不会再重复泛洪扩散或者确认这些LSA,除非DR路由器失效了它才会这么作。
在NBMA网络上存在一样的DR/BDR的功能特性,只是LSA是以单播方式从DRothers路由器发送给DR和BDR的,而且DR路由器也是以单播方式发送该LSA的拷贝到全部与之创建邻接关系的邻居路由器的。
第一步:
更新路由器以组播方式(224.0.0.6)向DR、BDR发送更新数据包
第二步:
DR经过组播方式(224.0.0.5)向每个与之创建邻接关系的路由器发送包含LSA的更新包
第三步:
全部路由将从全部其余的接口上泛洪扩散LSA
若邻居关系创建不起来,出现的疑难杂症
若邻居关系没法创建,固然从创建邻居关系的过程分析,到2-way状态就能够证实邻居关系已经创建,中间通常出现问题会停留在init状态。Hello报文可能影响的因素有以下几点:
一、路由器ID
二、接口的区域ID
三、接口的地址掩码(MA网络):Broadcast、NBMA、P2MP都会检查掩码
四、接口的认证:认证后面分出来细讲,请关注
五、接口的hello时间和dead时间:dead时间是hello时间的4倍
六、option字段:E位和N位,E位置为1,表明普通区域,;N位置为1,表明NSSA区域
根据hello报文解析:
从上面图中能够看到箭头位置都会影响到邻居关系的创建,因为邻居关系的创建中只会涉及到hello报文,因此基本上可能影响到的都归纳了。
若出现邻接关系创建不了的缘由呢?
一、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)一旦过大,超过接收方最大能接收的数据包大小,就会在接收方这里丢包。
二、NBMA类型下没有写broadcast;(现实环境中帧中继的环境已经少之又少了)
下一章 OSPF详解三之OSPF LSA详解