OSPF基础原理

OSPF是一种基于链路状态的路由协议, 它从设计上就保证了无路由环路。 OSPF支持
区域的划分, 区域内部的路由器使用SPF最短路径算法保证了区域内部的无环路。 OSPF还
利用区域间的连接规则保证了区域之间无路由环路。
OSPF支持触发更新, 能够快速检测并通告自治系统内的拓扑变化。
OSPF可以解决网络扩容带来的问题。 当网络上路由器越来越多, 路由信息流量急剧
增长的时候, OSPF可以将每个自治系统划分为多个区域,并限制每个区域的范围。 OSPF
这种分区域的特点, 使得OSPF特别适用于大中型网络。 OSPF可以提供认证功能。 OSPF
路由器之间的报文可以配置成必须经过认证才能进行交换。
T97OF015Y7BY9F1Q.png
OSPF要求每台运行OSPF的路由器都了解整个网络的链路状态信息,这样才能计算出
到达目的地的最优路径。 OSPF的收敛过程由链路状态公告LSA(Link State
Advertisement) 泛洪开始, LSA中包含了路由器已知的接口IP地址、 掩码、 开销和网络
类型等信息。 收到LSA的路由器都可以根据LSA提供的信息建立自己的链路状态数据库
LSDB( Link State Database) , 并在LSDB的基础上使用SPF算法进行运算, 建立起到
达每个网络的最短路径树。 最后, 通过最短路径树得出到达目的网络的最优路由, 并将其
加入到IP路由表中。
OSPF工作步骤:
1、建立邻居
2、互相交换LSA,形成统一的LSDB
3、通过SPF算法计算出最短路径树
4、选择最优路径,生成路由表
GIZ6ET0ZU5FJ6CC6DP01.png
OSPF直接运行在IP协议之上, 使用IP协议号89。
OSPF有五种报文类型, 每种报文都使用相同的OSPF报文头。

  1. Hello报文:最常用的一种报文, 用于发现、 维护邻居关系。 并在广播和
    NBMA(None-Broadcast Multi-Access) 类型的网络中选举指定 路 由 器 DR (
    Designated Router ) 和 备 份 指 定 路 由 器 BDR(Backup Designated Router) 。
  2. DD报文:两台路由器进行LSDB数据库同步时, 用DD报文来描述自己的LSDB。
    DD报文的内容包括LSDB中每一条LSA的头部(LSA的头部可以唯一标识一条LSA) 。 LSA
    头部只占一条LSA的整个数据量的一小部分, 所以, 这样就可以减少路由器之间的协议报
    文流量。
  3. LSR报文:两台路由器互相交换过DD报文之后, 知道对端的路由器有哪些LSA是本
    地LSDB所缺少的, 这时需要发送LSR报文向对方请求缺少的LSA, LSR只包含了所需要的
    LSA的摘要信息。
  4. LSU报文:用来向对端路由器发送所需要的LSA。
  5. LSACK报文: 用来对接收到的LSU报文进行确认。

