OSPF协议
基于链路状态、工作在网络层之上的路由协议
目录
- OSPF报文类型
- OSPF状态机
- OSPF确认机制
- OSPF邻接关系建立与路由计算问题
- OSPF网络类型
- OSPF开销值计算
- 链路状态数据库与LSA
- OSPF域内路由计算
- OSPF域间路由计算
- OSPF外部路由计算
- OSPF特殊区域
- 路由加表优先级
OSPF报文类型
OSPF使用五种类型的报文来建立邻接、同步数据库并计算路由。
-
Hello报文
- 功能:用于发现、建立并维持邻居关系。包含Router ID、区域ID、接口认证等信息。
- 组播地址:
224.0.0.5。
-
数据库描述报文
-
功能:
- 选举主从设备,确保DD报文交换有序。
- 携带链路状态数据库摘要,即LSA头部信息,用于数据库同步。
-
特性:可以包含多个DD报文。携带MTU值,若两端MTU不匹配且开启检测,可能导致邻接建立失败。
-
MTU问题:当MTU不匹配时,邻居状态会卡在
ExStart/ExChange。
-
-
链路状态请求报文
- 功能:在收到邻居的DD报文后,向对方请求本机缺失或需要更新的完整LSA信息。
- 功能:在收到邻居的DD报文后,向对方请求本机缺失或需要更新的完整LSA信息。
-
链路状态更新报文
- 功能:用于回复LSR请求,或主动泛洪更新,包含一个或多个完整的LSA。
- 功能:用于回复LSR请求,或主动泛洪更新,包含一个或多个完整的LSA。
-
链路状态确认报文
- 功能:对收到的LSU报文进行确认,确保LSA的可靠泛洪。确认信息为LSA头部。
- 功能:对收到的LSU报文进行确认,确保LSA的可靠泛洪。确认信息为LSA头部。
OSPF状态机
OSPF邻接建立过程经历一系列状态,以下是关键节点:
-
Down -> Init -> 2-Way
Init:收到对端Hello包,但其中未包含自己的Router ID。2-Way:收到对端Hello包,且其中包含自己的Router ID。邻居关系建立。在广播网络中,此时选举DR/BDR。
-
2-Way -> ExStart
- 邻居关系建立后,立即进入
ExStart状态,通过交换空的DD报文(M=1,MS=1)进行主从选举。Router ID大者为主。
- 邻居关系建立后,立即进入
-
ExStart -> Exchange
- 从设备:在发出第一个携带摘要的DD报文后,状态变为
Exchange。 - 主设备:在接收到从设备的DD报文并回复自己的DD报文后,状态变为
Exchange。双方开始交换完整的数据库摘要。
- 从设备:在发出第一个携带摘要的DD报文后,状态变为
-
Exchange -> Loading
- 摘要交换完成后,双方根据对比结果,向对方发送LSR请求缺失的LSA,状态进入
Loading。同时,使用LSU和LSACK来传输和确认具体的LSA内容。
- 摘要交换完成后,双方根据对比结果,向对方发送LSR请求缺失的LSA,状态进入
-
Loading -> Full
- 所有请求的LSA交换并确认完毕后,邻居状态进入
Full。邻接关系建立完成,可以开始路由计算。
- 所有请求的LSA交换并确认完毕后,邻居状态进入
总结流程:寻找邻居(Init) -> 建立邻居(2-Way) -> 选举主从(ExStart) -> 交换摘要(Exchange) -> 请求并加载详细信息(Loading) -> 完全邻接(Full)。
OSPF确认机制
OSPF通过多种方式确保报文可靠传递:
- Hello报文:周期性发送(默认10秒),通过超时机制(Dead Time,默认40秒)确认邻居存活。
- DD报文:使用序列号和主从关系进行隐式确认。
- 从设备使用主设备的序列号发起请求。
- 主设备以从设备序列号+1进行回复。
- 从设备使用主设备的序列号发起请求。
- LSR报文:通过接收对应的
LSU报文进行确认。 - LSU报文:通过接收
LSACK报文进行显式确认。若超时未收到确认,则重传。
OSPF邻接关系建立与路由计算问题
邻接建立失败常见原因
- 接口网络类型不一致(如一端为广播,另一端为点对点)。
- 区域ID不一致。
- Router ID冲突。
- 接口MTU不匹配且开启了检测。
- 认证类型或密钥不匹配。
- Hello/Dead时间间隔不一致。
- 接口被配置为静默接口。
- 网络掩码不匹配(仅在广播/NBMA网络中有影响)。
- 链路层故障。
邻接建立成功但路由计算失败
- 网络类型不匹配导致LSA缺失:例如,一端为点对点,另一端为广播。点对点端不产生2类LSA,导致广播端设备无法正确计算路由。
- 静默接口:接口被静默后,不收发OSPF报文,但该接口所在网段仍会被通告(生成1类LSA)。邻居无法建立,路由自然无法通过该接口计算。
OSPF网络类型
OSPF接口网络类型决定了其行为方式,特别是邻居发现和DR选举。
| 网络类型 | 默认链路协议 | DR/BDR选举 | Hello/Dead时间 | 组播地址 |
|---|---|---|---|---|
| 广播 | 以太网 | 是 | 10s/40s | 224.0.0.5, 224.0.0.6 |
| 点到点 | PPP/HDLC | 否 | 10s/40s | 224.0.0.5 |
| NBMA | 帧中继/ATM | 是 | 30s/120s | 单播 (需手动指定peer) |
| 点到多点 | 无默认,常手动配置 | 否 | 30s/120s | Hello: 224.0.0.5; 其他: 单播 |
广播网络类型详解
在广播网络中,DR和BDR的交互至关重要。
- DR/BDR选举:基于接口优先级(默认1)和Router ID(越大越优)。优先级为0不参与选举。
- 通信流程:
Drother之间保持2-Way状态。- 所有路由器与
DR/BDR建立Full状态。 - 所有路由器向
DR和BDR发送组播地址224.0.0.6。 DR向所有其他路由器(224.0.0.5)泛洪更新。
- 交互示例:
Drother更新:发送至224.0.0.6(DR/BDR)。DR更新:发送至224.0.0.5(所有OSPF路由器)。
OSPF开销值计算
-
计算公式:
接口Cost = 参考带宽 / 接口实际带宽。参考带宽默认为100 Mbps。- 结果小于1时取1。
- 最终路径开销是数据传出方向的沿途出接口Cost累加值。
-
修改方法:
- 直接修改接口Cost:
[接口视图] ospf cost <值>。 - 修改参考带宽:
[OSPF视图] bandwidth-reference <值>(区域内所有路由器需一致)。 - 环回接口的默认Cost为0。
- 直接修改接口Cost:
-
静默接口:配置后,接口不收发OSPF报文,但其网络仍会被通告。
- 作用:常用于避免在特定接口(如连接终端的接口)上建立不必要的邻居关系,或解决次优路径问题。
- 配置:
# 黑名单模式(推荐) [ospf-1] silent-interface GigabitEthernet 0/0 # 白名单模式 [ospf-1] silent-interface all [ospf-1] undo silent-interface GigabitEthernet 0/1
- 作用:常用于避免在特定接口(如连接终端的接口)上建立不必要的邻居关系,或解决次优路径问题。
链路状态数据库与LSA
LSDB同步原则:
- 触发更新:当链路状态发生变化时。
- 周期更新:每条LSA的老化时间(
Age)达到1800秒时,始发路由器会重新泛洪一次,刷新Age。最大Age为3600秒。
LSA头部与三要素
所有LSA拥有公共的头部,其中关键字段包括:
- LS Type:LSA类型。
- Link State ID:LSA标识符。
- Advertising Router:始发路由器Router ID。
LSA三要素:
LS Type+Link State ID+Advertising Router共同唯一标识一条LSA。
OSPF域内路由计算
路由器使用SPF算法,以自己为根,计算到达所有网络的最短路径树。
1类LSA
- 功能:描述路由器自身的直连链路状态,并标识自身角色(如ABR、ASBR)。
- 内容:
- StubNet Link:描述一条直连路由(叶子)。包含网络号、掩码和开销。
- P-2-P Link:描述一个点对点邻居(树干)。包含邻居Router ID、本地接口IP和开销。
- StubNet Link:描述一条直连路由(叶子)。包含网络号、掩码和开销。
2类LSA
- 产生条件:仅在广播或NBMA网络中,由DR产生。
- 功能:描述一个伪节点,代表该多路访问网络本身。包含该网络掩码和所有连接到此DR的路由器列表(Attached Router)。
- 伪节点的Cost为0。1类和2类LSA仅在区域内泛洪。
OSPF域间路由计算
区域设计原则
- 骨干区域(Area 0)必须存在且唯一。
- 所有非骨干区域必须与骨干区域直接相连。
3类LSA
- 产生者:区域边界路由器。
- 功能:描述域间路由信息。ABR将一个区域内的最优路由(由1/2类LSA计算得出)转换为3类LSA,泛洪到其他区域。
- 关键规则(防环):
- ABR不会将非骨干区域的3类LSA注入骨干区域。
- ABR只将骨干区域的3类LSA注入非骨干区域。
- 区域内路由(1/2类)优先级高于域间路由(3类),即使后者Cost更优。
ABR
- 定义:连接多个区域,且在骨干区域至少有一个活跃接口的路由器。
- 功能:汇总并传递3类LSA。其1类LSA中
B-bit(Border位)被置位,标识其ABR身份。
虚链路
- 作用:
- 将非骨干区域逻辑连接到骨干区域(解决区域0被分割问题)。
- 提供一条经过非骨干区域的骨干区域路径(优化Cost)。
- 限制:只能穿越一个非骨干区域,且不能穿越特殊区域。
OSPF外部路由计算
5类LSA
- 产生者:自治系统边界路由器。
- 功能:描述引入到OSPF的外部路由(如静态路由、直连路由或其他协议路由)。在整个OSPF域内泛洪。
- 关键字段:
- E Type:开销值类型。
- Type 1:外部开销 + 内部到达ASBR的开销。
总开销 = 种子度量值 + 内部开销。 - Type 2(默认):仅考虑外部种子度量值。
总开销 = 种子度量值。
- Type 1:外部开销 + 内部到达ASBR的开销。
- Forwarding Address:转发地址。若非0.0.0.0,则数据包直接发往FA地址而非ASBR,用于优化路径。
- E Type:开销值类型。
4类LSA
- 产生者:ABR。
- 功能:描述如何到达ASBR。当ASBR不在本区域时,ABR会生成4类LSA,指明到达该ASBR的路径和开销。
- 关系:有5类LSA不一定有4类LSA(ASBR在同一个区域时,无需4类LSA)。有4类LSA一定有5类LSA。
默认路由注入
- 在ASBR上配置
default-route-advertise,可将缺省路由以5类LSA形式注入OSPF域。 - 使用
always参数,即使本机路由表无默认路由,也会强制下发。
OSPF特殊区域
用于减少非骨干区域内的LSA数量,优化设备性能。主要通过过滤特定LSA实现。
| 区域类型 | 功能描述 | 泛洪的LSA类型 | ABR下发的缺省路由类型 |
|---|---|---|---|
| 骨干区域/普通区域 | 标准区域,泛洪所有LSA | 1, 2, 3, 4, 5 | 无 |
| Stub区域 | 过滤4、5类LSA | 1, 2, 3 | 3类LSA (自动) |
| Totally Stub区域 | 过滤3, 4, 5类LSA | 1, 2 | 3类LSA (自动) |
| NSSA区域 | 过滤4、5类LSA,但允许引入外部路由(以7类LSA形式) | 1, 2, 3, 7 | 7类LSA (通常需手动default-route-advertise) |
| Totally NSSA区域 | 过滤3, 4, 5类LSA,允许引入外部路由(7类) | 1, 2, 7 | 3类LSA (自动) & 7类LSA |
关键特性对比
- Option字段:
E-bit:处理5类LSA能力。Stub和NSSA区域该位为0。N-bit:处理7类LSA能力。仅NSSA区域该位为1。
- 7类LSA:
- 仅在NSSA区域内泛洪。
- 由NSSA区域的ABR转换为5类LSA后,泛洪到其他区域。通常由Router ID最大的ABR执行转换。
- FA地址通常不为0,以优化路径。
- 多ABR问题:Stub/NSSA区域存在多个ABR时,每个ABR都会下发缺省路由,可能导致区域内设备负载分担,引发次优路径。需通过调整接口Cost、缺省路由Cost或路由策略进行干预。
OSPF路由加表优先级
域内路由 > 域间路由 > 外部路由Type1 > 外部路由Type2 > NSSA区域外部路由Type1 > NSSA区域外部路由Type2
相同优先级,比开销。如果开销一直,则进行等价多路径负载均衡(默认最多4条)。
MTU不一致会导致OSPF协商失败,什么场景要改MTU?
问题现象:如标题所述,当OSPF接口MTU不匹配且开启检测时,邻居状态会卡在ExStart或ExChange,导致邻接无法建立。
问题根源:OSPF在ExStart状态交换DD报文进行主从选举时,报文中会携带本接口的MTU值。如果对端接口的MTU值小于此值,且开启MTU检测(某些厂商默认开启,如思科;华为/华三默认不检测),对端将拒绝处理此报文,导致协商失败。
那么,什么情况下我们需要主动修改接口的MTU值?
核心场景:隧道封装。这是最常见且最重要的原因,如GRE隧道场景。
-
原理分析:
- 标准以太网的MTU默认是1500字节,这意味着一个数据帧所能承载的IP报文最大为1500字节。
- 当我们在两个站点间建立GRE隧道时,原始IP报文(假设正好1500字节)会被封装上新的GRE头部和外层IP头部。这使得报文总长度超过了1500字节。
- 当这个“变胖”的报文被发送到物理接口(MTU=1500)时,接口会发现它超出了自己的MTU限制,从而触发IP分片。报文被拆分成多个片段传输。
-
分片带来的危害(为什么需要优化):
- 性能下降:分片和重组需要消耗CPU和内存资源。
- 可靠性降低:任何一个分片丢失,整个原始报文都需要重传,增加了丢包率和网络延迟。
- 潜在兼容性问题:某些网络设备或安全策略可能阻止分片报文。
-
解决方案:
- 为了避免隧道报文在传输过程中被分片,常见的优化手段是调小隧道接口及路径上相关物理接口的MTU值。
- 调整方法:将隧道接口及其底层物理接口的MTU值设置为
1500 - (隧道封装开销)。对于GRE over IP,开销通常是24字节(新IP头20字节 + GRE头4字节),因此MTU常设置为 1476。# 例如,在物理接口和隧道接口上均进行设置 [H3C-GigabitEthernet0/1] mtu 1476 [H3C-Tunnel0] mtu 1476
-
对其他隧道类型的延伸:
- IPsec VPN:封装开销更大(ESP隧道模式通常增加约50-60字节),因此需要设置更小的MTU(如1400)。
- VXLAN:封装开销巨大(超过50字节),在数据中心Underlay网络中需要将MTU设置为1600或更高(通常称为“巨型帧”),以容纳封装后的报文。
结论: 在部署GRE、IPsec、VXLAN等隧道技术时,预先规划和统一配置隧道路径上所有设备的MTU值,是保证网络稳定性和性能的最佳实践。这也解释了为什么在某些网络环境中,我们需要关注并调整OSPF接口的MTU,它不仅是OSPF邻接建立的一个检查项,更是整个网络数据平面能否高效转发的基础。当OSPF运行在隧道接口上时,确保隧道两端MTU一致且大小合理,就尤为关键。
为什么OSPF外部路由引入开销默认Type2?
大多数情况下,广域网(外部)的链路开销非常大,而局域网内部(OSPF 域内)的开销相对微乎其微。因此,OSPF 默认使用 Type 2,这样路由表看起来更简洁,不需要因为内部链路的微小波动而频繁更新外部路由。
笔记内容排版经过AI优化。如有问题,感谢指正。内容仅供参考,请仔细甄别。