OSPF 概念
使用Hello报文建立邻居关系,接口如果有Sub辅助地址,始终由主地址发送hello报文,目的组播地址 224.0.0.5
OSPF协议直接封装在IP报文中,协议号89,证明IPV4和OSPF协议直接存在相辅相成的关系。OSPF是一种运行在IPV4(网络层)之上的路由协议。
OSPF Header报文字段,每种OSPF报文包含
1、version v2 :描述ospf协议版本
2、message type :描述ospf报文类型,1 hello , 2 DBD ,3 LSR 4, LSU 5,LSACK
3、packet leg : 描述ospf报文长度
4、router id :描述设备的router id
5、area id : 接口所属的ospf区域
6、checksum :校验和
7、auth type :0 null(空) ,1 明文 ,2 md5
8、auth data : 认证信息
OSPF Hello packet 报文字段
network mask :接口掩码
hello interval :hello报文发送间隔,P2P ,broadcast 默认10s,P2MP,NBNA默认30s
router priority :接口优先级,用在broadcast,NBMA型链路选举DR,BDR,默认为1,取值范围0-255
dead interval :邻居失效时间,默认为hello间隔4倍
DR :该链路上DR接口的IP地址,P2P,P2MP 该字段为0.0.0.0
BDR :该链路上的BDR接口的IP地址,P2P,P2MP 该字段为0.0.0.0
option :N bit = 0 代表不能交换7类LSA , E bit = 1 代表能交换5类LSA
任何情况下要满足的建立邻居关系的条件
1、router id 不能冲突 (因为邻居建立过程中有一个主从关系的选举,router ID大的,被选举为DR,如果router ID相同,那么连2-way状态都到不了)
2、area id 必须相同
3、认证类型要一致
4、认证数据要匹配
5、hello interval 要一致
6、dead interval 要一致
7、E bit ,N bit 要一致
**
## 特点场景下对其他参数的要求
1、P2P链路不要求地址在同一网段,不要求掩码一致
2、broadcast、NBMA 要求地址必须在同一个网段、掩码必须一致
3、P2MP 默认要求地址必须在同一网段,默认情况下要求掩码一致,但可以通过命令忽略对掩码的检测
其他报文对邻居关系的影响:DBD报文中IP MTU值要一致,默认情况下华为设备不对DBD报文的IP MTU值做检测,华为设备的DBD 报文的IP MTU 默认为0,思科设备默认位置为接口IP MTU 的大小;
当设备收到DBD报文时,会检测DBD报文中IP MTU 值是否小于自身接口的IP MTU,如果小则接受并处理,如果大则丢弃
ospf mtu-enable 作用(接口敲)
1、对接受的DBD报文做IP MTU的检测
2、对自身发送的DBD报文,IP MTU值设置为自身接口的MTU值
OSPF的报文
down 代表还没发现任何邻居的存在(为接受到hello报文)
init 收到了邻居的hello包,但hello报文中没发现自己的router ID,此时你发现了邻居的存在,但并不代表邻居已经发现了你,也称为one-way(一次握手)
two-way 收到了邻居的hello包,并在hello报文中发现了自己的router ID
PS:采用3次握手建立邻居关系,是OSPF协议可靠性的体现
two-way 之后,drother之间就只到two-way状态,不会进行LSDB的同步,其他情况下的邻居会继续进行LSDB的同步,进入到exstart状态,开始发送DBD报文。
exstart 发送DBD报文只做主从选举,而不会携带任何LSDB中的LSA的头部信息;并各自生成表达自身是初次发送DBD报文,后续还希望继续发送DBD,并自身是master,
随机生成DBD报文序列号,进行主从选举。彼此交换该DBD报文后,根据router id的大小完成主从选举,router id 大的成为master,router id 小的成为slave.
DBD报文字段 I = 1 表示第一次发送DBD报文,M = 1 表示DBD报文还没发完,后续还会发送DBD报文,MS = 1 希望成为master
1.1.1.1 I = 1 M = 1 MS = 1 SEQ = X
2.2.2.2 I = 1 M = 1 MS = 1 SEQ = Y
主从选举完毕后,进入exchange 状态,slave路由器开始发送携带自身LSDB中的LSA头部信息的DBD报文,并使用exstart状态master路由器的序列号作为该DBD报文的序列号。
slave 1.1.1.1 I = 0 M = 1/0 MS = 0 SEQ = Y LSA头部
(M 中1代表LSDB中LSA的头部信息还没发送完,后续还需要继续通过DBD报文发送LSA头部信息,0 代表LSDB中所有LSA的头部已经发送完毕)
master 2.2.2.2 I = 0 M = 1/0 MS = 1 SEQ = Y+1 LSA头部
slave 1.1.1.1 I = 0 M = 1 MS = 0 SEQ = Y+1 LSA头部
master 2.2.2.2 I = 0 M = 1 MS = 1 SEQ = Y+2 LSA头部
slave 1.1.1.1 I = 0 M = 0 MS = 0 SEQ = Y+2 LSA头部
master 2.2.2.2 I = 0 M = 0 MS = 1 SEQ = Y+3 LSA头部
slave 1.1.1.1 I = 0 M = 0 MS = 0 SEQ = Y+3
slave 总是用master的序列号向master发送DD报文;master将slave的序列号加1,向slave发送DD报文。
为什么要采用隐式确认?
原因DD报文携带自身LSDB中所有的LSA头部信息,信息比较多,一一确定处理起来比较繁琐,消耗设备资源;
影响邻居收敛的时间,所以采用相对简单的隐式确认机制。
exchange完成后,邻居根据DBD报文的头部信息和自身LSDB的头部信息作比较,进行LSDB的同步。
同步的规则:交换彼此没有的LSA以及新的LSA替换老旧的LSA,实现邻居LSDB的一致性。
为了实现同步,对LSA的数据结构做出定义要能实现如下功能:
1、如何实现唯一的区分一条LSA
2、如何实现LSA的新的判断
而这些功能就是LSA的头部信息(摘要信息),DBD报文携带的正是LSA的头部信息;exstart状态下DBD不携带LSA头部。
LSA通过6个参数来标识自身的新旧程度
如何实现唯一区分一条LSA呢?
ls type
link state ID
adv router
用于区分一条LSA,3个参数相同则认为是同一条LSA,如果都有这条LSA,则需要进一步进行新旧判断,用新的去同步旧的。
如何实现LSA的新旧判断呢?通过3个参数来判断新旧。
sequence number
checksum
ls age
1、比较序列号越大越新
2、seq相同,比较checksum,越打越新
3、checksum相同,则判断lsa age 是否等于3600s,如果等于3600s,则认为最新;用于删除这条lsa.
4、lsa age 如果都不等于3600s,则判断lsa age的差值,大于900S,则lsa age 小的最新,小于900s则认为是相同的lsa.
同DBD报文中携带的LSA的头部信息,完成LSDB的差异比较,向邻居发送LSR,请求自身需要的LSA .
为什么要设计DD报文呢?实现按需同步,提高收敛速度。
exchange进入loading 状态,发送LSR,LSU,LSAck完成LSA的交换。
exstart 做主从选举,为实现可靠的DBD同步做准备。
exchange