OSPF状态
建立邻接关系,形成统一的链路状态数据库,是OSPF成功生成路由表的关键部分。
OSPF在建立邻居何邻接关系时,经过了很多状态。
邻居(Neighbor)和邻接(Adjacency)关系建立的过程如下:

  1. Down:这是邻居的初始状态, 表示没有在邻居失效时间间隔内收到来自邻居路由
    器的Hello数据包。
  2. Attempt:此状态只在NBMA网络上存在, 表示没有收到邻居的任何信息, 但是已
    经周期性的向邻居发送报文, 发送间隔为HelloInterval。如果RouterDeadInterval间隔内
    未收到邻居的Hello报文, 则转为Down状态。
  3. Init:在此状态下, 路由器已经从邻居收到了Hello报文, 但是自己不在所收到的
    Hello报文的邻居列表中, 尚未与邻居建立双向通信关系。
  4. 2-Way:在此状态下, 双向通信已经建立, 但是没有与邻居建立邻接关系。 这是
    建立邻接关系以前的最高级状态。
  5. ExStart:这是形成邻接关系的第一个步骤, 邻居状态变成此状态以后, 路由器开始
    向邻居发送DD报文。 主从关系是在此状态下形成的,初始DD序列号也是在此状态下决定
    的。 在此状态下发送的DD报文不包含链路状态描述。
  6. Exchange:此状态下路由器相互发送包含链路状态信息摘要的DD报文, 描述本地
    LSDB的内容。
  7. Loading:相互发送LSR报文请求LSA, 发送LSU报文通告LSA。
  8. Full:路由器的LSDB已经同步。
    最后稳定的状态应该是2-way状态和Full状态。
    FTKBKTO9OB296CJJO5TA4.png
    Router ID是一个32位的值, 它唯一标识了一个自治系统内的路由器, 管理员可以为
    每台运行OSPF的路由器手动配置一个Router ID。 如果未手动指定, 设备会按照以下规则
    自动选举Router ID: 如果设备存在多个逻辑接口地址, 则路由器使用逻辑接口中最大的
    IP地址作为Router ID;如果没有配置逻辑接口, 则路由器使用物理接口的最大IP地址作为
    Router ID。 在为一台运行OSPF的路由器配置新的Router ID后, 可以在路由器上通过重
    置OSPF进程来更新Router ID。 通常建议手动配置Router ID,以防止Router ID因为接口
    地址的变化而改变。
    OSPF的邻居发现过程是基于Hello报文来实现的,Hello报文中的重要字段解释如下:
  9. Network Mask:发送Hello报文的接口的网络掩码。
  10. Hello Interval:发送Hello报文的时间间隔, 单位为秒。
  11. Options:标识发送此报文的OSPF路由器所支持的可选功能。 具体的可选功能已超
    出这里的讨论范围。
  12. Router Priority:发送Hello报文的接口的Router Priority, 用于选举DR和BDR。
  13. Router Dead Interval:失效时间。 如果在此时间内未收到邻居发来的Hello报文,
    则认为邻居失效 ;单位为秒, 通常为四倍Hello Interval。
  14. Designated Router:发送Hello报文的路由器所选举出的DR的IP地址。 如果设置
    为0.0.0.0, 表示未选举DR路由器。
  15. Backup Designated Router:发送Hello报文的路由器所选举出的BDR的IP地址。
    如果设置为0.0.0.0, 表示未选举BDR。
  16. Neighbor:邻居的Router ID列表, 表示本路由器已经从这些邻居收到了合法的
    Hello报文。
    如果路由器发现所接收的合法Hello报文的邻居列表中有自己的Router ID,则认为已
    经和邻居建立了双向连接,表示邻居关系已经建立。验证一个接收到的Hello报文是否合法
    包括:
    1、如果接收端口的网络类型是广播型,点到多点或者NBMA,所接收的Hello报文中
    Network Mask字段必须和接收端口的网络掩码一致,如果接收端口的网络类型为点到
    点类型或者是虚连接,则不检查Network Mask字段;
    2、所接收的Hello报文中Hello Interval字段必须和接收端口的配置一致;
    3、所接收的Hello报文中Router Dead Interval字段必须和接收端口的配置一致;
    4、所接收的Hello报文中Options字段中的E-bit(表示是否接收外部路由信息)必须
    和相关区域的配置一致。
    5、如果启用了认证,认证方式和认证数据也要一致。
    6、区域ID必须要一致
    MR614DLHH_OQMHWLGXD.png
    路由器在建立完成邻居关系之后, 便开始进行数据库同步,具体过程如下:
  17. 邻居状态变为ExStart以后, RTA向RTB发送第一个DD报文, 在这个报文中, DD
    序列号被设置为X(假设) , RTA宣告自己为主路由器。
  18. RTB也向RTA发送第一个DD报文, 在这个报文中, DD序列号被设置为Y(假设)
    。 RTB也宣告自己为主路由器。 由于RTB的Router ID比RTA的大, 所以RTB应当为真
    正的主路由器。
  19. RTA发送一个新的DD报文, 在这个新的报文中包含LSDB的摘要信息, 序列号设置
    为RTB在步骤2里使用的序列号, 因此RTB将邻居状态改变为Exchange。
  20. 邻居状态变为Exchange以后, RTB发送一个新的DD报文, 该报文中包含LSDB的
    描述信息, DD序列号设为Y+1(上次使用的序列号加1) 。
  21. 即使RTA不需要新的DD报文描述自己的LSDB, 但是作为从路由器,RTA需要对主
    路由器RTB发送的每一个DD报文进行确认。 所以,RTA向RTB发送一个内容为空的DD
    报文, 序列号为Y+1。
    发送完最后一个DD报文之后, RTA将邻居状态改变为Loading; RTB收到最后一个DD报
    文之后, 改变状态为Full(假设RTB的LSDB是最新最全的, 不需要向RTA请求更新) 。
    PHMFZK1OTUO_LJEQ_T.png
  22. 邻居状态变为Loading之后, RTA开始向RTB发送LSR报文, 请求那些在Exchange
    状态下通过DD报文发现的, 而且在本地LSDB中没有的链路状态信息。
  23. RTB收到LSR报文之后, 向RTA发送LSU报文, 在LSU报文中, 包含了那些被请求
    的链路状态的详细信息。 RTA收到LSU报文之后,将邻居状态从Loading改变成Full。
  24. RTA向RTB发送LSACK报文, 用于对已接收LSA的确认。
    此时, RTA和RTB之间的邻居状态变成Full, 表示达到完全邻接状态。
    Q9PS9HEMOHBDUWQQJPL6W.png

