Hello :发现建立并周期保护邻居关系
DBD :数据库描述包——进行主从关系的选举,最重要的作用是发送LSDB目录
LSR :链路状态请求——对收到邻接发来的LSDB目录中,对于本地未知的LSA进行请求
LSU :链路状态更新——对收到邻接发来的LSR,携带LSA给邻接
LSack :对DBD/LSR/LSU进行确认
Down :一旦收发hello包,直接进入下一状态
Int :初始化——收到的hello包中含有本地的RID,进入下一状态
2way :邻居关系建立的标志
条件匹配 :双向通信——点到点直接进入下一状态;MA网络进行DR/BDR选举(30s)。DR,BDR进入下一状态,非DR,BDR保持邻居关系,hello包周期保活即可。
exstart :预启动——使用类似hello 的DBD包进行主从关系的选举,RID大为主,优先进入下一状态
exchange :准交换——使用真正的DBD包进行LSDB目录的交互
loading :加载——使用LSR/LSU/LSack获取未知信息
full :转发——邻接关系建立的标志
(1)OSPF的头部信息(OSPF Header)
字段 | 作用 |
---|---|
version | 描述OSPF协议版本 |
message type | 描述OSPF报文信息,1 hello ,2 DBD, 3 LSR,4 LSU,5 LSAck |
packet length | 描述OSPF报文长度 |
router id | 描述设备的router id |
area id | 描述所属的OSPF区域 |
checksum | 校验和 |
anth type | 0 null,1 明文,2 md5 |
auth date | 认证信息 |
(3)Hello包中内容分析
作用 | |
---|---|
network mask | 接口掩码 |
hello interval | hello报文发送间隔,P2P,broadcast默认10s,P2MP,NBMA默认30s |
router priority | 接口优先级,用在Broadcast,NBMA型链路选举DR,BDR,默认为1,取值范围0-255 |
dead interval | 邻居失效时间,默认为hello time的4倍 |
DR | 该链路上DR接口的IP地址,P2P,P2MP该字段为0.0.0.0 |
BDR | 该链路上BDR接口的IP地址,P2P,P2MP该字段为0.0.0.0 |
option | E bit=1 代表能交换5类LSA, N bit=0 代表不能交换7类LSA |
(4)任何情况下要满足的建立邻居关系的条件
(5)特殊场景下对其他参数的要求
(6)其他报文对邻居关系的影响
DBD报文中IP MTU值要一致,默认情况下华为设备不对BDB报文的IP MTU值做检测,华为设备DBD报文的IP MTU 默认为0,思科设备默认设置为接口IP MTU的大小。当设备接收到DBD报文时,会检测DBD报文中的IP MTU值是否小于自身接口的IP MTU,如果小则接收并处理,如果大则丢弃。
若cisco和华为设备互联可以直接建立邻居关系。(原因是因为cisco的IP MTU等于1500,而华为默认不对DBD报文的IP MTU进行检测,并且值为0)
(1)Src:10.1.1.1 Dst:10.1.1.2 (R1给R2发送初次发送DBD报文)
(2)Src:10.1.1.2 Dst:10.1.1.1 (R2给R1发送初次发送DBD报文)
exstart发送的DBD报文只做主从关系的选举,而不会携带任何LSDB中LSA的头部信息。并各自表达自身的初次发送DBD报文,后续还希望继续发送DBD,并以自身为Master,随机生成DBD报文序列号,进行主从选举,彼此交换该DBD报文后,根据router id 的大小完成主从关系的选举,router id 大的为master,router id 小的为salve。
(3)exchange状态,salve路由器开始发送携带自身LSDB中LSA头部信息的DBD报文,并使用exstart状态下的master路由器的序列号来进行确认。
(4)master路由器收到salve路由器发送过来的携带LSA的DBD报文后,通过对自己的序列号加1来对salve路由器进行确认。(如图salve序列号为239,master序列号为240)
(5)当DBD报文交互完成后,最终salve路由器会再发一个没有携带LSA头部信息的DBD包来对master进行隐式确认。
(6)问题:为什么要设计DD报文呢?
原因:实现按需同步,提高收敛速度
(7)问题:为什么要采用隐式确认?
原因:因为DBD报文携带自身LSDB中所以LSA的头部信息,信息比较多,一 一进行确认处理起来比较繁琐,消耗设备资源,影响邻居收敛的时间,所以采用相对简单的隐式确认机制。
exchange完成后,邻居根据DBD报文的头部信息和自身的LSDB的头部信息做比较,进行LSDB的同步。
(8)同步规则:交换彼此没有的LSA以及新的LSA替换老旧的LSA,实现邻居LSDB的一致性。
为了实现同步,对LSA的数据结构做出定义要能实现如下功能:
而这些功能就是LSA的头部信息(摘要信息),DBD报文携带的正是LSA的头部信息,exstart状态下DBD不携带LSA头部信息。
(9)LSA通过6个参数来标识自身和新旧程度。
例:首先在R1上写一条静态,再重发布静态,R1上就产生一条5类LSA,然后传到R2上。
[R1]ip route-static 192.168.2.1 24 NULL 0
[R1]ospf 1
[R1-ospf-1]import-route static
当在R1上取下重发布后,R2上的这条5类LSA老化时间达到3600后删除。
[R1-ospf-1]undo import-route static
exchange 进入loading状态,发送LSR,LSU,LSAck完成LSDB的同步。
当R1和R2收到对方发来的DD报文后,就自己本地未知的LSA进行请求,发送LSR给邻接R2,如抓包结果所示,R1请求了两条1类LSA。
上图所示,R2发送了两个LSU。查看对应序列号得知发生了变化,第一次有两条link,第二次有3条link,则进行了触发更新。
ack是对LSU里面的LSA进行确认。而不是读LSU包进行确认。若LSU里面携带两条LSA,他就会直接发送一个LSAck,里面直接携带这两个LSA的头部信息,一起进行确认。
补充说明:
DD报文的隐性确认是序列号直接的确认。而LSAck的确认是显式确认。就相当于一个是收到消息回复1来确认。而另一个确认是我对你说的话你在给我复述一遍,我就确保你知道了。所以ack的确认更加可靠。
DD报文用隐式的简单确认的原因是DD报文里的都是摘要信息,信息量大,逐一去进行确认,比较繁琐,消耗资源大,并且收敛速度过慢。我们之间就进行一下简单的确认。而ack确认用LSA的头部进行显式确认的原因是通过DD报文,我们大体路由信息基本都有了,只需要按需进行同步,相对的数量也会少,所以用ack进行确认。对设备性能的开销不会很大,并且更可靠。