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就是相同的。