路由协议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)标识着自身邻居表创立完成。 4、2-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=0。 8、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就是相同的。