OSPF的几个简要要点
- OSPF是一个自治系统AS内的内部网关协议(IGP)
- OSPF基于链路状态。
- OSPF通过LSDB数据库计算得到OSPF路由表
OSPF如何建立邻居关系
使用Hello报文建立邻居关系
-
OSPF协议直接封装在IP 报文中,协议号89,说明IPV4和OSPF相辅相成。OSPF是一种运行在IPv4上的路由协议(OSPFv2 依赖于IPv4的网络环境)
-
IP 头 OSPF头 OSPF报文
-
OSPF 头部字段包含的8 个字段
-
-
version:2
-
message type
- 1 代表 hello
- 2 代表 DBD
- 3 代表LSR
- 4 代表LSU
- 5 代表LSACK
-
packet leg:描述OSPF包长度
-
router id:描述router id
-
area id:接口所属的区域
-
checksum:校验和
-
auth type:0 代表null;1代表明文;2代表md5
-
auth data:认证信息
-
-
hello packet:
-
-
network mask:接口掩码
-
hello interval :P2P broadcast 默认10s;P2MP,NBM默认30s
-
router priority:优先级,用于broadcast,NBMA型链路选举DR,BDR,默认为1,取值范围0-255
-
dead interval:默认为hello间隔的4倍
-
DR:该链路DR接口的IP 地址
-
BDR:该链路上BDR接口的IP地址
-
option:E bit位:=1代表能交换5类LSA; N bit 位:=0代表不能交换7类LSA
-
任何情况下要满足的建立邻居关系的条件:
- router id 不能冲突:主从选举;
- area id 必须相同
- auth type 要一致
- auth data 要匹配
- hello interv 要一致
- dead interval 要一致
- E bit N bit 要一致
特定场景下,对其他参数的要求:
- P2P 链路不要求地址在同一网段,不要求掩码一样(站在ospf协议的角度)
- broadcast NBMA 要求地址必须在同一个网段,掩码必须相同
- P2MP 默认要求地址在同一个网段,默认要求掩码一致(可以通过命令忽略)
其他报文对邻居关系的影响:DBD报文中的IP MTU值要一致,默认情况下,华为设备不对DBD IP MTU 值检测;华为设备DBD MTU 默认为0
OSPF 建立邻居状态机:
down:代表还没发现任何存在的邻居
init:收到邻居的hello包,但hello包中没有发现自己的router id 你发现了邻居,但不代表邻居已经发现你
two-way:收到邻居hello报文,并且从hello中发现自己的router id
two-way之后,drother之间就只到two-way状态,不会进行LSDB同步。其他情况会继续进行LSDB的同步,进入exstart状态,开始发送DBD报文。
exstart:主从选举,实现可靠的DBD同步。
exstart发送的DBD报文只做主从选举,而不会携带任何LSDB中LSA的头部信息。并各自表达自身是初次发送DBD,后续还希望继续发送DBD,并自身是MASTER,随机生成DBD序列号,进行主从选举。彼此交换DBD报文后,根据router id的大小完成主从选举。
exchange:slave路由器开始发送携带自身LSDB中LSA的头部信息的DBD
1.1.1.1 I = 1 M= 1 MS = 1 SEQ = X
2.2.2.2 I = 1 M = 1 MS = 1 SEQ = Y
slave 1.1.1.1 I = 0 M =1 MS =0 SEQ= Y
master 2.2.2.2 I = 0 M =1 MS = 1 SEQ = Y+1(确认)
slave 1.1.1.1 I = 0 M =1 MS = 0 SEQ = Y+1
master 2.2.2.2 I = 0 M =1 MS = 1 SEQ = Y+1+1(确认)
slave 1.1.1.1 I = 0 M = 0 MS =0 SEQ = Y+2
master 2.2.2.2 I = 0 M =0 MS =1 SEQ=Y+3
slave 1.1.1.1 I = 0 M = 0 MS =0 SEQ = Y+3
slave总是用master的序列号向master发送DD报文,master将slave的序列号加1 向slave发送DD报文,实现DD报文的隐式确认。why?
因为DD报文携带自身LSDB中所有LSA的头部信息,信息较多,一一确认比较麻烦,消耗设备资源,影响邻居收敛的时间,所以采用相对简单的隐式确认
exchange完成后,邻居根据LSA头部信息和自身LSDB的头部信息作比较。进行LSDB的同步。
同步的规则:交换彼此没有的LSA以及新的LSA,替换老旧的LSA,实现邻居LSDB的一致性
为了实现同步,对LSA 的数据结构做出定义要能实现如下两个功能
- 如何实现唯一的区分一条LSA
- 如何实现LSA的新旧判断
而这些功能就是LSA的头部信息(摘要信息),DBD报文携带的就是LSA的头部信息,exstart状态下不携带LSA头部信息
LSA通过6个参数标识自身和新旧程度:
- LSA 类型
- Link state ID
- adv router 谁产生这条LSA
三个参数相同则认为是同一条LSA,如果都有这条LSA,则需要进一步进行新旧判断,用新的同步旧的
那么怎么判断呢?需要三个参数:
- LSA seq 越大越新
- LSA checksum seq相同,校验和越大越新
- LSA age 校验和相同,则判断lsa age是否等于3600s,如果等于,则认为最新。用于删除一条lsa。如果不等于,则判断差值,大于900s则lsa age小的最新,小于900s则认为相同的LSA
通过DBD中携带的LSA头部信息,完成LSDB的差异比较,向邻居发送LSR,请求自身需要的LSA
为什么要设计DD报文呢?
实现按需同步,提高收敛速度。
OSPF 采用三次握手建立邻居,可靠性的体现。
至此,我们已经讨论了OSPF 邻居关系的建立,LSDB的同步。
那么OSPF还要讨论哪些内容呢?
- 邻居关系的建立
- LSDB同步
- LSA泛洪更新机制
- 链路类型
- LSA类型
- 区域类型
- 认证机制
- 选路机制
- 放环机制
链路就是路由器之间的连接(物理链路,逻辑链路)
状态就是链路属性的变化
链路属性:链路上的邻居,链路上的接口地址,链路上的开销,链路的网络类型
把描述链路状态的信息称为LSA
LSA头部的作用
- 标识不同的LSA
- 判断LSA的新旧,新的要替换旧的
LSA类型
- LSA-1 Router LSA 区域直连拓扑
- LSA-2 Network LSA
- LSA-3 Network Summary LSA
- LSA-4 ASBR Summary LSA
- LSA-5 AS External LSA
- LSA-7 NSSA LSA