OSPF详解(5种包和状态机)

1.OSPF的数据包(5种)

OSPF详解(5种包和状态机)_第1张图片
Hello :发现建立并周期保护邻居关系
DBD :数据库描述包——进行主从关系的选举,最重要的作用是发送LSDB目录
LSR :链路状态请求——对收到邻接发来的LSDB目录中,对于本地未知的LSA进行请求
LSU :链路状态更新——对收到邻接发来的LSR,携带LSA给邻接
LSack :对DBD/LSR/LSU进行确认

2.OSPF的状态机

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 :转发——邻接关系建立的标志

3.实验抓包分析

OSPF详解(5种包和状态机)_第2张图片

3.1 Hello 数据报文(发现建立并周期保护邻居关系)

OSPF详解(5种包和状态机)_第3张图片

(1)OSPF的头部信息(OSPF Header)

OSPF详解(5种包和状态机)_第4张图片
(2)OSPF协议报文头部字段,每种OSPF报文都包含。

字段 作用
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包中内容分析

OSPF详解(5种包和状态机)_第5张图片

作用
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)任何情况下要满足的建立邻居关系的条件

  1. router id 不能冲突
  2. area id 必须一样(必须在一个同区域)
  3. auth type 要一致
  4. auth data 要匹配
  5. hello interval 要一致
  6. dead interval 要一致
  7. E bit ,N bit 要一致

(5)特殊场景下对其他参数的要求

  1. P2P链路不要求地址在同一个网段,不要求掩码一致。
  2. broadcast,NBMA 要求地址必须在同一个网段,掩码必须一致。
  3. P2MP 要求地址必须在同一个网段,默认情况下要求掩码一致,但可以通过命令忽略对掩码的检测

(6)其他报文对邻居关系的影响

DBD报文中IP MTU值要一致,默认情况下华为设备不对BDB报文的IP MTU值做检测,华为设备DBD报文的IP MTU 默认为0,思科设备默认设置为接口IP MTU的大小。当设备接收到DBD报文时,会检测DBD报文中的IP MTU值是否小于自身接口的IP MTU,如果小则接收并处理,如果大则丢弃。

(7)华为设备的DBD报文中的IP MTU值:
OSPF详解(5种包和状态机)_第6张图片

若cisco和华为设备互联可以直接建立邻居关系。(原因是因为cisco的IP MTU等于1500,而华为默认不对DBD报文的IP MTU进行检测,并且值为0)

3.2 DBD(进行主从关系的选举,最重要的作用是发送LSDB目录)

(1)Src:10.1.1.1 Dst:10.1.1.2 (R1给R2发送初次发送DBD报文)
OSPF详解(5种包和状态机)_第7张图片
(2)Src:10.1.1.2 Dst:10.1.1.1 (R2给R1发送初次发送DBD报文)

OSPF详解(5种包和状态机)_第8张图片
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路由器的序列号来进行确认。

OSPF详解(5种包和状态机)_第9张图片

(4)master路由器收到salve路由器发送过来的携带LSA的DBD报文后,通过对自己的序列号加1来对salve路由器进行确认。(如图salve序列号为239,master序列号为240)

OSPF详解(5种包和状态机)_第10张图片

(5)当DBD报文交互完成后,最终salve路由器会再发一个没有携带LSA头部信息的DBD包来对master进行隐式确认。

OSPF详解(5种包和状态机)_第11张图片

(6)问题:为什么要设计DD报文呢?

原因:实现按需同步,提高收敛速度

(7)问题:为什么要采用隐式确认?

原因:因为DBD报文携带自身LSDB中所以LSA的头部信息,信息比较多,一 一进行确认处理起来比较繁琐,消耗设备资源,影响邻居收敛的时间,所以采用相对简单的隐式确认机制。

exchange完成后,邻居根据DBD报文的头部信息和自身的LSDB的头部信息做比较,进行LSDB的同步。

(8)同步规则:交换彼此没有的LSA以及新的LSA替换老旧的LSA,实现邻居LSDB的一致性。

为了实现同步,对LSA的数据结构做出定义要能实现如下功能:

  1. 如何实现唯一的区分一条LSA。
  2. 如何实现LSA的新旧判断。

而这些功能就是LSA的头部信息(摘要信息),DBD报文携带的正是LSA的头部信息,exstart状态下DBD不携带LSA头部信息。

(9)LSA通过6个参数来标识自身和新旧程度。

OSPF详解(5种包和状态机)_第12张图片

例:首先在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

OSPF详解(5种包和状态机)_第13张图片

当在R1上取下重发布后,R2上的这条5类LSA老化时间达到3600后删除。

[R1-ospf-1]undo import-route static

OSPF详解(5种包和状态机)_第14张图片
最终5类LSA被删除。

OSPF详解(5种包和状态机)_第15张图片

exchange 进入loading状态,发送LSR,LSU,LSAck完成LSDB的同步。

3.3 LSR:对收到邻接发来的LSDB目录中,对于本地未知的LSA进行请求

OSPF详解(5种包和状态机)_第16张图片

当R1和R2收到对方发来的DD报文后,就自己本地未知的LSA进行请求,发送LSR给邻接R2,如抓包结果所示,R1请求了两条1类LSA。

3.4 LSU:对收到邻接发来的LSR,携带LSA给邻接

OSPF详解(5种包和状态机)_第17张图片
之后应答邻接的LSR,让LSU携带LSA给邻接。

OSPF详解(5种包和状态机)_第18张图片

上图所示,R2发送了两个LSU。查看对应序列号得知发生了变化,第一次有两条link,第二次有3条link,则进行了触发更新。

OSPF详解(5种包和状态机)_第19张图片

3.5 LSAck:对DBD/LSR/LSU进行确认

OSPF详解(5种包和状态机)_第20张图片

ack是对LSU里面的LSA进行确认。而不是读LSU包进行确认。若LSU里面携带两条LSA,他就会直接发送一个LSAck,里面直接携带这两个LSA的头部信息,一起进行确认。

补充说明:

DD报文的隐性确认是序列号直接的确认。而LSAck的确认是显式确认。就相当于一个是收到消息回复1来确认。而另一个确认是我对你说的话你在给我复述一遍,我就确保你知道了。所以ack的确认更加可靠。

DD报文用隐式的简单确认的原因是DD报文里的都是摘要信息,信息量大,逐一去进行确认,比较繁琐,消耗资源大,并且收敛速度过慢。我们之间就进行一下简单的确认。而ack确认用LSA的头部进行显式确认的原因是通过DD报文,我们大体路由信息基本都有了,只需要按需进行同步,相对的数量也会少,所以用ack进行确认。对设备性能的开销不会很大,并且更可靠。

你可能感兴趣的:(路由交换)