OSPF网络类型及区域
OSPF定义了四种网络类型, 分别是点到点网络, 广播型网络, NBMA网络和点到多点网
络。
点到点网络是指只把两台路由器直接相连的网络。 一个运行PPP的64K串行线路就是一个点
到点网络的例子。
Z90NH5U7S`IOURTL2.png
广播型网络是指支持两台以上路由器, 并且具有广播能力的网络。 一个含有三台路由器的
以太网就是一个广播型网络的例子。
OSPF可以在不支持广播的多路访问网络上运行,此类网络包括在hubspoke拓扑上运
行的帧中继(FR)和异步传输模式(ATM) 网络, 这些网络的通信依赖于虚电路。 OSPF
定义了两种支持多路访问的网络类型:非广播多路访问网络( NBMA) 和点到多点网络(
Point To MultiPoints) 。

  1. NBMA:在NBMA网络上, OSPF模拟在广播型网络上的操作, 但是每个路由器的邻
    居需要手动配置。 NBMA方式要求网络中的路由器组成全连接。
  2. P2MP:将整个网络看成是一组点到点网络。 对于不能组成全连接的网络应当使用点
    到多点方式, 例如只使用PVC的不完全连接的帧中继网络。
    ILTFO8SY0PK9ROD105AF.png
    每一个含有至少两个路由器的广播型网络和NBMA网络都有一个DR和BDR。DR和BDR
    可以减少邻接关系的数量, 从而减少链路状态信息以及路由信息的交换次数, 这样可以节
    省带宽, 降低对路由器处理能力的压力。一个既不是DR也不是BDR的路由器只与DR和
    BDR形成邻接关系并交换链路状态信息以及路由信息, 这样就大大减少了大型广播型网络
    和NBMA网络中的邻接关系数量。 在没有DR的广播网络上, 邻接关系的数量可以根据公
    式n(n-1)/2计算出, n代表参与OSPF的路由器接口的数量。在本例中, 所有路由器之间有
    6个邻接关系。 当指定了DR后, 所有的路由器都与DR建立起邻接关系, DR成为该广播网
    络上的中心点。BDR在DR发生故障时接管业务, 一个广播网络上所有路由器都必须同BDR
    建立邻接关系。 本例中使用DR和BDR将邻接关系从6减少到了5,RTA和RTB都只需要同
    DR和BDR建立邻接关系, RTA和RTB之间建立的是邻居关系。此例中, 邻接关系数量的减
    少效果并不明显。 但是, 当网络上部署了大量路由器时, 比如100台, 那么情况就大不一
    样了。
    FM5KG_L_A4NNS3.png
    在邻居发现完成之后, 路由器会根据网段类型进行DR选举。 在广播和NBMA网络
    上, 路由器会根据参与选举的每个接口的优先级进行DR选举。优先级取值范围为0-255,
    值越高越优先。 缺省情况下, 接口优先级为1。如果一个接口优先级为0, 那么该接口将不
    会参与DR或者BDR的选举。如果优先级相同时, 则比较Router ID, 值越大越优先被选举
    为DR。为了给DR做备份, 每个广播和NBMA网络上还要选举一个BDR。 BDR也会与网络
    上所有的路由器建立邻接关系。为了维护网络上邻接关系的稳定性, 如果网络中已经存在
    DR和BDR,则新添加进该网络的路由器不会成为DR和BDR, 不管该路由器的Router
    Priority是否最大。 如果当前DR发生故障, 则当前BDR自动成为新的DR, 网络中重新选
    举BDR;如果当前BDR发生故障, 则DR不变,重新选举BDR。 这种选举机制的目的是为
    了保持邻接关系的稳定, 使拓扑结构的改变对邻接关系的影响尽量小。
    AERF41AWGWIWX5HLDOE`M.png
    OSPF支持将一组网段组合在一起, 这样的一个组合称为一个区域。
    划分OSPF区域可以缩小路由器的LSDB规模, 减少网络流量。区域内的详细拓扑信息
    不向其他区域发送, 区域间传递的是抽象的路由信息, 而不是详细的描述拓扑结构的链路
    状态信息。 每个区域都有自己的LSDB, 不同区域的LSDB是不同的。 路由器会为每一个自
    己所连接到的区域维护一个单独的LSDB。 由于详细链路状态信息不会被发布到区域以外,
    因此LSDB的规模大大缩小了。
    Area 0为骨干区域, 为了避免区域间路由环路, 非骨干区域之间不允许直接相互发布
    路由信息。 因此, 每个区域都必须连接到骨干区域。运行在区域之间的路由器叫做区域边
    界路由器ABR(Area Boundary Router) , 它包含所有相连区域的LSDB。 自治系统边界
    路由器ASBR(Autonomous System Boundary Router) 是指和其他AS中的路由器交换
    路由信息的路由器, 这种路由器会向整个AS通告AS外部路由信息。
    在规模较小的企业网络中, 可以把所有的路由器划分到同一个区域中,同一个OSPF区
    域中的路由器中的LSDB是完全一致的。 OSPF区域号可以手动配置, 为了便于将来的网络
    扩展, 推荐将该区域号设置为0, 即骨干区域。
    39FR~H292_481NMY3.png
    OSPF基于接口带宽计算开销, 计算公式为:接口开销=带宽参考值÷带宽。 带宽参考
    值可配置, 缺省为100Mbit/s。 以此, 一个64kbit/s串口的开销为1562, 一个E1接口
    (2.048 Mbit/s) 的开销为48。
    命令bandwidth-reference可以用来调整带宽参考值, 从而可以改变接口开销, 带宽
    参考值越大, 开销越准确。 在支持10Gbit/s速率的情况下,推荐将带宽参考值提高到
    10000Mbit/s来分别为10 Gbit/s、 1 Gbit/s和100Mbit/s的链路提供1、 10和100的开
    销。 注意, 配置带宽参考值时,需要在整个OSPF网络中统一进行调整。另外, 还可以通
    过ospf cost命令来手动为一个接口调整开销, 开销值范围是1~65535, 缺省值为1。
    J0QNVRHCK1QOF4TAGYXR.png

