目录
1. 选举Route ID
通常运行OSPF协议之前,还需要选举一个路由标识符(router-id),用来标识一台运行OSPF协议的路由器(在OSPF域内),通常RID是一个32位的IP地址,不同路由器的RID不能一样,具有唯一性。
Router ID可以通过手动和自动两种方式来配置RID,手动配置RID也很简单,只要指定一个唯一的IP地址就行了。
自动选举RID的顺序如下:
- 如果有配置多个环回接口,那么在up状态的环回接口中选举最大的ip地址
- 如果没有配置环回接口,则在up状态的物理接口中选举最大的ip地址
需要注意的是,在一台运行OSPF协议的路由器上重置OSPF进程后,路由器可能会根据接口的地址变化从而更新Router ID,并且之前学习到的路由信息等都会被清空,为了防止这个问题,通常建议手动配置Router ID。
如果路由器设备没有配置任何接口ip地址,在运行ospf协议时自动选举RID时就会显示如下信息:
[Huawei]dis ip int brief
*down: administratively down
^down: standby
(l): loopback
(s): spoofing
The number of interface that is UP in Physical is 1
The number of interface that is DOWN in Physical is 2
The number of interface that is UP in Protocol is 1
The number of interface that is DOWN in Protocol is 2
Interface IP Address/Mask Physical Protocol
GigabitEthernet0/0/0 unassigned down down
GigabitEthernet0/0/1 unassigned down down
NULL0 unassigned up up(s)
[Huawei]
[Huawei]dis ospf brief
OSPF Process 1 with Router ID 0.0.0.0
OSPF Protocol Information
RouterID: 0.0.0.0 Border Router:
[Huawei]
由于设备的所有接口都没有配置ip地址,因此Router ID显示的是0.0.0.0,这不是正常的Router ID。
2. OSPF协议原理
OSPF协议要求每台运行OSPF协议的路由器都了解整个网络拓扑的链路状态信息,以此计算出到达目的地的最优路径。
OSPF的工作过程:OSPF的收敛过程由链路状态公告LSA(Link State Advertisement)泛洪开始,在LSA中包含了路由器已知的接口ip地址,掩码,开销,网络类型等信息。当收到LSA的路由器会根据收到的LSA中提供的信息建立自己的链路状态数据库LSDB,在LSDB的基础上使用SPF算法计算出到达每个网络的最短路径树,通过最短路径树得出到达目的网络的最优路由并加入到路由表当中。
3. OSPF报文类型
OSPF协议的报文是封装在IP网络层中,使用的协议号是89,以OSPF协议的hello报文为例,其封装格式如下所示:
OSPF共有5中报文类型:
- Hello报文:Hello报文是用于发现,维护邻居关系的,以每10秒的周期性更新hello报文,在广播和NBMA类型网络中选举指定路由器DR和备份指定路由器BDR(Backup Designated Router )。
- DD报文:DD报文:当路由器设备在进行LSDB数据库同步时,用于描述自己的LSDB信息,(不过DD报文中仅仅包含LSA的头部)。
- LSR报文:当两台相互发送DD报文后,从对方的链路状态数据库中(LSDB)可以知道哪些LSA是自己本地的链路状态数据库中没有的,或者是否有更新的LSA,那么就可以发送LSR报文请求缺失的LSA。
- LSU报文:跟LSR报文的作用是类似的,LSU报文是用来发送对方所缺失的LSA。
- LSA报文:用来对接收到的LSU报文进行确认。
3.1 Hello报文
Hello报文是用于发现,维护邻居关系的,以每10秒的周期性更新hello报文,在广播和NBMA类型网络中选举指定路由器DR和备份指定路由器BDR(Backup Designated Router )。
在hello包中会携带邻居的各种信息。
3.2 DD报文
DD报文:当路由器设备在进行LSDB数据库同步时,用于描述自己的LSDB信息,(不过DD报文中仅仅包含LSA的头部)。
3.3 LSR报文
LSR报文:当两台相互发送DD报文后,从对方的链路状态数据库中(LSDB)可以知道哪些LSA是自己本地的链路状态数据库中没有的,或者是否有更新的LSA,那么就可以发送LSR报文请求缺失的LSA。
上图中可以看到12.1.1.2这台设备向12.1.1.1设备发送了LSR报文请求。
3.4 LSU报文
LSU报文:跟LSR报文的作用是类似的,LSU报文是用来发送对方所缺失的LSA。
当12.1.1.1设备收到对方发送的LSR报文时就会发送对方缺失的LSA信息。
3.5 LSA报文
LSA报文:用来对接收到的LSU报文进行确认。
4. OSPF邻居状态机
OSPF邻居建立的状态有以下几个:
- 失效状态(Down) :没有收到Hello包
- 初始状态(Init) :收到对方的Hello包,但没有在hello包中看到自己的信息
- 双向通讯状态(Two-Way):收到Hello包,且看到了自己, 形成邻居关系
- 交换初始状态(Exstart) :协商主/从关系,保证DD包能有序的发送
- 交换状态(ExChange) :交换DD包,对比LSDB
- 加载状态(Loading) :正在同步LSDB, LSR和LSU交换
- 完全邻接状态(Full) :LSDB完成同步,形成邻接关系
需要注意的是只有Two-Way和Full是稳定状态。
5. OSPF工作流程
5.1 建立邻居关系
OSPF工作的邻居发现(即数据包和状态切换)过程 :
OSPF协议是通过相互发送hello报文来发现邻居,建立并维护邻居关系的,如果路由器设备发现接收的hello报文中的邻居列表中有自己的RID则说明和邻居建立了双向连接(Two-way),即建立了邻居关系。
另外,运行OSPF的路由器之间交换链路状态信息和路由信息时需要建立邻接关系,但是已经建立邻居关系并不意味着可以形成邻接关系,只有当双方交换过DD报文并同步LSDB后才会形成邻接关系。
5.2 建立邻接关系
当路由器都建立邻居关系后,就可以建立邻接关系了,如下图所示:
当路由器建立完邻居关系后就可以开始进行链路状态数据库(LSDB)同步了,首先R1和R2双方会相互发送DD报文来选举Master角色,但由于R2设备的RID要比R1大,那么R2设备会被选举为Master路由器。选举完Master后,R1和R2之后发送DD报文都会采用Master的Seq序列号,并且Master路由器每发送一个新的DD报文时,其Seq序列号都会+1。
当双方发送完最后一个DD报文时,说明交换LSA达到LSDB同步,R1和R2之间的状态改为Full,表示建立邻接关系。
当R1和R2设备形成邻接关系后,再查看两台设备的链路状态数据库(LSDB):
R1和R2设备都有相同的LSDB数据库信息。
5.3 建立邻居的条件
运行ospf协议的路由器通过hello报文建立邻居需要满足以下几个条件:
- RID唯一
- Hello / Dead时间间隔一致
- 区域ID一致
- 认证(如果启用了认证) 一致
- 链路MTU大小一致(默认不开启检查,思科默认开启)
- 子网掩码一致(以太网环境)
- 网络地址一致
- 末梢区域设置一致(Option)
如果R1和R2两个路由器设备的RID一样的话就无法区分网络设备的身份标识了,那么双方在发送hello报文是不能建立邻居的。这里以RID和hello报文的时间间隔为例,默认情况下hello报文的时间是10秒,但是更改hello报文的时间也会导致R1和R2设备之间无法建立邻居关系以及邻接关系。
把R1设备的hello报文的时间间隔更改为8,R1设备的OSPF邻居状态提示信息如下:
命令行窗口中NeighborPreviousState表示邻居之前的状态,NeighborCurrentState表示邻居当前的状态,说明R1设备已经从Full状态切换成Down状态了,没有建立邻居关系的,NeighborDownPrimeReason=Interface Parameter Mismatch这一行信息代表着无法建立邻居关系的原因:接口参数不匹配。
通过wireshark抓包确实可以看到R1和R2设备之间发送的hello报文中的是8秒,不是默认的10秒,也就是说,由于双方的hello报文时间间隔不一致,从而导致双方无法建立邻居关系。对于其他的建立邻居的条件也是同理,这里就不再一一介绍了。
6. 网络类型
在OSPF协议中有四种网络类型: 广播多路访问型 (BMA)、 非广播多路访问型 (NBMA)、点到点型(Point-to-Point)、点到多点型(Point-to-MultiPoint)。
首先需要明白的一点是OSPF协议的网络类型是基于接口的,在OSPF网络中默认情况下以太网的网络是广播类型的;而PPP,DHLC这些网络则是点到点类型的,我们可以通过查看网络设备的接口类型来验证这一点。
dis ospf int g0/0/0命令查看设备的以太网口g0/0/0,dis ospf s4/0/0命令查看串口s4/0/0的网络类型:
从设备该出的信息来看,以太网接口g0/0/0是广播网络类型,串口s4/0/0是点到点网络类型。
7. 选举DR和BDR
从OSPF的网络类型可知,网络设备的接口类型决定了网络的类型,而网络类型来决定是否要选举DR和BDR,那么问题来了,DR和BDR是什么意思?
我们知道每一次建立邻接关系都要发送hello报文,如果建立邻接关系数越多,意味着就要发送更多的hello报文。默认情况下OSPF网络中的每一台路由设备都可以和其他路由设备建立邻接关系,那么总的建立邻接关系数就是n(n-1)/2。但是如果采用选举DR/BDR的方式建立邻接关系,那么总的建立邻接关系数就是2(n-2)+1,很明显DR/BDR减少了建立邻接关系数。
说白了,选举DR/BDR的目的就是减少建立邻接数,从而减少发送hello报文次数来节省网络带宽,减轻路由设备处理数据包的压力。这样其他非DR/BDR只需要与选举为DR/BDR的建立邻接关系并交换链路状态信息以及路由信息,就可以了解整个OSPF网络的状态信息。
DR(Designed Router,指定路由器):,相当于网络的中心节点,包含了整个网络的链路状态和路由信息,相当于班长,总经理的角色
BDR(Backup DR,备用DR):在DR发生故障时,用于接管DR,相当于副班长,副总经理。
DRothers:指的是非DR/BDR,相当于普通学生,员工
注意:DR,BDR以及DRothers之间都保持着邻接关系(Full),DRothers之间保持邻居关系(Two-Way)。另外DR、BDR以及DRothers之间以组播的方式进行交互,224.0.0.6向DR和BDR发送链路状态更新,224.0.0.5向所有OSPF路由器发送。
DR和BDR选举规则:
- 首先比较Hello报文中携带的优先级
- 优先级范围0~255,默认=1
- 优先级最高的被选举为DR,优先级次高的被选举为BDR
- 优先级为0的不参与选举
- 优先级一致的情况下,比较RID, 越大越优先
8. Cost开销
在OSPF网络中每一个运行OSPF的接口上,都维护着一个接口Cost开销值,计算cost开销的公式如下:
Cost = 10^8/BW(bps)= 100Mbps/BW = 接口带宽参考值/接口带宽
本质上Cost开销值是计算到一个目标网络的度量值,计算Cost的方式是从源到本路由器沿途所有入站接口的Cost值累加(路由方向)。