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就是相同的。
  • 相关阅读:
    golang 数据结构 优先队列(堆)
    leetcode刷题笔记5210题 球会落何处
    leetcode刷题笔记5638题 吃苹果的最大数目
    leetcode刷题笔记5637题 判断字符串的两半是否相似
    剑指 Offer 28. 对称的二叉树
    剑指 Offer 27. 二叉树的镜像
    剑指 Offer 26. 树的子结构
    剑指 Offer 25. 合并两个排序的链表
    剑指 Offer 24. 反转链表
    剑指 Offer 22. 链表中倒数第k个节点
  • 原文地址:https://www.cnblogs.com/liujunjun/p/13345336.html
Copyright © 2011-2022 走看看