配置单域OSPF
在配置OSPF时, 需要首先使能OSPF进程。
命令ospf [process id]用来使能OSPF, 在该命令中可以配置进程ID。 如果没有配置进程
ID, 则使用1作为缺省进程ID。
命令ospf [process id] [router-id ]既可以使能OSPF进程, 还同时可以用于配
置Router ID。 在该命令中, router-id代表路由器的ID。
命令network用于指定运行OSPF协议的接口, 在该命令中需要指定一个反掩码。 反掩码
中, “0” 表示此位必须严格匹配, “1” 表示该地址可以为任意值。
1、基本配置:发布自己直连网段
[R1]ospf 10 router-id 1.1.1.1
[R1-ospf-10]area 0
[R1-ospf-10-area-0.0.0.0]network 192.168.1.0 0.0.0.255
[R1-ospf-10-area-0.0.0.0]network 10.1.1.1 0.0.0.0
命令display ospf peer可以用于查看邻居相关的属性, 包括区域、 邻居的状态、 邻接协
商的主从状态以及DR和BDR情况。
2、查看OSPF邻居列表
[R1]display ospf peer
OSPF Process 10 with Router ID 1.1.1.1
Neighbors
Area 0.0.0.0 interface 192.168.1.1(GigabitEthernet0/0/0)’s neighbors
Router ID: 2.2.2.2 Address: 192.168.1.2
State: Full Mode:Nbr is Master Priority: 1
DR: 192.168.1.1 BDR: 192.168.1.2 MTU: 0
Dead timer due in 38 sec
Retrans timer interval: 5
Neighbor is up for 00:01:03
Authentication Sequence: [ 0 ]
Router ID: 3.3.3.3 Address: 192.168.1.3
State: Full Mode:Nbr is Master Priority: 1
DR: 192.168.1.1 BDR: 192.168.1.2 MTU: 0
Dead timer due in 31 sec
Retrans timer interval: 5
Neighbor is up for 00:00:35
Authentication Sequence: [ 0 ]
3、查看OSPF链路状态数据库
[R1]display ospf lsdb
OSPF Process 10 with Router ID 1.1.1.1
Link State Database
Area: 0.0.0.0
Type LinkState ID AdvRouter Age Len Sequence Metric
Router 2.2.2.2 2.2.2.2 134 48 80000006 1
Router 1.1.1.1 1.1.1.1 127 48 80000008 1
Router 3.3.3.3 3.3.3.3 123 48 80000006 1
Network 192.168.1.1 1.1.1.1 127 36 80000004 0
4、设置接口OSPF优先级
[R1]interface GigabitEthernet 0/0/0
[R1-GigabitEthernet0/0/0]ospf dr-priority 100
5、设置参照带宽,影响cost计算方式
[R1]ospf 10
[R1-ospf-10]bandwidth-reference 10000
查看接口cost值:
[R1]display ospf interface GigabitEthernet 0/0/0
6、修改hello包发送间隔
[R1]interface GigabitEthernet 0/0/0
[R1-GigabitEthernet0/0/0]ospf timer hello 5
命令debugging ospf packet用来指定调试OSPF报文,以便解决OSPF问题
7、测试debug消息
terminal debugging
Info: Current terminal debugging is on.
debugging ospf packet