安全运维服务中学习路由协议OSPF的个人理解
2022-11-17 0:00:00浏览量:1149编辑:管理员来源:天畅
Open Shortest Path First (OSPF) 是一个标准的路由协议,OSPF是一种基于链路状态的路由协议,也是专为 IP 开发的路由协议,直接运行在 IP 层上面。它从设计上保证了无路由环路。除此之外,IS-IS也是很常见的链路状态协议。
OSPF已经使用很多年了,几乎所有的厂家都支持 OSPF 协议,只要你在 IT 行业,你就逃不开 OSPF 协议。有多个站点的企业网络通常使用 OSPF 来连接其园区和广域网(WAN)。
静态路由写起来真的烦,配路由都是一把梭动态路由。有很多动态路由OSPF 可能没有 EIGRP 那么简单。但是,我建议别被 OSPF 协议吓到了,在大型网络中 OSPF 是很复杂,但是在小型网络中是真的简单。在这篇文章中,我将向你介绍 OSPF 主要的知识,提供一些基于OSPF报文格式的介绍,来达到了解OSPF路由协议的特性和特有的一些概念的了解。
-
快速收敛,它能够在网络拓扑发生变化时,立即进行路由的重新计算,并及时向其他路由器发送最新的链路状态信息,使得各路由器的链路状态表能够尽量保持一致;
-
支持可变长子网掩码,可以支持在一个网络中使用多级子网IP地址;
-
提高了网络节点的可达性,因为它突破了距离矢量路由协议对15跳数的限制,支持网络中具有更多的网络节点;
-
提供最佳路由的选择,它组合了网络链路的多种性能指标来计算最佳路由。
RIP是基于距离矢量算法的路由协议,应用在大型网络中存在收敛速度慢、度量值不科学、易产生路由环路、可扩展性差等问题,目前已逐渐被OSPF取代。
RIP特性
|
带来的问题
|
逐跳收敛
|
收敛慢,故障恢复时间长
|
分布式路由计算
|
缺少对全局网络拓扑的了解
|
以“跳数”为度量
|
存在选择次优路径的风险
|
OSPF是一种基于链路状态的路由协议,它从设计上就保证了无路由环路。OSPF支持区域的划分,区域内部的路由器使用SPF最短路径算法保证了区域内部的无环路。OSPF还利用区域间的连接规则保证了区域之间无路由环路。OSPF支持触发更新,能够快速检测并通告自治系统内的拓扑变化。OSPF可以解决网络扩容带来的问题。当网络上路由器越来越多,路由信息流量急剧增长的时候,OSPF可以将每个自治系统划分为多个区域,并限制每个区域的范围。OSPF这种分区域的特点,使得OSPF特别适用于大中型网络。OSPF还可以同其他协议(比如多协议标记切换协议MPLS)同时运行来支持地理覆盖很广的网络。OSPF可以提供认证功能。OSPF路由器之间的报文可以配置成必须经过认证才能进行交换。
那么OSPF协议是如何实现的呢?面对网络扩展的需求,又该如何应对呢?
OSPF要求每台运行OSPF的路由器都了解整个网络的链路状态信息,这样才能计算出到达目的地的最优路径。OSPF的收敛过程由链路状态公告LSA(Link State Advertisement)泛洪开始,LSA中包含了路由器已知的接口IP地址、掩码、开销和网络类型等信息。收到LSA的路由器都可以根据LSA提供的信息建立自己的链路状态数据库LSDB(Link State Database),并在LSDB的基础上使用SPF算法进行运算,建立起到达每个网络的最短路径树。最后,通过最短路径树得出到达目的网络的最优路由,并将其加入到IP路由表中。
Step1:邻居建立
Step2:同步链路状态数据库
Step3:计算最优路由
Router ID用于在自治系统中唯一标识一台运行OSPF的路由器,每台运行OSPF的路由器都有一个Router ID。
Hello报文发现并建立邻居,A邻居发现:自动发现邻居路由器;B邻居建立:完成hello报文中的参数协商,建立邻居关系;C邻居保持:通过keepalive机制,检测邻居运行状态。
链路状态信息主要包括:A链路的类型;B接口IP地址及掩码;C链路上所连接的邻居路由器;D链路的带宽(开销)。
OSPF直接运行在IP协议之上,使用IP协议号89,共有五种报文类型,每种报文都使用相同的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报文进行确认。
1.ExStart:邻居状态变成此状态以后,路由器开始向邻居发送DD报文。Master/Slave关系是在此状态下形成的,初始DD序列号也是在此状态下确定的。在此状态下发送的DD报文不包含链路状态描述。2.Exchange:在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文。3.Loading:在此状态下,路由器与邻居之间相互发送LSR报文、LSU报文、LSAck报文。4.Full:LSDB同步过程完成,路由器与邻居之间形成了完全的邻接关系。
1.RTA和RTB的Router ID分别为1.1.1.1和2.2.2.2并且二者已建立了邻居关系。当RTA的邻居状态变为ExStart后,RTA会发送第一个DD报文。此报文中,DD序列号被随机设置为X,I-bit设置为1,表示这是第一个DD报文,M-bit设置为1,表示后续还有DD报文要发送,MS-bit设置为1,表示RTA宣告自己为Master。
2.当RTB的邻居状态变为ExStart后,RTB会发送第一个DD报文。此报文中,DD序列号被随机设置为Y(I-bit=1,M-bit=1,MS-bit=1,含义同上)。由于RTB的Router ID较大,所以RTB将成为真正的Master。收到此报文后,RTA会产生一个Negotiation-Done事件,并将邻居状态从ExStart变为Exchange。
3.当RTA的邻居状态变为Exchange后,RTA会发送一个新的DD报文,此报文中包含了LSDB的摘要信息,序列号设置为RTB在步骤2中使用的序列号Y,I-bit=0,表示这不是第一个DD报文,M-bit=0,表示这是最后一个包含LSDB摘要信息的DD报文,MS-bit=0,表示RTA宣告自己为Slave。收到此报文后,RTB会产生一个Negotiation-Done事件,并将邻居状态从ExStart变为Exchange。
4.当RTB的邻居状态变为Exchange后,RTB会发送一个新的DD报文,此报文包含了LSDB的摘要信息,DD序列号设置为Y+1, MS-bit=1,表示RTB宣告自己为Master。
虽然RTA不需要发送新的包含LSDB摘要信息的DD报文,但是作为Slave,RTA需要对Master发送的每一个DD报文进行确认。所以,RTA向RTB发送一个新的DD报文,序列号为Y+1,该报文内容为空。发送完此报文后,RTA产生一个Exchange-Done事件,将邻居状态变为Loading。RTB收到此报文后,会将邻居状态变为Full(假设RTB的LSDB是最新最全的,不需要向RTA请求更新)。
1.RTA开始向RTB发送LSR报文,请求那些在Exchange状态下通过DD报文发现的、并且在本地LSDB中没有的链路状态信息。
2.RTB向RTA发送LSU报文,LSU报文中包含了那些被请求的链路状态的详细信息。RTA在完成LSU报文的接收之后,会将邻居状态从Loading变为Full。
3.RTA向RTB发送LSAck报文,作为对LSU报文的确认。RTB收到LSAck报文后,双方便建立起了完全的邻接关系。
从建立邻居关系到同步LSDB的过程较为复杂,错误的配置或设备链路故障都会导致无法完成LSDB同步。为了快速排障,最关键的是要理解不同状态之间切换的触发原因。
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台,那么情况就大不一样了。
在邻居发现完成之后,路由器会根据网段类型进行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。这种选举机制的目的是为了保持邻接关系的稳定,使拓扑结构的改变对邻接关系的影响尽量小。
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,即骨干区域。
在配置OSPF时,需要首先使能OSPF进程。命令ospf [process id]用来使能OSPF,在该命令中可以配置进程ID。如果没有配置进程ID,则使用1作为缺省进程ID。命令ospf [process id] [router-id <router-id>]既可以使能OSPF进程,还同时可以用于配置Router ID。在该命令中,router-id代表路由器的ID。命令network用于指定运行OSPF协议的接口,在该命令中需要指定一个反掩码。反掩码中,“0”表示此位必须严格匹配,“1”表示该地址可以为任意值。命令display ospf peer可以用于查看邻居相关的属性,包括区域、邻居的状态、邻接协商的主从状态以及DR和BDR情况。
-
OSPF 协议需要有关复杂网络的高级知识,因此不像其他一些协议那样容易学习。
-
当有更多路由器添加到网络时,OSPF 路由不会扩展。OSPF 协议缺乏可扩展性使其不适合跨 Internet 路由。
-
OSPF 协议维护路由信息的多个副本,增加了所需的内存量。
OSPF的复杂度,真让人感叹,现在回想起来,精通OSPF就是大牛了,我觉得起码要几个方面都做到吧。
在OSPF的疑难解答方面,不说来一个答一个,起码立刻能找到分析问题的方法,找到并正确定位问题;
就是对协议的发展要心中有数,网络技术的不断发展,对路由协议也提出了各种各样新的要求,并且对协议进行着不断扩展。作为一个精通OSPF协议的人,需要关注这些新技术的发展方向这是理所当然的。