简介
开放式最短路径优先(OSPF)协议是一种链路状态路由协议,是一种开放式的路由协议,支持多厂商间使用。OSPF使用了区域概念,管理员可以把路由器划分到不同区域,对路由更新流量进行控制。
基本信息
- OSPFv2适用于IPv4网络中的OSPF协议
- OSPFv3适用于IPv6网络中的OSPF协议
- OSPF的IP协议号为89
- 使用组播224.0.0.5和224.0.0.6进行通信
- OSPF使用最短路径优先算法(SPF),也叫Dijkstra算法
- 管理距离(AD)为110
- 具有邻居的概念
- OSPF的度量值(cost开销值)的参考标准是:带宽
- 更新方式:
- 触发更新:拓扑发生变化,路由条目更新的时候,立即更新
- 周期更新:每30分钟更新一次,60分钟没有收到LSA更新,将该LSA从LSDB中删除。
- OSPF更新的是LSA
LSDB中的LSA每过30分钟会主动发起更新。
如果到达最大老化时间3600秒仍然没有收到更新,该LSA将从LSDB中删除。
OSPF数据库和表
- 邻接数据库:它构建了邻居表
- 该表对于每个路由器都是唯一的
- 保存建立双向通信的所有邻居路由器
- 通过show ip ospf neighbor 命令查看邻居表
- 链路状态数据库(LSDB):它构建了拓扑表
- 保存网络中其他路由器信息
- 保存网络中的拓扑
- 相同区域内的路由器有相同的链路状态数据库(LSDB)
- 通过show ip ospf database 命令查看邻居表
- 转发数据库:它构建了路由表
- 通过SPF算法获得到达目标网络的最优路由放入路由表
- 每台路由器中的路由表是唯一的
- 通过show ip route ospf命令查看ospf的路由条目
OSPF数据包
数据包类型 | 作用 |
---|---|
Hello | 用于发现建立和维持邻居关系 |
DBD(数据库描述数据包) | 用于数据库同步 |
LSR(链路状态请求数据包) | 用于一台路由器向来一台路由器请求链路状态同步 |
LSU(链路状态更新数据包) | 用于回复LSR请求的数据包 |
LSAck(链路状态确认数据包) | 用于确认其他数据包 |
Hello数据包内容
Hello头部
字段 | 内容 |
---|---|
版本 | OSPF的版本(v2或者v3) |
类型 | 1表示Hello数据包;2表示DBD数据包;3表示LSR数据包;4表示LSU数据包;5表示LSAck数据包 |
路由器 ID(Router-ID) | 用于唯一表示一个路由器 |
区域 ID(Area ID) | OSPF有区域概念,Area ID表示始发区域编号 |
Hello数据包
字段 | 内容 |
---|---|
网络掩码 | 与发送接口关联的子网掩码 |
Hello间隔 | 发送Hello包的间隔时间。多接入网络中Hello间隔时间默认为10s |
Dead间隔 | 默认情况下Dead间隔时间为Hello间隔时间的4倍 |
路由器优先级 | 用于选取DR和BDR,所有OSPF路由器的默认优先级为1,可以手动修改0-255,0代表不参与选举 |
指定路由器(DR) | DR的路由器ID(Router-ID) |
备用指定路由器(BDR) | BDR的路由器ID(Router-ID) |
邻居列表 | 邻居路由器的路由器ID(Router-ID) |
路由器 ID(Router-ID)
Router-ID获取的方式:
- 手动配置Router-ID
- 如果没有配置Router-ID,将选取任意环回接口的最高IPv4地址作为Router-ID
- 如果没有配置环回接口,将选取所有物理接口最高IPv4地址作为Router-ID
邻居建立问题
- Hello间隔时间和Dead间隔时间要一致
- 网络类型要一致
- 直连设备的路由器ID(Router-ID)不能一样
- OSPF版本保持一致
- 直连接口在同一网段
- 直连接口在同一区域(Area)
- MTU保持一致
- 认证问题
OSPF 状态
-
Down:没有收到Hello包为Down状态,并且发送Hello包
-
Init:收到对方发送的hello包进入init状态
-
2-Way:收到对方回复的hello进入2-way状态,建立邻居关系(多路访问链路中选举DR,BDR)
-
Exstart:相互发送DBD包序列号选举主从关系,主设备先发送DBD包(Router-ID大的为主设备)
-
Exchange:相互交换DBD信息,使用DBD包的序列号确认收到DBD包(如果DBD和自己的一致则直接进入Full状态,不一致进入loading状态)
-
Loading:通过LSR,LSU,LSAck获取更多路由信息,然后过渡到Full状态
-
Full:建立邻接关系
注意:
2-Way状态是建立邻居关系
Full状态是建立邻接关系
OSPF路由器角色
- 指定路由器(DR)
- 备用指定路由器(BDR)
- 其他路由器(DROTHER)
DR和BDR的选举:
- 优先级高的成为DR。
- 优先级一样看Router-ID,Router-ID 大的为DR
在多接入网络中,OSPF选举DR和BDR来管理邻接数量和链路状态通告(LSA)。
DROTHER使用组播224.0.0.6向DR和BDR发送LSA。
DR负责收集和发送LSA给其他路由器,使用组播224.0.0.5发送LSA。
OSPF中的DR和BDR不会实行抢占
在网络中刚开始就选举了R3为DR,R2为BDR
当R4加入网络过后R3和R2的角色将不会因为一个更高Router-ID的路由器加入而发生改变。
如果R3发生故障,R2将成为DR,R4将成为BDR
注意:在点对点网络中是不会选举DR和BDR的
OSPF区域概念
为了使OSPF更加高效且课扩展,OSPF使用多区域,支持分层路由。同一个区域内的路由器共享相同的LSDB信息。
-
单区域OSPF:所有的路由器都在同一个区域内。最好使用区域 0
-
多区域OSPF:以多区域、层级式的方式来实施OSPF。所有区域必须连接到骨干区域(区域 0)。
多区域OSPF
通过使用多区域OSPF可以将一个大型路由域划分为更小的路由域。每个区域之间的路由器都具有到达不同网络的路由,但是不同区域内的LSDB是不一样的,每个区域只需管理好自己区域内的LSDB,而无需管理别的区域内的LSDB。例如,区域内的拓扑出现变化,只有区域内的路由器重新计算数据库。相对于单区域OSPF,多区域OSPF大大减少了计算量。
注意:其他区域中的路由器也会接收到拓扑变化的更新,但是这些路由器只会更新自己的路由表,而不会重新执行SPF计算。
多区域OSPF的优势:
- 缩小了路由表:可以对区域间的网络地址进行汇总。默认情况下不启用汇总功能。(EIGRP和RIPv2默认开启自动汇总)
- 减少链路状态更新的负载:每个区域只对自己区域内的链路状态进行更新,不会将所有区域的链路状态进行汇总更新(单区域OSPF将对整个区域内的链路状态进行更新,无论区域有多大)。
- 降低了SPF计算频率:单区域OSPF中的拓扑变化只会影响一个区域内部。
区域51中的拓扑发生变化,只会在区域51内进行LSA泛洪,SPF计算也只在区域51里面进行。
区域1 和区域0只更新路由表。
多区域OSPF路由器角色
- 区域边界路由器(ABR):
顾名思义区域边界路由器就是在OSPF中连接不同区域的路由器。这类路由器必须为相连的每个区域维护单独的LSDB,并且能在区域间路由。
ABR是区域的送出点,也就是说从本区域想去往另一个区域只能从ABR通过。因此ABR可以对路由条目进行汇总,从而减小路由表。 - 自制系统边界路由器(ASBR):
该路由器用于连接外部网络,外部网络不是OSPF的一部分。
例如,该路由器的一个接口连接了OSPF,另一个接口连接了EIGRP。
ASBR可以使用“路由重分布”的技术将外部网络信息导入OSPF。
例如,在ASBR上使用“路由重分布”可以将EIGRP的路由条目导入OSPF,也可以将OSPF的路由器条目导入EIGRP中。
如下图所示:
R1为ABR同时也是ASBR
R2为ABR
多区域OSPF LSA类型
LSA类型 | 描述 |
---|---|
第1类 | 路由器LSA——区域内LSA (区域内传递的LSA) |
第2类 | 网络LSA——谁是DR |
第3类 | 汇总LSA——区域间LSA (其他区域传递的LSA) |
第4类 | 汇总LSA——谁是ASBR |
第5类 | 自制系统外部LSA(从外部网络传递的LSA) |
第6类 | 组播OSPF LSA |
第7类 | 为NSSA定义的LSA |
第8类 、第9类 | 用于承载IPv6的OSPF |
第10类、第11类 | 用于MPLS TE环境 |
- 一个LSU包含一个或多个LSA。
- LSA包含目的网络的路由信息。
特殊区域
- 末节区域(STUB)
- 完全末节区域(totally STUB)
- NSSA区域(非完全末节区域)
- 完全NSSA区域(完全非完全末节区域)