前言
静态路由需要手动配置,不能动态感知网络拓扑发生的变化,当网络规模变大时,配置相当的麻烦,制约了其在现网中的应用。
动态路由协议因其灵活性高、可靠性好、易于扩展等特点被广泛应用于现网。在动态路由协议之中,OSPF(Open Shortest Path First,开放式最短路径优先)协议是使用场景非常广泛的动态路由协议之一。
动态路由的分类:
1.按区域分:
- IGP(Interior Gateway Protocols,内部网关协议)如RIP、OSPF、ISIS
- EGP(Exterior Gateway Protocols,外部网关协议)如BGP
内部网络在于路由的发现,外部路由重点在路由的传递!!!
2.按工作机制分:
- Distance Vector Routing Protocols,距离矢量路由协议 如RIP 运行距离矢量路由协议的路由器周期性的泛洪自己的路由表。通过路由的交互,每台路由器都从相邻的路由器学习到路由,并且加载进自己的路由表中。 对于网络中的所有路由器而言,路由器并不清楚网络的拓扑,只是简单的知道要去往某个目的方向在哪里,距离有多远。
- Link-State Routing Protocols,链路状态路由协议)如OSPF、ISIS 链路状态路由协议通告的的是链路状态而不是路由表。运行链路状态路由协议的路由器之间首先会建立一个协议的邻居关系,然后彼此之间开始交互LSA(Link State Advertisement,链路状态通告)。LSA描述了路由器接口的状态信息,例如接口的开销、连接的对象等。每台路由器都会产生LSAs,路由器将接收到的LSAs放入自己的LSDB(Link State DataBase,链路状态数据库)。路由器通过LSDB,掌握了全网的拓扑。
LSAs是指链路状态广告(Link State Advertisement),它是Open Shortest Path First (OSPF)协议中的一种消息格式。LSA包含路由器关于邻居和网络拓扑信息的详细描述,路由器使用LSAs来构建一个完整的OSPF拓扑图,以便计算最优路径和进行路由选择。每个路由器通过产生自己的LSAs来描述自己的状态,并将这些LSAs发送到相邻的路由器,最终构建整个网络的链路状态数据库。
每台路由器基于LSDB,使用SPF(Shortest Path First,最短路径优先)算法进行计算得到一棵以自己为根的、无环的、拥有最短路径的“树”。有了这棵“树”,路由器就已经知道了到达网络各个角落的优选路径。
最后,路由器将计算出来的优选路径,加载进自己的路由表(Routing Table)。
OSPF协议原理
概述
OSPF(Open Shortest Path First,开放式最短路径优先协议)是典型的链路状态路由协议,是目前业内使用非常广泛的IGP协议之一。
目前针对IPv4协议使用的是OSPF Version 2(RFC2328);针对IPv6协议使用OSPF Version 3(RFC2740)。
OSPF有以下优点:
- 基于SPF算法,以“累计链路开销”作为选路参考值
- 采用组播形式收发部分协议报文
- 支持区域划分
- 支持对等价路由进行负载分担
- 支持报文认证。
基本术语
1.router id:设备的唯一标识,可以手动(全局或进程)配置,也可以设备自动选择(优先选用loopback0地址最大的 或者物理接口地址最大的)
Loopback口是计算机网络中的一种虚拟接口,通常被称为"回环接口"或"本地回环接口"。它是一个特殊的网络接口,用于将数据包发送到本地主机上,而不经过物理网络
2.OSPF区域:
OSPF Area用于标识一个OSPF的区域。 区域是从逻辑上将设备划分为不同的组,每个组用区域号(Area ID)来标识。 OSPF的区域ID是一个32bit的非负整数,按点分十进制的形式(与IPv4地址的格式一样)呈现,例如Area0.0.0.1。为了简便起见,我们也会采用十进制的形式来表示。
只有在相同区域的设备才能建立邻居,理论上有43亿个区域标识。
3.度量值:
OSPF使用Cost(开销)作为路由的度量值。每一个激活了OSPF的接口都会维护一个接口Cost值。 OSPF以“累计cost”为开销值,也就是流量从源网络到目的网络所经过所有路由器的出接口的cost总和。
下车买票,从设备的接口出来的时候才计算。
cost=参考带宽/接口带宽 , 计算的时候会向上取整。(不同设备的参考带宽应设置一致,否则计算时会有错误)
4.三大表项:
1.OSPF邻居表: OSPF在传递链路状态信息之前,需先建立OSPF邻居关系。 OSPF的邻居关系通过交互Hello报文建立。 OSPF邻居表显示了OSPF路由器之间的邻居状态,使用display ospf peer查看。
2.LSDB LSDB会保存自己产生的及从邻居收到的LSA信息。 使用命令行display ospf lsdb查看LSDB表。
3.OSPF路由表 :OSPF路由表和路由器路由表是两张不同的表。 OSPF路由表包含Destination、Cost和NextHop等指导转发的信息。 使用命令display ospf routing查看OSPF路由表。
OSPF报文:
OSPF一共定义了5种类型的报文,不同类型的OSPF报文有相同的头部格式。 OSPF报文直接采用IP封装,在报文的IP头部中,协议号为89。
- hello 发送和维护邻居关系
- Database Description 交互链路状态数据库摘要
- Link State Request 请求特定的链路状态信息
- Link State Update 发送详细的链路状态信息
- Link State Ack 确认LSA
五种报文有一个共同的头部!
OSPF工作过程
- 发现邻居
- 协商主从
- 交互LSDB
- 更新LSA
- 同步双方的LSDB
- 计算路由
1.建立邻居关系
OSPF使用Hello报文发现和建立邻居关系。
在以太网链路上,缺省时,OSPF采用组播的形式发送Hello报文(目的地址224.0.0.5)。
OSPF Hello报文中包含了路由器的Router ID、邻居列表等信息。
down和2-way是稳定状态!
hello报文
作用:
- 发现邻居路由器
- 完成参数协商,建立邻居关系
- 周期性发送和接收,检测邻居运行状态。
hello报文格式:
字段解释
- Network Mask:发送Hello报文的接口的网络掩码。
- HelloInterval:发送Hello报文的时间间隔。通常为10s。
- RouterDeadInterval:失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。通常为40s。
- Neighbor:邻居,以Router ID标识。
- E:是否支持外部路由
- MC:是否支持转发组播数据包
- N/P:是否为NSSA区域
- Router Priority:DR优先级。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举。 Designated Router:DR的接口地址。
- Backup Designated Router:BDR的接口地址。
建立邻居的过程,在40秒的时间内就会选出DR、BDR。
为什么要选DR、BDR?
- 在广播型网络中,如果建立全互联,上图中5台设备就需要5*(5-1)/2=10条路由链路,造成LSA泛洪浪费,消耗网络资源,而且进行SPF树计算时也具有较大的难度,因此在一个OSPF区域内就会选择一台DR(Designated Router,指定路由器)负责在MA网络建立和维护邻接关系并负责LSA的同步。 DR与其他所有路由器形成邻接关系并交换链路状态信息,其他路由器之间不直接交换链路状态信息。
- 为了规避单点故障风险,还会选举BDR(Backup Designated Router,备份指定路由器) ,在DR失效时快速接管DR的工作。
DR/BDR的选举是基于接口的。 接口的DR优先级越大越优先。 接口的DR优先级相等时,Router ID越大越优先。
DR/BDR的选举是非抢占式的。为了保持网络的稳定,当DR出现故障后,BDR会接管DR工作,其他设备就算优先级再大也不能直接称为DR。
DR是指接口是DR而不是设备。
2.建立邻接关系(DD报文)
OSPF DD(Database Description)报文描述了本地LSDB的摘要信息,用于两台路由器进行数据库同步。
第一个DD报文是用来主从选举 MS 为1是主,是0为从。
交互DD报文的时候使用的是主设备的序列号。
DD报文
- Interface MTU:指示在不分片的情况下,此接口最大可发出的IP报文长度。在两个邻居发送DD报文中包含MTU参数,如果收到的DD报文中MTU和本端的MTU不相等,则丢弃该DD报文。缺省情况下,华为设备未开启MTU检查。
- I:当发送连续多个DD报文时,如果这是第一个DD报文,则置为1,否则置为0。
- M (More):当发送连续多个DD报文时,如果这是最后一个DD报文,则置为0。否则置为1,表示后面还有其他的DD报文。
- MS (Master/Slave):当两台OSPF路由器交换DD报文时,首先需要确定双方的主从关系,Router ID大的一方会成为Master。当值为1时表示发送方为Master。
- DD sequence number:DD报文序列号。主从双方利用序列号来保证DD报文传输的可靠性和完整性。
- Optinons:字段同Hello报文。
3.路由计算
同一个区域中的所有路由器拥有完全一致的LSDB,每个LSDB中有多个LSA。
LSA是OSPF路由计算的关键依据。
LSU可以携带多种LSA。
LSA的类型:
- Type1:Router-LSA,每个路由器都会产生,描述了路由器的链路状态和花费,在所属的区域内传播。
- Type2:Network-LSA,由广播网或NBMA网络中的DR产生,Network-LSA中记录了这一网络上所有路由器的Router ID,描述本网段的链路状态,在所属的区域内传播。
- Type3:Network-summary-LSA,描述区域内所有网段的路由,并通告给其他相关区域。Type3和Type4的LSA有相同的格式,它们都是由ABR产生。
- Type4:ASBR-summary-LSA,描述到ASBR的路由,通告给除ASBR所在区域的其他相关区域。Type3和Type4的LSA有相同的格式,它们都是由ABR产生。
- Type5:AS-External-LSA,由ASBR产生,描述到AS外部的路由,这是五种LSA中,唯一一种通告到所有区域(除了Stub区域和NSSA区域)的LSA。Type5的LSA可以用来通告缺省路由,此时Link State ID和Network Mask都设置为0.0.0.0。
- Type7:NSSA-LSA。
各种不同的LSA具有相同的头部:
字段解释
LS Age(链路状态老化时间):此字段表示LSA已经生存的时间,单位是秒。LS age 最大生存时间 3600
Options(可选项):每一个bit都对应了OSPF所支持的某种特性。
LS Type(链路状态类型):指示本LSA的类型。
Link State ID(链路状态ID):不同的LSA,对该字段的定义不同。
Advertising Router(通告路由器):产生该LSA的路由器的Router ID。
LS Sequence Number(链路状态序列号):当LSA每次有新的实例产生时,序列号就会增加。
LS Checksum(校验和):用于保证数据的完整性和准确性。
3.1区域内路由计算
Router-LSA(1类LSA):每个路由器都会产生,描述了路由器的链路状态和花费,在所属的区域内传播。
为区域产生,泛洪范围在区域内。
字段解释:
V (Virtual Link ) :如果产生此LSA的路由器是虚连接的端点,则置为1。
E (External ): 如果产生此LSA的路由器是ASBR,则置为1。
B (Border ):如果产生此LSA的路由器是ABR,则置为1。
links :LSA中的Link(链路)数量。
Router LSA使用Link来承载路由器直连接口的信息。 每条Link均包含“链路类型”、“链路ID”、“链路数据”以及“度量值”这几个关键信息。 路由器可能会采用一个或者多个Link来描述某个接口。
链路类型:
- Point-to-Point(P2P):描述一个从本路由器到邻居路由器之间的点到点链路,属于拓扑信息(连接的是真实节点)
- TransNet:描述一个从本路由器到一个Transit网段(例如MA或者NBMA网段)的连接,属于拓扑信息(连接的是伪节点(交换机))
- StubNet:描述一个从本路由器到一个Stub网段(例如Loopback接口)的连接,属于网段信息(连接的是末节网络(叶子结点))
Type | Link ID | Date |
TransNet | DR的地址 | 本端的接口地址 |
StubNet | 网络号 | 掩码 |
P2P | 对端的Router ID | 本端的接口地址 |
V-link | 对端的Route ID | 本端的接口地址 |
Network LSA(2类LSA)
由DR产生,描述本网段的链路状态,在所属的区域内传播。 Network LSA 记录了该网段内所有与DR建立了邻接关系的OSPF路由器,同时携带了该网段的网络掩码。
构建SPF树。(构建过程相对复杂,请参考其他文献)
3.2区域间路由计算
Router LSA和Network LSA只在区域内泛洪,因此通过区域划分在一定程度上降低网络设备的内存及CPU的消耗。
划分区域后,路由器可以分为两种角色:
- 区域内部路由器(Internal Router):该类设备的所有接口都属于同一个OSPF区域。
- 区域边界路由器(Area Border Router,ABR):该类设备接口分别连接两个及两个以上的不同区域。
OSPF区域间路由信息传递是通过ABR产生的Network Summary LSA(3类LSA)实现的。
构建SPF树。
- 区域间的防环机制:
1.OSPF要求所有的非骨干区域必须与Area0直接相连,区域间路由需经由Area0中转。
2.从骨干区域学习到的3类LSA不能回到骨干区域
3.ABR不能使用从非骨干区域学习到的3类LSA选路 :
- 虚链路:
OSPF要求骨干区域必须是连续的,但是并不要求物理上连续,可以使用虚连接使骨干区域在逻辑上连续。 虚连接可以在任意两个ABR上建立,但是要求这两个ABR都有端口连接到一个相同的非骨干区域。
配置:
R1:vlink peer 1.1.1.1
R5:vlink peer 5.5.5.5 直接指向ABR
不建议使用,规划不好容易产生环路。
3.3外部路由计算
网络中存在部分链路未开启OSPF协议如: 路由器连接外部网络使用静态路由或者BGP协议; 服务器直连的链路未开启OSPF协议。
ASBR(AS Boundary Router):自治系统边界路由器。只要一台OSPF设备引入了外部路由,它就成为了ASBR。
ASBR将外部路由信息以AS-external LSA(5类LSA)的形式在OSPF网络内泛洪。
AS-external LSA(5类LSA):由ASBR产生,描述到达AS外部的路由,该LSA会被通告到所有的区域(除了Stub区域和NSSA区域)。
字段解释:
Link State ID:外部路由的目的网络地址。
Advertising Router:生成该LSA的Router ID。
Network Mask:网络掩码。
E :该外部路由所使用的度量值类型
0:度量值类型为Metric-Type-1
1:度量值类型为Metric-Type-2
metric:到目的网络的路由开销。
Forwarding Address(FA):到所通告的目的地址的报文将被转发到这个地址。。
Metric-Type-1 当外部路由的开销与自治系统内部的路由开销相当,并且和OSPF自身路由的开销具有可比性时,可以认为这类路由的可信程度较高,将其配置成Metric-Type-1。 Metric-Type-1外部路由的开销为AS内部开销(路由器到ASBR的开销)与AS外部开销之和。
Metric-Type-2 当ASBR到AS之外的开销远远大于在AS之内到达ASBR的开销时,可以认为这类路由的可信程度较低,将其配置成Metric-Type-2。 Metric-Type-2外部路由的开销等于AS外部开销
ASBR-Summary LSA(4类LSA):由ABR产生,描述到ASBR的路由,通告给除ASBR所在区域的其他相关区域。
4类LSA和3类报文一样,只是表示的作用不一样。
路由优先:
1、2>3>5 5类type1优于TYpe2
OSPF特殊区域
在一个大型网络中,OSPF路由器通常需要同时维护由域内路由、域间路由、外部路由构成的数据库。当网络规模不断扩大时,LSDB规模也不断增长。如果某区域不需要为其他区域提供流量中转服务,那么该区域内的路由器就没有必要维护本区域外的链路状态信息。
OSPF通过划分区域可以减小区域内路由器LSDB的规模,对于那些位于自治系统(AS)边界的非骨干区域的低端路由器来说仍然无法承受,通过OSPF的特殊区域特性可以进一步减少LSA数量和路由表规模。
OSPF的区域可分为两种类型:
- 传输区域(Transit Area):除了承载本区域发起的流量和访问本区域的流量外,还承载了源IP和目的IP都不属于本区域的流量,即“穿越型流量”。
- 末端区域(Stub Area):只承载本区域发起的流量和访问本区域的流量。
1.Stub区域(没有5类LSA)
Stub区域的ABR不向Stub区域内传播它接收到的AS外部路由。
Stub区域中路由器的LSDB、路由表规模都会大大减小。
为保证Stub区域能够到达AS外部,Stub区域的ABR将生成一条缺省路由(使用3类LSA描述)。
配置Stub区域时需要注意下列几点:
- 骨干区域不能被配置为Stub区域。
- Stub区域中的所有路由器都必须将该区域配置为Stub。
- Stub区域内不能引入也不接收AS外部路由。
- 虚连接不能穿越Stub区域
2.total stub:
Totally Stub区域既不允许AS外部路由在本区域内传播,也不允许区域间路由在本区域内传播。 Totally Stub区域内的路由器通过本区域ABR下发的缺省路由(使用3类LSA描述)到达其他区域,以及AS外部。
配置Totally Stub区域时需要注意:
- 与Stub区域配置的区别在于,在ABR上需要追加no-summary关键字。
- Totally Stub区域访问其他区域及AS外部是通过默认路由实现的。
- AS外部、其他OSPF区域的拓扑及路由变化不会导致Totally Stub区域内的路由器进行路由重计算,减少了设备性能浪费。
3.NSSA区域能够引入外部路由,同时又不会学习来自OSPF网络其它区域引入的外部路由。
在NSSA区域的ABR,可以将7类转换为5类LSA
如果有多个ABR 由RD大的转发LSA
路由器对LSA处理原则
OSPF通过交互LSA实现链路状态数据库同步,路由器收到LSA后,按照以下原则处理:
- 如果收到的LSA本地没有,则更新LSDB并泛洪该LSA。
- 如果本地LSDB已存在该LSA,但是收到的更新,则更新LSDB并泛洪该LSA。
- 如果收到的LSA和LSDB中相同,则忽略,并终止泛洪。
- 如果收到的LSA损坏,例如Checksum错误,则不接收该LSA。
路由汇总
路由汇总又被称为路由聚合,即是将一组前缀相同的路由汇聚成一条路由,从而达到减小路由表规模以及优化设备资源利用率的目的,我们把汇聚之前的这组路由称为精细路由或明细路由,把汇聚之后的这条路由称为汇总路由或聚合路由。