前言
RIP是基于距离矢量算法的路由协议,应用在大型网络中存在收敛速度慢、度量值不科学、可扩展性差等问题。
IETF提出了基于SPF算法的链路状态路由协议OSPF ( Open Shortest Path First ) 。通过在大型网络中部署OSPF协议,弥补了RIP协议的诸多不足。那么OSPF协议是如何实现的呢?面对网络扩展的需求,又该如何应对呢?
RIP在大型网络中部署面临的挑战
大型网络所发生的的变化
-
网络规模扩大:
企业新业务层出不穷,且业务呈现大集中趋势,使得网络规模不断扩大。 -
网络可靠性要求提高:
各种应用程序对网络可靠性要求越来越高,网络发生故障后,需要在更短的时间内恢复正常。 -
网络异构化,多厂商设备互联需求:
在日常的运营维护中,硬件设备不断升级或更新,不同设备之间性能差异较大,设备间互连链路带宽也存在一定的差异。
需要一种各厂商均支持的开放路由协议。
RIP在大型网络中部署所面临的问题
RIP特性 | 带来的问题 |
---|---|
逐跳收敛 | 收敛慢,故障恢复时间长 |
传闻路由更新机制 | 缺少对全局网络拓扑的了解 |
最多有效跳数为15 | 环形组网中使远端路由不可达 |
以“跳数”为度量 | 存在选择次优路径的风险 |
逐跳收敛:
如图所示,N1网络发生变化,RTA向RTB发出更新,RTB收到更新之后进行本地计算,完成计算后再向RTC发送路由变化通知,如此循环。逐跳收敛的方式,造成了网络收缓慢的问题。
传闻路由更新机制:
RIP在计算路由完全依赖于从邻居路由器收到的路由信息,RTE仅依靠从RTD获取的信息计算路由,对RTA、RTB和RTC之间的网络情况并不了解。RIP在计算路由时,缺少对全局网络拓扑的了解。
以“跳数”为度量:
因为RIP基于跳数的度量方式,所以N1与N2网络互访时会选择RTA->RTB->RTD->RTE作为最优路径。显然RTB->RTC->RTD之间的以太链路要比RTB->RTD的串行链路带宽要高的多。
如何解决RIP的问题
RIP的问题 | 优化或解决的方式 |
---|---|
收敛慢,故障恢复时间长 | “收到更新->计算路由->发送更新”改为“收到更新->发送更新->计算路由” |
缺少对全局网络拓扑的了解 | 路由器基于拓扑信息,独立计算路由 |
最多有效跳数为15 | 不限定跳数 |
存在选择次优路径的风险 | 将链路带宽作为选路参考值 |
在“收到更新”、“计算路由”、“发送更新”的路由收敛过程中,RIP的局限性在于路由器需要在完成路由计算之后才可以向邻居发送路由变化通知。如果将这个过程调整为∶“收到更新”、“发送更新”、“计算路由”,即路由器从邻居收到路由更新后立刻向其他邻居路由器转发,然后再本地计算新的路由。这样的收敛方式可以大大降低全网路由收敛的时间。
因为RIP路由器仅从邻居路由器获取路由信息,所以对于非最优或者错误路由信息,RIP路由器并不能识别或屏蔽。解决此问题的关键最佳方式是路由器收集全网的信息,并基于这些信息独立计算路由。
基于跳数的度量方式并没有考虑数据包的链路转发延迟,如果采用以累积带宽为选路参考依据,可以更好的规避选择次优路径的风险。
链路状态路由协议OSPF
- 路由信息传递与路由计算分离
- 基于SPF算法
- 以“累计链路开销”作为选路参考值
所谓Link State(链路状态)指的就是路由器的接口状态。在OSPF中路由器的某一接口的链路状态包含了如下信息︰
该接口的IP地址及掩码、该接口的带宽、该接口所连接的邻居。。。。
OSPF作为链路状态路由协议,不直接传递各路由器的路由表,而传递链路状态信息,各路由器基于链路状态信息独立计算路由。
所有路由器各自维护一个链路状态数据库。邻居路由器间先同步链路状态数据库,再各自基于SPF ( Shortest Path First )算法计算最优路由,从而提高收敛速度。
在度量方式上,OSPF将链路带宽作为选路时的参考依据。“累计带宽”是一种要比“累积跳数”更科学的计算方式。
OSPF的工作过程
-
邻居建立:
路由器之间发现并建立邻居关系。 -
同步链路状态数据库:
每台路由器产生并向邻居泛洪链路状态信息,同时收集来自其他路由器链路状态信息,完成LSDB ( Link State Database )的同步。 -
计算最优路由:
每台路由器基于LSDB通过SPF算法,计算得到一棵以自己为根的SPT ( ShortestPath Tree ),再以SPT为基础计算去往各目的网络的最优路由,并形成路由表。
Router ID:用于在自治系统中唯一标识一台运行OSPF的路由器,每台运行OSPF的路由器都有一个Router ID。 Router ID是一个32位的无符号整数,其格式和IP地址的格式是一样的,Router ID选举规则如下︰
手动配置OSPF路由器的Router ID(通常建议手动配置);
如果没有手动配置Router ID,则路由器使用Loopback接口中最大的IP地址作为Router ID ;
如果没有配置Loopback接口,则路由器使用物理接口中最大的IP地址作为Router ID。
OSPF的路由器Router ID重新配置后,可以通过重置OSPF进程来更新Router ID。
发现并建立邻居----Hello报文
Hello报文的作用:
- 邻居发现︰自动发现邻居路由器。
- 邻居建立∶完成Hello报文中的参数协商,建立邻居关系。
- 邻居保持∶通过Keepalive机制,检测邻居运行状态。
OSPF邻居建立过程
状态含义:
- Down :这是邻居的初始状态,表示没有从邻居收到任何信息。
- Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己的Router ID不在所收到的Hello报文的邻居列表中,表示尚未与邻居建立双向通信关系。
- 2-Way:在此状态下,路由器发现自己的Router ID存在于收到的Hello报文的邻居列表中,已确认可以双向通信。
邻居建立过程如下:
- RTA和RTB的Router ID分别为1.1.1.1和2.2.2.2。当RTA启动OSPF后,RTA会发送第一个Hello报文。此报文中邻居列表为空,此时状态为Down,RTB收到RTA的这个Hello报文,状态置为Init。
- RTB发送Hello报文,此报文中邻居列表为空,RTA收到RTB的Hello报文,状态置为Init.
- RTB向RTA发送邻居列表为1.1.1.1的Hello报文,RTA在收到的Hello报文邻居列表中发现自己的Router ID,状态置为2-way。
- RTA向RTB发送邻居列表为2.2.2.2的Hello报文,RTB在收到的Hello报文邻居列表中发现自己的Router ID,状态置为2-way。
因为邻居都是未知的,所以Hello报文的目的IP地址不是某个特定的单播地址。邻居从无到有,OSPF采用组播的形式发送Hello报文(目的地址224.0.0.5)。对于不支持组播的网络,OSPF路由器如何发现邻居呢?
发现并建立邻居----手动建立
- OSPF支持通过单播方式建立邻居关系。
- 对于不支持组播的网络可以通过手动配置实现邻居的发现与维护。
对于不支持组播的网络可以通过手动配置实现邻居的发现与维护。
当网络规模越来越大或者设备频繁更新,相关联的OSPF路由器都需要更改静态配置,手动更改配置的工作量变大且容易出错。除了特殊场景,一般情况下不适用手动配置的方式。
OSPF路由器之间建立邻居关系是为了同步链路状态信息,接下来学习OSPF如何实现链路状态数据库的同步。
链路状态信息
- 链路的类型
- 接口IP地址及掩码
- 链路上所连接的邻居路由器
- 链路的带宽(开销)
区别于RIP路由器之间交互的路由信息,OSPF路由器同步的是最原始的链路状态信息,而且对于邻居路由器发来的链路状态信息,仅作转发。最终所有路由器都将拥有一份相同且完整的原始链路状态信息。
每台运行OSPF协议的路由器所描述的信息中都应该包括链路的类型、接口IP地址及掩码、链路上的邻居、链路的开销等信息。
路由器只需要知道目的网络号/掩码、下一跳、开销(接口IP地址及掩码、链路上的邻居、链路的开销)即可,为什么要有链路的类型呢?
数据链路层协议类型多种多样,工作机制也各不相同,为适配多种数据链路层协议,必须考虑各类链路层协议在组网时的应用场景。
网络类型----P2P网络
- 仅两台路由互连
- 支持广播、组播
OSPF划分了四种网络类型并以此来组成拓扑信息的一部分。P2P网络连接了一对路由器,广播、组播数据包都可以转发。
P2P网络的例子︰两台通过PPP ( Point-to-Point Protocol)链路相连的路由器网络。
网络类型----广播型网络
- 两台或两台以上的路由器通过共享介质互连
- 支持广播、组播
广播型网络支持两台及两台以上的设备接入同一共享链路且可以支持广播、组播报文的转发,是OSPF最常见的网络类型。
广播型网络的例子∶通过以太网链路相连的路由器网络。
同时因为一个广播型网络中存在多台设备,邻居关系建立以及链路信息同步方面,OSPF都有对应的特性来减少同一网络多台设备带来的不利影响。
以上两种网络类型是最常见的,此外,还有两种少见的网络类型。
网络类型----NBMA网络
- 两台或两台以上路由器通过VC互连
- 不支持广播、组播
与广播型网络不同的是NBMA网络默认不支持广播与组播报文的转发。在NBMA网络上OSPF模拟在广播型网络上的操作,但是每个路由器的邻居需要手动配置。
NBMA ( non-broadcast multiple access )型网络的例子:通过全互连的帧中继链路相连的路由器网络。
在现在的网络部署中,NBMA网络已经很少了。
网络类型----P2MP
- 多个点到点网络的集合
- 支持广播、组播
将一个非广播网络看成是一组P2P网络,这样的非广播网络便成为了一个点到多点(P2MP)网络。在P2MP网络上,每个路由器的OSPF邻居可以使用反向地址解析协议(Inverse
ARP)来发现。P2MP可以看作是多个P2P的集合,P2MP可以支持广播、组播的转发。
没有一种链路层协议默认属于P2MP类型网络,也就是说必须是由其他的网络类型强制更改为P2MP。常见的做法是将非完全连接的帧中继或ATM改为P2MP的网络。
此外OSPF的链路状态信息中的开销值是如何度量的呢?
OSPF的度量方式
某接口cost=参考带宽/实际带宽
OSPF在计算接口的cost时,cost=参考带宽/实际带宽,默认参考带宽为100M。当计算结果有小数位时,只取整数位;结果小于1时,cost取1。
更改cost的两种方式:
-
直接在接口下配置
需要注意的是,配置的cost是此接口最终的cost值,作用范围仅限于本接口。 -
修改参考带宽(所有路由器都需要修改,确保选路一致性)
修改OSPF的默认参考带宽值,作用范围是本路由器使能OSPF的接口。建议参考整个网络的带宽情况建立参考基线,所有路由器修改相同的参考带宽值,从而确保选路的一致性。
相比于RIP,OSPF的度量方式不仅考虑“跳数”,而且还考虑了“带宽”,比RIP更可靠的选择最优的转发路径。
OSPF协议报文头部
RIP路由器之间是基于UDP 520的报文进行通信,OSPF也有其规定的通信标准。OSPF使用IP承载其报文,协议号为89。
在OSPF Packet部分,所有的OSPF报文均使用相同的OSPF报文头部:
- Version :对于当前所使用的OSPFv2,该字段的值为2。
- Type : OSPF报文类型。
- Packet length:表示整个OSPF报文的长度,单位是字节。
- Router ID:表示生成此报文的路由器的Router ID。
- Area ID:表示此报文需要被通告到的区域。
- Checksum:校验字段,其校验的范围是整个OSPF报文,包括OSPF报文头部。
- Auth Type:为0时表示不认证﹔为1时表示简单的明文密码认证﹔为2时表示加密( MD5)认证。
- Authentication :认证所需的信息。该字段的内容随AuType的值不同而不同。
OSPF报文类型
报文名称 | 报文功能 |
---|---|
Hello | 发现和维护邻居关系 |
Database Description | 交互链路状态数据库摘要 |
Link State Request | 请求特定的链路状态信息 |
Link State Update | 发送详细的链路状态信息 |
Link State Ack | 发送确认报文 |
DD、LSR、LSU、LSAck与LSA的关系:
DD报文中包含LSA头部信息,包括LS Type、LSID、Advertising Router、LSSequence Number、Ls Checksum。
LSR中包含LS Type、LS ID和Advertising Router。
LSU中包含完整的LSA信息。
LSAck中包含LSA头部信息,包括LS Type、LS ID、Advertising Router、LSSequence Number、LsChecksum。
OSPF报文的功能需求
功能 | 实现分析 |
---|---|
发现邻居与保持 | Hello机制即可实现 |
LSA同步 | 双方互相发送LSA,完成同步;同时同步速度更快,占用资源更少 |
可靠性 | 确保LSA同步过程的可靠性 |
OSPF的LSDB同步(1)
状态含义:
- ExStart: 邻居状态变成此状态以后,路由器开始向邻居发送DD报文。Master/Slave关系是在此状态下形成的,初始DD序列号也是在此状态下确定的。在此状态下发送的DD报文不包含链路状态描述。
- Exchange :在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文。
- Loading:在此状态下,路由器与邻居之间相互发送LSR报文、LSU报文、LSAck报文。
- Full : LSDB同步过程完成,路由器与邻居之间形成了完全的邻接关系。
OSPF的LSDB同步(2)
RTA开始向RTB发送LSR报文,请求那些在Exchange状态下通过DD报文发现的、并且在本地LSDB中没有的链路状态信息。
RTB向RTA发送LSU报文,LSU报文中包含了那些被请求的链路状态的详细信息。RTA在完成LSU报文的接收之后,会将邻居状态从Loading变为Full。
RTA向RTB发送LSAck报文,作为对LSU报文的确认。RTB收到LSAck报文后,双方便建立起了完全的邻接关系。
OSPF邻居状态机
这是形成邻居关系的过程和相关邻居状态的变换过程。
Down :这是邻居的初始状态,表示没有从邻居收到任何信息。在NBMA网络上,此状态下仍然可以向静态配置的邻居发送Hello报文,发送间隔为PollInterval,通常和Router DeadInterval间隔相同。
Attempt: 此状态只在NBMA网络上存在,表示没有收到邻居的任何信息,但是已经周期性的向邻居发送报文,发送间隔为HelloInterval。如果Router DeadInterval间隔内未收到邻居的Hello报文,则转为Down状态。
Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己不在所收到的Hello报文的邻居列表中,表示尚未与邻居建立双向通信关系。在此状态下的邻居要被包含在自己所发送的Hello报文的邻居列表中。
2-Way Received :此事件表示路由器发现与邻居的双向通信已经开始(发现自己在邻居发送的Hello报文的邻居列表中)。Init状态下产生此事件之后,如果需要和邻居建立邻接关系则进入ExStart状态,开始数据库同步过程,如果不能与邻居建立邻接关系则进入2-Way。
2-Way:在此状态下,双向通信已经建立,但是没有与邻居建立邻接关系。这是建立邻接关系以前的最高级状态。
1-Way Received:此事件表示路由器发现自己没有在邻居发送Hello报文的邻居列表中,通常是由于对端邻居重启造成的。
ExStart:这是形成邻接关系的第一个步骤,邻居状态变成此状态以后,路由器开始向邻居发送DD报文。主从关系是在此状态下形成的;初始DD序列号是在此状态下决定的。在此状态下发送的DD报文不包含链路状态描述。
Exchange :此状态下路由器相互发送包含链路状态信息摘要的DD报文,描述本地LSDB的内容。
Loading:相互发送LS Request报文请求LSA,发送LS Update通告LSA。
Full:两台路由器的LSDB已经同步。
LSA头部
LSA是OSPF链路状态信息的载体。
LSA ( Link State Advertisement )是路由器之间链路状态信息的载体。LSA是LSDB的最小组成单位,也就是说LSDB由一条条LSA构成的。
所有的LSA都拥有相同的头部,关键字段的含义如下︰
- LS age:此字段表示LSA已经生存的时间,单位是秒。
- LS type :此字段标识了LSA的格式和功能。常用的LSA类型有五种。
- Link State ID:此字段是该LSA所描述的那部分链路的标识,例如Router ID等。
- Advertising Router : 此字段是产生此LSA的路由器的Router ID。
- LS sequence number :此字段用于检测旧的和重复的LSA。
LS type,Link State ID和Advertising Router的组合共同标识一条LSA。LSDB中除了自己生成的LSA,另一部分是从邻居路由器接收的。邻居路由器之间相互更新LSA必然需要一个“通道”。
MA网络中的问题
- n×(n-1)/2个邻接关系,管理复杂
- 重复的LSA泛洪,造成资源浪费
问题引出,在运行OSPF的MA网络包括广播型和NBMA网络,会存在两个问题: - 在一个有n个路由器的网络,会形成(n×(n-1))/2个邻接关系。
- 邻居间LSA的泛洪扩散混乱,相同的LSA会被复制多份,如RTA向其邻居RTB、RTC、RTD分别发送一份自己的LSA,RTB与RTC、RTC与RTD、RTB与RTD之间也会形成邻居关系,也会发送RTA的LSA。
这样的工作效率显然是很低的,消耗资源的。作为高级的路由协议,OSPF是怎样解决这些问题的呢?
DR与BDR作用
- 减少邻接关系
- 降低OSPF协议流量
DR ( Designated Router )即指定路由器,其负责在MA网络建立和维护邻接关系并负责LSA的同步。
DR与BDR选举
选举规则:DR/BDR的选举是基于接口的。
- 接口的DR优先级越大越优先
- 接口的DR优先级相等时,Router ID越大越优先
邻居与邻接关系
网络类型 | 是否和邻居建立邻接关系 |
---|---|
P2P | 是 |
Broadcast | DR与BDR、DRother建立邻接关系;BDR与DR、DRother建立邻接关系;DRother之间只建立邻居关系 |
NBMA | DR与BDR、DRother建立邻接关系;BDR与DR、DRother建立邻接关系;DRother之间只建立邻居关系 |
P2MP | 是 |
邻居(Neighbor )关系与邻接(Adjacency)关系是两个不同的概念。OSPF路由器之间建立邻居关系后,进行LSDB同步,最终形成邻接关系。
在P2P网络及P2MP网络上,具有邻居关系的路由器之间会进一步建立邻接关系。
在广播型网络及NBMA网络上,非DR/BDR路由器之间只能建立邻居关系,不能建立邻接关系,非DR/BDR路由器与DR/BDR路由器之间会建立邻接关系,DR与BDR之间也会建立邻接关系。
邻接关系建立完成,意味着LSDB已经完成同步,接下来OSPF路由器将基于LSDB使用SPF算法计算路由。
写一篇文章不容易,喜欢的可以一键三连