简介
OSPF (开放最短路径优先)协议,使用链路状态而不是距离矢量进行路径选择。 OSPF传播LSA (链路状态通告),而不是路由表更新。因为只交换 LSA而不交换整个路由表,OSPF网络能以较快的方式收敛。
OSPF同一区域中的每台路由器都有相同的链路状态数据库,(一个包含每台路由器可用接口和可达邻居的列表),也就是说,每台路由器会得知邻居的所有条目,然后自行决定最优路径。【EIGRP是会从邻居处得知最优路径】
一些基本概念
区域概念
- 骨干区域或区域0:骨干区域的两个主要要求是,骨干区域必须连接所有其他非骨干区域,且此骨干区域必须总是连续的;不允许分割骨干区域。一般来说,骨干区域中没有终端用户。
- 非骨干区域:此区域的主要功能是连接终端用户 和资源。非骨干区域通常根据功能性或地理位置进行划分。不同非骨干区域之间的流量必须总是经过骨干区域。
在区域内,路由器交换详细的链路状态信息。
从一个区域传输到另一个区域的信息中,仅包含LSDB条目的明细汇总,并不包含源区域的拓扑详情。这些来自另一个区域的汇总LSA会被直接放到路由表中。
(关于LSA后面还有详细说明)
分不同区域的原因
- 减少路由选择的开销
- 加速会聚
- 用单一的网络地区来减弱网络的不稳定性
路由器类型
IR
内部路由器:所有接口都只连接到一个 OSPF区域。 此路由器完全在区域内部。
BR
骨干路由器:至少有一个接口连接到骨干区域。
ABR
区域边界路由器:至少有两个接口分别连接不同区域(包含骨干区域在内)。ABR中包含每个区域的LSDB(拓扑表)信息,为每个区域进行路由计算,且在区域之间通告路由信息。
ASBR
自治系统边界路由器:至少有一个接口连接到一个OSPF区域,且至少有一个接口连接到外部非OSPF区域。(比如外部用的是EIGRP协议)
指定路由器和备份路由器
- 指定路由器一般称为DR,但是报文中的DR字段是指定路由器的接口IP地址(在选举过程中成为DR的接口)
- 备份路由器称为BDR,但是报文中的BDR字段是备份路由器的接口IP地址(在选举过程中成为DR的接口)
在DR和BDR出现之前,每一台路由器和他的邻居之间成为完全网状的OSPF邻接关系,这样5台路由器之间将需要形成10个邻接关系,同时将产生25条LSA。而且在Broadcast即广播多址网络中(比如以太网),还存在自己发出的LSA从邻居的邻居发回来,导致网络上产生很多LSA的拷贝,所以基于这种考虑,产生了DR和BDR
DR的工作:
- 描述这个多路访问网络和该网络上剩下的其他相关路由器
- 管理这个多路访问网络上的flooding过程
- 同时为了冗余性,选取一个BDR作为双备份
注意:
- 只有在广播和非广播的多路访问网络(如以太网和帧中继)的网络分段上才会需要DR/BDR。点到点(串口)不需要
- 每台路由器都仅与DR/BDR建立完全邻接关系,和其他路由器不需要邻接,只向DR/BDR发链路状态信息。(发送给DR的hello包,组播地址224.0.0.6)
三种表
邻居表
hello包维护邻居关系,IP组播周期性发送。
组播地址:224.0.0.5,224.0.0.6(发给指定路由器DR)
邻居要建立邻接才能共享路由更新(点到点链路不需要)
建立了邻接才能进入拓扑表
拓扑表(LSDB)
LSA更新并维护数据库,数据库即拓扑表
路由表
SPF算法构建SPF树,最优路径进入路由表
LSA基本概念
LSA全称链路状态通告,它包含有在OSPF路由器中共享的链路状态和路由信息。
七类LSA
公有的头部
options:指明当前LSA的能力
三元组(索引):
- LS Type
- Link State ID
- Advertising Router
作用:
比较LSA数目的多少,确定双方是否完全一样,是否有差别
LS Age(老化时间);序列号 ;校验和来确定判断新旧
序列号越大越新,每一次LSA泛洪,序列号+1
序列号确定 比较校验和,越大越新
校验和确定比较老化时间,LS Age越小越新
1类LSA(Router LSA)
每台路由器为所属的每个区域生成路由器链路通告。路由器链路通告描述了区域中的路由器链路状态, 只在特定区域中泛洪。
内容:拓扑+路由(即邻居和网段)
传播范围:intra-area(本区域内)不跨越ABR
一些字段:
-
Link State ID:源路由器RID(即路由器本身RID)
-
Advertising Router:通告自己的RID
-
Flags:描述自己的身份
V(Virtual Link endpoint):虚链路端点
E(AS boundary router):ASBR
B(Area border router):ABR
Links:描述自身的拓扑
-
1:Point-to-Point:描述邻居的拓扑
Link ID:邻居路由器的RID
Link Data:始发路由器接口IP地址
Link Type:1 -
2:Transit Network:描述DR接口&DR和自己相连的接口
Link ID:DR接口的IP地址
Link Data:始发路由器接口IP地址
Link Type:2 -
3:Stub network:表示自身的路由
Link ID:网络/子网的IP地址
Link Data:网络/子网的掩码
Link Type:3 -
4:Virtual-Link:
Link ID:邻居路由器的RID
Link Data:邻居的接口IP地址
Link Type:4
2类LSA(Network LSA)
DR为广播型网络生成网络链路通告。网络链路通告中描述了一组连接到特定多路访问网络的路由器。网络链路通告在包含该网络的区城中泛洪。
内容:拓扑+路由。和DR相连的所有网络信息
传播范围:intra-area,不跨越ABR
一些字段:
- Link State ID:DR的接口IP
- Advertising Router:通告DR的RID
- Attached Router:邻居的RID
3类LSA(Summary LSA)
ABR将从一个区域中学习到的信息汇总成汇总链路通告, 并发给另一个区域。汇总并不是默认开启的 。
内容:路由。告知区域内路由器区域外的路由条目(网段)
传播范围:inter-area,跨越ABR
一些字段:
- 头部+掩码+Metric(只有路由信息)
- Link State ID:内部的网段
- Advertising Router:距离最近的ABR的RID
Ad Router 逐跳变,每经过一个ABR都会改变
4类LSA(ASBR summary LSA)
ASBR汇总链路通告负责通知OSPF 域的其余部分,如何到达ASBR。
内容:拓扑。ABR通告如何到达ASBR
传播范围:跨区域
一些字段:
- Link State ID:ASBR的RID
- Advertising Router:距离最近的ABR的RID
Ad Router 逐跳变,每经过一个ABR都会改变
5类LSA(AS External LSA)
自治系统外部链路通告由 ASBR生成, 描述了到达自治系统外部目的网络的路由。
内容:路由
传播范围:跨区域
一些字段:
- Link State ID:外部网段
- Advertising Router:ASBR的RID
- Type:E1,E2
- Tag:重分布的时候通过route-map打tag
只有E和N类型的LSA可以打tag;Ad Router全称不变
6类LSA
组播OSPF应用中 使用的专用LSA。
7类LSA(NSSA external LSA)
内容:路由。在NSSA区域中描述引入的外部路由
区域类型
Stub(末梢)
- 只允许1,2,3号LSA进入
- 过滤5号LSA
- 自动产生默认路由
Totally stub(完全末梢)Cisco独有
- 只允许1,2号LSA进入
- 禁止3,5号LSA
- 自动产生默认路由
NSSA
- 禁止4,5号LSA
- 外部自治系统的路由信息从ASBR以7号LSA形式进入NSSA区域
- 7号LSA从NSSA经过ASBR去往其他区域会转化为5号LSA
- default-information originate产生默认路由
Totally NSSA(Cisco独有)
- 过滤3,5号LSA
- 外部自治系统的路由信息从ASBR以7号LSA形式进入NSSA区域
- 自动产生默认路由
五种路由协议包
OSPF使用5种类型的路由协议包,共享通用的协议头部(OSPF Header)。每个OSPF包被直接封装在IP头部中。OSPF的IP协议号是89。
共享的同一头部
Message Type:指明这个数据包是五种类型中的哪一种
Source OSPF Router:这里是路由器的RID(router-id)
Hello包
作用:
- 发现邻居,维持邻居关系(保活)
- 保证邻居能够双向通信(参数同步)
- 选举DR/BDR
option字段:当前Hello包具有哪些能力(相应位置1)
报文各字段含义:
DBD(数据库描述)包
作用:
- 描述LSDB(拓扑表),使路由器之间可以比对数据库是否同步
- 选举DR/BDR
- 交换数据库的摘要信息
摘要:LSA头部
通过比较LSA头部就可以比较LSA的数目和新旧
报文各字段含义:
-
OSPF Header:通用头部,前面有描述,这里不做赘述
-
OSPF DB Description
- Interface MTU:交换数据的每个包的最大容量,按1500将数据库切片成数据包发送,每个数据包大小为1500
- option:和前面大同小异
- DB Description 置位:
R
MS:置1表示为Master
I,M:组合来保证数据包的顺序00:不是第一个包,后面也没包了 即最后一个包 01:不是第一个包,后面还有 即若干数据包的中间一个包 10:是第一个包,后面没有(说明数据库较小) 11:是第一个,后面还有 即第一个包,(说明数据库被拆分)
- DD Seq:这个包的序号。OSPF基于IP而不是TCP,IP协议不保证有序,这个序列号保证了该协议的可靠
I,M置位和DD Seq,三者确保了数据包的有序性
-
LSA Type(前面有各种类型的具体描述)
LSR(链路状态请求)包
作用:
- 在数据库同步过程中使用。
- 路由器会发送LSR, 请求其OSPF邻居发送本地缺失LSA(三元组确定)的最新版本。(关于三元组,前面有描述)
LSU(链路状态更新)包
作用:
- 泛洪LSA, 以及发送对LSR包的LSA响应。
LSA响应只会发给之前以LSR包形式请求LSA的直连邻居。
- 进行泛洪时,邻居路由器负责把收到的LSA信息(这个信息是在收到的LSR中)重新封装在新的LSU包中。
注意:这个包里放着具体的LSA,不是只有三元组了
LSAck(链路状态确认)包
作用:
- 负责进行可靠的LSA泛洪。(OSPF基于IP,不保证可靠性;如果是基于TCP,TCP的ack就能达到该目的)
- 路由器必须明确确认每个收到的LSA, 可以用 一个LSAck包确认多个LSA。
邻接关系的建立(7种状态)
-
Down:没有给邻居发任何报文,也没有收到任何报文。
写network命令,发hello包(组播形式)
-
Init:当路由器从邻居收到了一个Hello包,但是没有在邻居的Hello包中看到自己的路由器ID时, 它将转为init状态。
在此状态中,路由器将记录所有邻居的路由器ID, 并开始将它们包含在发给邻居的Hello包中。
-
Two-way:邻居收到了一个hello,这个hello中有我的RID,表示邻居已经收到了我的hello报文,说明之前曾交互过hello报文,此时一个双向通信已经建立
如果是多路访问链路,进行DR/BDR的选举
DR/BDR选举规则
a. 比较优先级(接口优先级为0表示放弃选举,默认为1,范围0-255)
b. 优先级相同,比较RID,越大越优先
注意:OSPF为非抢占性,修改优先级后必须重启OSPF进程(clear ip ospf process) -
Exstart:确定谁发DBD。选举主从路由器,并且确认邻接建立的初始序列号。当路由器收到初始的DBD包时, 它把发出这个DBD包的邻居状态转为ExStart
一开始发送DBD包为空,没有任何LSA报头信息,双方宣告自己为主路由器。交互过程中RID高的为主路由器,较低为从路由器,从路由器回复一个MS设置为0的DBD包,该包是第一个携带LSA摘要信息的数据包
MTU不匹配的邻居,会保持在exstart状态(邻居MTU较大), MTU较小的会重复init态到exchange态
-
Exchange:主路由器带动从路由器交互描述整个链路状态的 DBD 报文。
-
Loading:根据交互的DBD 报文可以得知双方需要的LSA 信息,根据自己没有而邻居有的LSA向邻居请求。单播发LSR
-
Full:收到邻居的LSU回复。链路状态请求表为空,双方邻接关系建立完成
邻接关系的建立条件
-
报文头部中匹配的字段
a. 版本一致
V2:IPv4 V3:IPv6
b. RID不能冲突
如果发生冲突,会因为无法选举出主从路由器而停留在Exstart/Exchange状态
c. 一条链路的两端必须在同一个区域
d. 区域类型和认证类型要一致
-
Hello 包中要匹配的字段
a. 掩码一致
b. hello时间的dead time需要一致
失效计时器值。 当此计时器过期时, 路由器将终结邻居关系。 每次路由器从特定邻居收到一个OSPFHello包时, 它都会重置失效计时器值。
c. option中的E位、N位一致
d. NBMA中要对邻居指peer,双方要互指
e. 建立邻居的接口不能是静默接口(silent- interface)
f. Router priority字段
为0:该路由器放弃选举DR/BDR 选举过程必须至少一个DR,网络中至少有一个路由器接口的优先级不为0
-
DBD报文中要匹配的字段
MTU:
如果不匹配,就会停在exstart状态,这个状态双方交互first DBD选择主从,如果开启MTU检测,只有一致才可以选出主从
整个网络路由过程
- 建立邻居邻接关系:OSPF路由器必须与其邻居建立邻接关系之后才能共享信息。OSPF路由器从所有启用OSPF的接口发送Hello包,用来确定这些链路上是否有OSPF邻居。 如果发现了邻居,OSPF路由器会尝试与该邻居建立邻接关系。
- 交换链路状态通告:邻接关系建立后, 路由器交换LSA (链路状态通告)。LSA包含每条直连链路的状态和开销。 路由器将LSA泛洪给邻接的邻居。 接收到LSA的邻接邻居立即将LSA泛洪给其他的直连邻居, 直到区域中的所有路由器都有相同的LSA为止。
- 构建拓扑表:收到LSA之后,OSPF路由器会基千收到的LSA构建LSDB (拓扑表)。此数据库中最终会拥有网络拓扑的所有信息。 对于区域中所有路由器,LSDB中一定都要有相同的信息。
- 执行SPF算法:路由器执行SPF算法。SPF算法构建SPF树。
- 构建拓扑表:路由器把SPF树中的最优路径放入到路由表中, 并基于路由表中的条目作出路由决策。
接口网络类型
- Point-to-point(HDLC/PPP):组播地址224.0.0.5,hello发给所有路由器动态检测邻居,直接邻接(只有两台设备),不要DR/BDR
- Broadcast(Ethernet):有DR,发给DR的组播地址224.0.0.6
- NBMA(FR、ATM等):非广播的多路访问型网络
- Loopback:默认情况下,配置在环回口的任意子网通告为/32的主机路由。ip ospf network point-to-point命令可改为点到点
- Virtual-Link:虚链路
路由认证
-
NULL
-
明文认证
-
密文认证:MD5
-
区域认证:全接口开认证
-
接口认证:
a. 接口配置密钥
b. 接口、区域进程开启认证
c. 虚链路认证(配置在进程虚链路指令后,配置原理同上)