zoukankan      html  css  js  c++  java
  • 路由协议OSPF学习笔记2

    1、OSPF的邻居

    邻接关系的建立都是靠Hello包来完成的,hello包是每经过一个hello-interval发送一次,但是在NBMA网络中,路由器每经过poll interval发送一次给down的邻居(在非广播的网络中是不会给down的邻居发送hello的)

    OSPF邻居的有限状态机:

    1、down:初始状态,没有收到来自邻居的hello包,在NBMA网络poll interval时间发送一次hello给邻居。
    2、attempt:只用于NBMA网络,邻居有效。(收到邻居的hello)
    3、init:(收到了来自邻居的hello)标识着自身邻居表创立完成。
    42-way:(在邻居的hello包中看见了自己的router id)多路访问网络选取DR/BDR才能往下进行,其他网络无条件往下继续。标识着邻居的邻居表建立完成。
    5、exstart:(协商主从后才能往下进行)router id大的为Master,确定DBD的序列号。主先发DBD,从后发DBD。
    6、exchange:交换DBD,也向邻居发送LSR来请求新的LSA。DBD交换完。
    7、loading:发送LSR请求最新的LSA,收到新的LSA,对比LSA的序列号(如果LSDB相同,往下)
    8、full:完全邻接。同步完成计算最短路径,加载路由表。
    
    
    导致邻接关系建立不起来的可能原因:
    1、卡在down,网络类型与二层网络类型条件不匹配、有ACL阻挡、hello和dead时间不一致、区域ID不一致、认证错误、特殊区域类型不一致、RID相同。
    2、卡在2-way,多路访问网络不能选举DR/BDR,即priority都为0.
    3、卡在exstart,链路两端MTU设置不同,二层MTU,三层MTU。可以用ip ospf mtu=ignore忽略
    4、卡在exchange ,LSA格式不兼容。

    2、建立一个邻接关系

    在邻接关系建立过程中OSPF需要使用3种类型的数据包:LSR/LSU/DBD
    DBD数据包非常重要,它携带了源路由器LSDB中的所有LSA的描述信息(头部)。这些信息可以让路由器判定
    LSDB中LSA是否最新,是否完整。
    DBD数据包有3个重要位:I(initial)位、M(more)位、MS(Master/slave)位、M(more)位、MS(Master/slave)
    I位:置1说明发送的是第一个DBD包。
    M位:置1说明发送的不是最后一个DBD包。
    M/S位:置1说明源路由器为主,0为从。
    
    更新数据包传送的所有LSA必须单独进行确认,确认后从 链路状态重传列表 删除它们。
    
    显示确认:回送发送一个LSAck来确认收到那个LSA包。
    隐式确认:回送包含那个LSA拷贝信息的更新数据包。
    
    主路由器控制着数据库的同步过程。
    由于从路由器必须确认每个收到的DBD数据包,因此从路由器总是最先得知同步完成。

    1、R1首先有效,发送hello给R2。由于没有任何邻居,所以邻居列表为空,
    DR/BDR为0.0.0.0
    2、R2收到R1的hello后,将R1置为init,并发hello给R1,邻居列表加上R1的Router id,并且DR/BDR为自己接口地址。
    3、R1收到R2 hello 看到自己Router id,于是2-way,然后到ExStart,R1发空的DBD,序列号为X,I=1,M=1,MS=1,声明自己为主。
    4、R2收到DBD后将R1置为Exstart,响应一个DBD,序列号为Y,R2的Router id 更高,它把MS=1,声明自己为主。
    5、主从协商完,R1将R2置为Exchange,发送给DBD给R2,序号为Y。MS=0,M=1,I=0
    6、R2收到了这个DBD后,将R1置Exchange,发DBD给R1,序列号为Y+1.这个DBD包含了lin state summary list中的LSA头部。
    7、R1收到后,返回一个序列号相同的DBD,直至R2发出最后一个DBD,M=08、Exchange状态完成,但是R1请求列表中还有LSR,所以进入loading
    9、R2收到最后一个DBD后,将R1置为Full,因为R2请求列表为空了。
    10、R1发送LSR,R2发送LSU,过程直到R1请求列表为空,R1把R2也转换到Full

    3、OSPF LSA泛洪

    泛洪需要采用2种数据包,LSU和LSAck
    每个LSU和LSAck都可以包含多个LSA,LSA的发送是可靠的,所以必须对每个LSA进行确认,分:
    显示确认和隐式确认。
    router发送一个LSA时,会把这个LSA拷贝放进链路状态重传列表。
    每隔rxmtintervla时间重传一次,直到收到ACK
    延时确认,多个LSA通告可以用一个LSAck确认。
    广播链路上来自多个router的LSA可以通过一个组播LSAck确认。
    直接确认,立即发送并且单播确认。
    两种情况产生:
    1 收到重复的LSA,2 LSA老化时间达到最大生存时间。
    序列号,当Max sequence number时候,源路由器扩散这个提前老化LSA,重新在泛洪一个initial sequence number包
    校验和,校验除Age字段的整个包。
    LSDB中的LSA每5分钟校验一次。
    老化时间(0-3600s)当一台路由器想把LSA删除,就会设置LSA最大生存时间。
    只有源路由器才能将LSA老化。
    
    收到相同的LSA如何判断哪个是最新的?
    1、先比序列号, 序列号大的为新。
    2、序列号相同,比校验和,有最大的无符号校验和的LSA新
    3、校验和相同,比老化时间,LSA有最大生存时间的老化时间它就是最新的LSA。
    4、如果LSA老化时间的差别多于15m(MaxAgeDiff),那拥有较小老化时间的LSA是最新
    5、如果还无法区分,那么LSA就是相同的。
  • 相关阅读:
    android学习日记28--Android中常用设计模式总结
    android学习日记27--Dialog使用及其设计模式
    android学习日记26--AIDL之进程间的通信
    android学习日记25--ANR和Hander消息机制
    android学习日记24--Android 菜单开发
    android学习日记23--Android XML解析
    android学习日记22--Animation动画简介
    android学习日记21--消息提示之Toast和Notification
    编写高质量JS代码中
    博客建站的几点思考
  • 原文地址:https://www.cnblogs.com/liujunjun/p/13345336.html
Copyright © 2011-2022 走看看