开放最短路径优先OSPF(Open Shortest Path First),是为克服RIP的缺点在1989年开发出来的。
OSPF是一种基于链路状态选路算法的路由协议。
思科路由器中OSPF协议计算代价的方法是:100Mb/s除以链路带宽
计算结果小于1的值仍记为1,大于1且有小数的,舍去小数。
使用OSPF的每个路由器都会产生链路状态通告LSA(Link Siate Adverisement),包含以下内容:
优点:
标准:
为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若千个更小的范围,叫做区域(Area)。
区域:一组网络和连接到任一网络的路由器接口。
如果一个路由器的多个接口属于不同区域,它要为每个区域都运行一个链路状态选路算法,即OSPF协议实例。
例如图示网络中的R3、R4、R5和R8,都分属于两个区域,因而都要运行两个OSPF协议实例。
32
位的编号,可用类似于 IP 地址的点分十进制法表示,也可用一个十进制数表示。
0.0.0.0
是一个特殊的区域:主干区域(backbone area)。所有的非主干区域都要连接到主干区域上。主干区域和非主干区域通常采用星型结构连接:主干区域作为中心节点,非主干区域是边缘节点。
根据作用不同,路由器被划分为 4 种类型:
一台路由器可以同时属于多种类型。
虚拟链路:
自治系统内的路由分为两个层次:区域内路由和区域间路由
使用OSPF的每个路由器都有一个链路状态数据库LSDB,用于存储LSA。
OSPF 支持 5 种网络类型:
图示网络中,路由器RT1和RT2通过点到点网络连接。在链路状态数据库中,可以表示为RT1连接到RT2、RT2连接到RT1两条链路。图中的‘X’表示连接关系及其传输代价。
点到点网络的两个接口可以不用分配IP地址,如果分配了IP地址,OSPF就在链路状态数据库中增加相应的“末端链路”(stub link)。这里末端链路实际上表示的就是点到点网络上的对方。
OSPF可以把非广播网络当作点到多点网络或非广播多址接入网络。区别是点到多点网络中,并非每对节点间都能直接通信(即有连接关系);而非广播多址接入网络中,每对节点都可以直接通信,但不支持在所有节点之间的广播通信。
图示网络中,四台路由器连接到点到多点网络N2上。链路状态数据库表示了它们之间的连接关系:RT3、RT6与所有路由器都有连接;RT4和RT5不与对方连接,但与其余路由器有连接。路由器与点到多点网络的连接接口也被OSPF表示成末端链路。
图示网络被抽象成伪节点N2。在链路状态数据库中,路由器都连接到伪节点N2,N2也连接到各路由器。这里有一点需要注意,从路由器到伪节点的传输代价是网络的传输代价,但从伪节点到路由器的传输代价则是 0。原因是在广播网络上,所有节点都是可以直接通信的,并不需要伪节点的转发。
概念:可看作连接到区域边界路由器的一个末端网络。
对于区域外部的网络,区域边界路由器将到这些网络的路由汇总后注入到所属区域的OSPF协议实例中。对OSPF来说,这些外部网络可以看作是连接到区域边界路由器上的一个末端网络(stub-network),在链路状态数据库中也可用一个伪节点表示。
这里是从RFC 2328中摘录的一个例子。左侧是某个OSPF区域抽象所得的有向加权图,右侧是相应的链路状态数据库。其中‘RT’表示路由器,‘N’表示网络,‘H’表示主机。列上的数字表示链路的传输代价。
OSPF 路由器在有向加权图上计算一个以自己为根(root)的最短路径树,并据此建立自己的路由表。
OSPF 路由器定期向所有邻居路由器发送 HELLO 报文。
报文中包含了最近一段时间内发送过 HELLO 报文的邻居路由器。
10
秒40
秒未收到来自邻居路由器的 HELLO 报文,则认为该邻居路由器不可达如果路由器在邻居发送的 HELLO 报文中发现了自己的标识符,就表明这两个邻居路由器之间建立了双向通信链路。
OSPF 路由器的两种关系:
HELLO 协议在不同类型网络上的工作过程不同:
广播网络或 NBMA 网络上每台路由器都清楚网络的链路状态。
若每台路由器都发送网络的链路状态,会有很多重复发送。OSPF 协议规定:
当路由器连接到广播网络或 NBMA 网络上的接口启动时:
0-255
,默认值是1
OSPF 邻接路由器之间的链路状态数据库同步大体上可分为三步:
OSPF 路由器定期与邻接路由器交换链路状态数据库摘要:
发送和接收数据库描述报文的过程称为“数据库交换过程” ,其中:
两个邻接路由器的链路状态数据库达同步后,称它们之间建立了完全邻接关系(fully adjacent)。
路由器监测其所有链路,若有链路的状态发生改变:
OSPF 协议定义了一种可靠的洪泛(reliable flooding)机制,用于在 OSPF 路由域中快速扩散链路状态的变化。
可靠是指收到链路状态更新报文后要发送确认,收到重复的更新报文无需再次转发,但要发送一次确认。
路由器接收到链路状态更新报文后,逐个检查其中的 LSA:
通过各路由器洪泛法发送封装有自己LSA的LSU报文,各路由器的LSDB最终达到一致
使用OSPF的各路由器基于LSDB进行最短路径优先SPF计算,构建出各种到达其他各路由器的最短路径,即构建各自的路由表。
我们通过一个例子来理解OSPF如何实现网络中所有路由器的链路状态数据库同步。
Down
:此状态还没有与其他路由器交换信息。首先从其ospf接口向外发送hello报文。Init
:表明收到了Hello包,但是2-Way通信仍然没有建立起来。two-way
:双向会话建立,而RID彼此出现在对方的邻居列表中。ExStart
:信息交换初始状态,在这个状态下,本地路由器和邻居将建立Master/Slave关系,一般情况下, 路由器ID大的成为Master。Exchange
:信息交换状态,本地路由器和邻居交换一个或多个DBD报文。Loading
:信息加载状态,收到DBD后,将收到的信息同LSDB中的信息进行比较。如果DBD中有更新的链路状态条目,则向对方发送一个LSR,用于请求新的LSA 。Full
:完全邻接状态,邻接间的链路状态数据库同步完成。89
,发往组播地址224.0.0.5
。2
。1
个字节,指明了报文的类型。OSPF 协议定义了 5
种类型报文。2
字节,指明整个OSPF报文(包括首部)的长度,单位是字节。4
字节,是报文发送方路由器的标识符。每个运行OSPF协议的路由器都有一个32
位的标识符,在自治系统中唯一地标识了该路由器。4
字节,是OSPF报文所属区域的标识符。OSPF报文只在某个特定的区域中发送。如主干区域就是0.0.0.0
2
字节,是整个OSPF报文(除8字节认证数据外)的校验值。计算方法与IP首部校验和相同。2
字节,指定了要使用的认证机制,包括:不进行认证(0
),简单的密码认证(1
),加密认证(2
)。8
字节。
OSPF 协议定义了 5 种类型报文:
报文类型 | 名称 | 英文 | 用途 |
---|---|---|---|
1 | HELLO 报文 | Hello | 发现邻居并监测与邻居链路的状态; 选举网络的指定路由器和备份指定路由器 |
2 | 数据库描述报文 | Database Description(DBD) | 与邻接路由器交换链路状态数据库摘要 |
3 | 链路状态请求报文 | Link State Request (LSR) | 向邻接路由器请求具体的链路状态 |
4 | 链路状态更新报文 | Link State Update (LSU) | 向邻接路由器发送具体的链路状态 |
5 | 链路状态确认报文 | Link State Acknowledgement (LSACK) | 对接收到的链路状态通告进行确认,以实现可靠的链路状态传输 |
OSPF 路由器周期性在所有接口(包括虚拟链路)上发送 HELLO 报文。
2
字节,用于指定路由器发送 HELLO 报文的间隔时间,单位是秒。1
字节,用于OSPF路由器交换各自的能力等级。1
个字节,用于在广播网络或非广播多址接入网络上选举指定路由器和备份指定路由器。如果为 0
,表明发送方路由器不参加选举。4
字节,指明在确认对方路由器发生故障前应等待的时间,单位是秒。0
地址表示网络上还没有指定路由器和备份指定路由器。数据库描述报文描述了链路状态数据库的摘要信息。
1
,表明本报文是描述链路状态数据库摘要的第一个数据库描述报文。1
,表明后续还有其他数据库描述报文。1
,表明本路由器在数据库交换过程中是主方,否则是从方。4
字节,用于对描述链路状态数据库摘要的一组数据库描述报文进行编号。第一个报文中该字段是一个随机数,后续报文的序号在随机数的基础上顺序递增。链路状态请求报文用于向邻接路由器请求特定链路的状态。
链路状态确认报文用于对接收到的链路状态通告(LSA)进行确认。
设备名 | 端口 | ip地址 | 掩码 | 区域ID |
---|---|---|---|---|
R1 | f0/0 | 192.168.2.1 | 255.255.255.0 | 10 |
f0/1 | 192.168.1.1 | 255.255.255.0 | 0 | |
R2 | f0/1 | 192.168.1.2 | 255.255.255.0 | 0 |
f0/0 | 192.168.3.2 | 255.255.255.0 | 20 | |
R3 | f0/0 | 192.168.2.3 | 255.255.255.0 | 10 |
R4 | f0/0 | 192.168.2.4 | 255.255.255.0 | 10 |
R5 | f0/0 | 192.168.2.5 | 255.255.255.0 | 10 |
R6 | f0/0 | 192.168.3.6 | 255.255.255.0 | 20 |
f0/1 | 192.168.4.6 | 255.255.255.0 | 20 | |
R7 | f0/1 | 192.168.4.7 | 255.255.255.0 | 20 |
实验步骤:
一、在R1上配置OSPF
(1)启动OSPF路由协议
R1(config)#router ospf 1
其中1
是路由器上的OSPF进程号,进程ID只在路由器内部有效,不同路由器的OSPF进程ID可以相同。通常网络管理员会在整个AS中保持相同的进程ID。
(2)指定直连网段
R1(config-router)#network 192.168.1.0 0.0.0.255 area 0
R1(config-router)#network 192.168.2.0 0.0.0.255 area 10
其中0.0.0.255
是通配符掩码,使用网络地址掩码的反码,即为0的位需要匹配,为1的位不需要匹配。
二、在R2上配置OSPF
(1)启动ospf
R2(config)#router ospf 1
(2)指定直连网段
R2(config-router)#network 192.168.1.0 0.0.0.255 area 0
R2(config-router)#network 192.168.3.0 0.0.0.255 area 20
三、在R3上配置OSPF
(1)启动ospf
R3(config)#router ospf 1
(2)指定直连网段
R3(config-router)#network 192.168.2.0 0.0.0.255 area 10
四、在R4,R5,R6(除f0/1口)外进行OSPF配置
注:在本次实验中配置OSPF顺序为R1,R3,R4,R5,R2
五、抓包分析邻居发现及维护过程
(1)在区域10的以太网的任一网络接口启动分组捕获。在wireshark显示过滤器输入“ospf.msg.hello && ip.src==192.168.2.1”
(2)观察产生的数据包
从分组列表窗口可以看到,R1周期性(约10s)发送HELLO报文,报文的目的地址是所有OSPF路由器组播地址224.0.0.5
。
选择一个HELLO报文,在分组首部详细信息窗口查看其首部字段值。注意OSPF报文封装在IP分组中。
查看OSPF报文详细信息,可以看到OSPF报文由三部分组成:OSPF首部(OSPF Header)、HELLO报文(OSPF HELLO Packet)以及本地链路信令数据块(LLS (Local-Link Signaling) Data Block)。
注:由于优先级相同,则标识符(IP地址)更大者胜出,但由于在实验中,按R1,R3,R4,R5的顺序启动路由器ОSPF进程,因此R1成为指定路由器,而R3成为备份指定路由器。已经选举出来的指定路由器不会再重新选举,除非故障。
六、抓包分析备份指定路由器选举过程
(1)在区域10的以太网的任一网络接口启动分组捕获。在R3中输入以下指令:
R3#clear ip ospf process # 重启OSPF进程,用来模拟选举过程
(2)在wireshark显示过滤器输入“ospf.msg.hello && ip.addr ==192.168.2.3”
R3的OSPF进程重启后,将首先查询网络上的指定路由器和备份指定路由器。这通过发送(组播)一个指定路由器和备份指定路由器均为0.0.0.0
的 HELLO报文实现
网络中当前的指定路由器收到查询报文后,向查询路由器发送(单播)一个响应HELLO报文,其包含当前的指定路由器和备份指定路由。
由于原来的备份指定路由器(R3)重启,其余路由器进行了新备份指定路由器选举。路由器从其当前邻居中选择优先级最高或路由器标识符最大(优先级相同时)的路由器作为新备份指定路由器。实验中,在这些路由器中R5的路由器标识符最大(所有路由器的优先级相同,均为1),成为新备份指定路由器。R3向指定路由器发送(单播)一个确认HELLO报文,其中包含R3的当前邻居(R1)。此后,R3将周期性组播发送HELLO报文。
七、抓包分析指定路由器选举过程
(1)在区域10的以太网的任一网络接口启动分组捕获。在R1中输入以下指令:
R1#clear ip ospf process
(2)在wireshark显示过滤器输入“ospf.msg.hello && ip.addr ==192.168.2.1”
R1的OSPF重启后﹐首先查询网络中的指定路由器和备份指定路由器。R1发送(组播)一个HELLO报文,其指定路由器和备份指定路由器均为0.0.0.0
。网络的所有路由器都向R1发送(单播)一个HELLO报文。由于原指定路由器R1失效,R3和R4认为原备份指定路由器(R5)变为指定路由器,而备份指定路由器仍是R5。
R5发送的HELLO报文如图所示。R5是原备份指定路由器,当原指定路由器(R1)失效后,R5将成为新的指定路由器,并从其当前的邻居中选择优先级最高或路由器标识符最大(优先级相同时)的路由器(R4)作为新的备份指定路由器。
R1收到R5、R4、R3 发送的响应HELLO报文后,分别向各自发送(单播)确认HELLO报文。
八、抓包分析链路状态数据库同步过程
(1)先后在R6的f0/1口和R7的f0/1口启动ospf路由协议。在R6和R7中输入以下指令:
R6(config)#router ospf 1
R6(config)#network 192.168.4.0 0.0.0.255 area 20
R7(config)#router ospf 1
R7(config)#network 192.168.4.0 0.0.0.255 area 20
(2)在R6和R7、R2和R6、R1和R2、R1和SW1间抓包,在wireshark显示过滤器输入“ospf && not ospf.msg.hello”
数据库描述报文有两种:空数据库描述报文和包含LSA首部信息的数据库描述报文。当两个路由器相互收到HELLO Seen报文(即路由器包含在HELLO报文中的邻居字段列表中)之后,它们开始互相发送空数据库描述报文。
空数据库描述报文用来确定通信过程中的主从关系。通常以路由器标识符较大的路由器作为主方。
主从关系确立后,从方使用主方的序号(6047)向主方发送第一个包含若干LSA首部信息的数据库描述报文;
主方在收到从方的数据库描述报文后发送自己的序号加1的数据库描述报文(包含LSA首部信息),作为对收到从方报文的确认。如果还有更多的链路状态,从方、主方将继续发送数据库描述报文。
在这个交换过程中,只有主方可以更改序号,从机使用主方确定的序号。
交换完数据库描述报文后,R7与R6相互请求其缺失的链路状态信息。这通过发送链路状态请求和链路状态更新报文实现。
R7和 R6之间链路的更新会在区域20中进行洪泛。可以看到R6与R7都在组播。
区域20中R6和R7间链路状态的更新将被在区域0和区域10中通知。在区域0中,路由器R2以网络摘要LSA方式通知该链路状态的更新,即网络192.168.4.0。在区域10中,区域边界路由器R1组播发送网络摘要。
❗ 转载请注明出处
作者:HinsCoder
博客链接: 作者博客主页