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头部 (序列号+1 ,隐式确认机制 )
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 (LA 老化时间)
1、比较序列号越大越新
2、seq相同,比较checksum,越大越新
3、checksum相同,则判断lsa age 是否等于3600s,如果等于3600s,则认为最新,用于删除这条lsa.
4、lsa age 如果都不等于3600s,则判断lsa age的差值,大于900S(15分钟),则lsa age 小的最新,
同DBD报文中携带的LSA的头部信息,完成LSDB的差异比较,向邻居发送LSR,请求自身需要的LSA ;
小于900s(15分钟)则认为收到的是相同的lsa.可以不做更新。
为什么要设计DD报文呢?
实现按需同步,提高收敛速度。
exchange进入loading 状态,发送LSR,LSU,LSAck完成LSA的交换。
full状态,LSDB同步一致。
OSPF邻居建立的可靠性主要体现在:3次握手,DBD报文的隐式确认,LSA的显示确认,报文重传机制(默认5秒后重传)。
LSA老化机制:
LSA每隔半小时周期更新,谁产生谁负责周期更新,SEQ + 1 ,checksum重新算,ls age置0,lsa age 到达3600s还没刷新,自己删除老化的lsa。
链路状态变化触发更新,SEQ —+ 1,checksum重新算,ls age 置0,
LSA SEQ
OSPF使用的是顺序序列号,不是循环的,范围是0x80000000到0x7FFFFFFF.
第一个8是负的,第一个LSA的序列号是0x80000001,然后累加到0,在从0到0x7FFFFFFF.
如果真的到了0x7FFFFFFF,就发送一个AGE标记为60MIN的LSA,通告出去,邻居收到后会把这个LSA从DATABASE里删除,
然后序列号又会从0x80000001开始.
0x80000001化成二进制1000,0000,0000,0000,0000,0000,0000,0001
0x7FFFFFFF化成二进制0111,1111,1111,1111,1111,1111,1111,1111
序列号使用过程:
首先:1000,0000,0000,0000,0000,0000,0000,0001
其次:1111,1111,1111,1111,1111,1111,1111,1111
再次:0000,0000,0000,0000,0000,0000,0000,0000
最后:0111,1111,1111,1111,1111,1111,1111,1111
一目了然,第一位的1和0分别代表负和正.也就是可以有2的31次方再乘2个序列号,足够大了.
OSPF 1类LSA (router)
作用:
用于描述自己本身哪些链路启用了OSPF,以及这些链路的状态:地址/掩码/cost;
特点:
1.每个OSPF路由器都会产生1个;
2.该类型LSA,只能在一个区域内部传输
3.该类型LSA区域内传输时,是没有任何变化的;
[AR1-GigabitEthernet0/0/0]dis ospf lsdb router 1.1.1.1
OSPF Process 1 with Router ID 1.1.1.1
Area: 0.0.0.0
Link State Database
Type : Router type-1(LSA类型)
Ls id : 1.1.1.1 ls id的取值和type相关,type1的取路由器的router id
Adv rtr : 1.1.1.1 router-id
Ls age : 534
Len : 60
Options : E
seq# : 80000013
chksum : 0xb340
Link count: 3
* Link ID: 2.2.2.2 邻居的router-id
Data : 10.1.1.1 与邻居相连的接口IP
Link Type: P-2-P 描述p2p/p2mp链路上的邻居,描述的是拓扑信息
Metric : 1 到邻居的ospf开销
* Link ID: 10.1.1.0
Data : 255.255.255.0
Link Type: StubNet
Metric : 1
Priority : Low
* Link ID: 1.1.1.1 直连网络号
Data : 255.255.255.255 直连网络的子网掩码
Link Type: StubNet 描述自身直连的网络号,描述直连的路由信息
Metric : 0 到直连网络的ospf开销
Priority : Medium
* Link ID: 10.1.1.2 伪节点的router-id,借用DR在该链路的接口IP充当伪节点的router-id
Data : 10.1.1.1 与伪节点相连的接口IP
Link Type: TransNet 描述Broadcast/NBMA链路上的邻居,描述的是拓扑信息
Metric : 1 到伪节点的开销
凡是p2p链路一定有一个跟它对应的1类LSA,
凡是TransNet一定有一个跟它对应的2类LSA,
凡是Attached Router 一定有一个跟它对应的1类LSA。
Broadcast/NBMA链路的网络号由2类LSA进行维护,为了避免路由不精确,要求广播型链路接口掩码要一致,
即该链路各接口属于同一个网段
Broadcast/NBMA链路 DBD、LSR通过单播发送,如果地址不在同一个网段,导致单播报文发送失败,无法建立邻居。
所有Broadcast和NBMA必须同一个网段/掩码必须一致
OSPF 报文发送形式:
@点到点P2P类型:当链路层协议是PPP、HDLC时,缺省情况下,OSPF认为网络类型是P2P。
在该类型的网络中,以组播形式(224.0.0.5)发送协议报文(Hello报文、DD报文、LSR报文、LSU报文、LSAck报文)。
@点到多点P2MP类型(Point-to-Multipoint):没有一种链路层协议会被缺省的认为是Point-to-Multipoint 类型。
点到多点必须是由其他的网络类型强制更改的。常用做法是将非全连通的NBMA改为点到多点的网终;
在该类型的网络中以组播形式(224.0.0.5)发送Hello报文,以单播形式发送其他协议报文bD报支、~LSR报文、LSU报文、LSAck报文)。
@NBMA类型(Non-broadcast multiple access):当链路层协议是ATM时,缺省情况下,OSPF认为网络类型是NBMA。
在该类型的网络中,以单播形式发送协议报文(Hello报文、DD报文、LSR报文、LSU报文、LSAck报文)。
@广播类型(Broadcast):当链路层协议是Ethernet、FDDI时,缺省情况下,OSPF认为网络类型是Broadcast。
在该类型的网络中,通常以组播形式发送Hello报文、LSU报文和LSAck报文。其中,224.0.0.5的组播地址为OSPF路由器的预留IP组播地址;
224.0.0.6的组播地址为OSPF DR的预留IP组播地址。以单播形式发送DD报文和LSR报文。
OSPF 2类LSA(Network):
作用:
由 DR 产生,用于告知该网段中有哪些邻居路由器,描述本网段的链路状态
特点:
1.只能由 DR 产生;
2.该类型LSA,只能在一个区域内部传输
<AR1>dis ospf lsdb network 10.1.1.2
OSPF Process 1 with Router ID 1.1.1.1
Area: 0.0.0.0
Link State Database
Type : Network type-2(LSA类型)
Ls id : 10.1.1.2 DR的接口IP地址(伪节点)
Adv rtr : 2.2.2.2 DR的router-id
Ls age : 2
Len : 32
Options : E
seq# : 80000014
chksum : 0xe73d
Net mask : 255.255.255.0
Priority : Low
Attached Router 2.2.2.2
Attached Router 1.1.1.1