OSPF协议笔记整理

42 阅读13分钟

OSPF协议

基于链路状态、工作在网络层之上的路由协议


目录

  1. OSPF报文类型
  2. OSPF状态机
  3. OSPF确认机制
  4. OSPF邻接关系建立与路由计算问题
  5. OSPF网络类型
  6. OSPF开销值计算
  7. 链路状态数据库与LSA
  8. OSPF域内路由计算
  9. OSPF域间路由计算
  10. OSPF外部路由计算
  11. OSPF特殊区域
  12. 路由加表优先级

OSPF报文类型

OSPF使用五种类型的报文来建立邻接、同步数据库并计算路由。

  1. Hello报文

    • 功能:用于发现、建立并维持邻居关系。包含Router ID、区域ID、接口认证等信息。
    • 组播地址224.0.0.5HELLO报文.png
  2. 数据库描述报文

    • 功能

      1. 选举主从设备,确保DD报文交换有序。
      2. 携带链路状态数据库摘要,即LSA头部信息,用于数据库同步。
    • 特性:可以包含多个DD报文。携带MTU值,若两端MTU不匹配且开启检测,可能导致邻接建立失败。 DD报文.png

    • MTU问题:当MTU不匹配时,邻居状态会卡在ExStart/ExChange

  3. 链路状态请求报文

    • 功能:在收到邻居的DD报文后,向对方请求本机缺失或需要更新的完整LSA信息LSR报文.png
  4. 链路状态更新报文

    • 功能:用于回复LSR请求,或主动泛洪更新,包含一个或多个完整的LSALSU报文.png
  5. 链路状态确认报文

    • 功能:对收到的LSU报文进行确认,确保LSA的可靠泛洪。确认信息为LSA头部。 LSACK报文.png

OSPF状态机

OSPF邻接建立过程经历一系列状态,以下是关键节点:

DD_state.png

  1. Down -> Init -> 2-Way

    • Init:收到对端Hello包,但其中未包含自己的Router ID。
    • 2-Way:收到对端Hello包,且其中包含自己的Router ID。邻居关系建立。在广播网络中,此时选举DR/BDR。
  2. 2-Way -> ExStart

    • 邻居关系建立后,立即进入ExStart状态,通过交换空的DD报文M=1,MS=1)进行主从选举。Router ID大者为主。
  3. ExStart -> Exchange

    • 从设备:在发出第一个携带摘要的DD报文后,状态变为Exchange
    • 主设备:在接收到从设备的DD报文并回复自己的DD报文后,状态变为Exchange。双方开始交换完整的数据库摘要。
  4. Exchange -> Loading

    • 摘要交换完成后,双方根据对比结果,向对方发送LSR请求缺失的LSA,状态进入Loading。同时,使用LSULSACK来传输和确认具体的LSA内容。
  5. Loading -> Full

    • 所有请求的LSA交换并确认完毕后,邻居状态进入Full邻接关系建立完成,可以开始路由计算。

总结流程:寻找邻居(Init) -> 建立邻居(2-Way) -> 选举主从(ExStart) -> 交换摘要(Exchange) -> 请求并加载详细信息(Loading) -> 完全邻接(Full)。

OSPF确认机制

OSPF通过多种方式确保报文可靠传递:

  1. Hello报文:周期性发送(默认10秒),通过超时机制(Dead Time,默认40秒)确认邻居存活。
  2. DD报文:使用序列号和主从关系进行隐式确认
    • 从设备使用主设备的序列号发起请求。 DDseq隐式确认从.png
    • 主设备以从设备序列号+1进行回复。 DDseq隐式确认主.png
  3. LSR报文:通过接收对应的LSU报文进行确认。
  4. LSU报文:通过接收LSACK报文进行显式确认。若超时未收到确认,则重传。

OSPF邻接关系建立与路由计算问题

邻接建立失败常见原因

  1. 接口网络类型不一致(如一端为广播,另一端为点对点)。
  2. 区域ID不一致。
  3. Router ID冲突。
  4. 接口MTU不匹配且开启了检测。
  5. 认证类型或密钥不匹配。
  6. Hello/Dead时间间隔不一致。
  7. 接口被配置为静默接口。
  8. 网络掩码不匹配(仅在广播/NBMA网络中有影响)。
  9. 链路层故障。

邻接建立成功但路由计算失败

  1. 网络类型不匹配导致LSA缺失:例如,一端为点对点,另一端为广播。点对点端不产生2类LSA,导致广播端设备无法正确计算路由。
  2. 静默接口:接口被静默后,不收发OSPF报文,但该接口所在网段仍会被通告(生成1类LSA)。邻居无法建立,路由自然无法通过该接口计算。

OSPF网络类型

OSPF接口网络类型决定了其行为方式,特别是邻居发现和DR选举。

网络类型默认链路协议DR/BDR选举Hello/Dead时间组播地址
广播以太网10s/40s224.0.0.5, 224.0.0.6
点到点PPP/HDLC10s/40s224.0.0.5
NBMA帧中继/ATM30s/120s单播 (需手动指定peer)
点到多点无默认,常手动配置30s/120sHello: 224.0.0.5; 其他: 单播

广播网络类型详解

在广播网络中,DR和BDR的交互至关重要。

  • DR/BDR选举:基于接口优先级(默认1)和Router ID(越大越优)。优先级为0不参与选举。
  • 通信流程
    • Drother之间保持2-Way状态。
    • 所有路由器与DR/BDR建立Full状态。
    • 所有路由器向DRBDR发送组播地址224.0.0.6
    • DR向所有其他路由器(224.0.0.5)泛洪更新。
  • 交互示例拓扑.png
    • Drother更新:发送至224.0.0.6 (DR/BDR)。 R1_update.png
    • DR更新:发送至224.0.0.5 (所有OSPF路由器)。 R4_update.png

OSPF开销值计算

  1. 计算公式接口Cost = 参考带宽 / 接口实际带宽。参考带宽默认为100 Mbps。

    • 结果小于1时取1。
    • 最终路径开销是数据传出方向的沿途出接口Cost累加值
  2. 修改方法

    • 直接修改接口Cost[接口视图] ospf cost <值>
    • 修改参考带宽[OSPF视图] bandwidth-reference <值> (区域内所有路由器需一致)。
    • 环回接口的默认Cost为0。
  3. 静默接口:配置后,接口不收发OSPF报文,但其网络仍会被通告

    • 作用:常用于避免在特定接口(如连接终端的接口)上建立不必要的邻居关系,或解决次优路径问题。 静默接口作用.png
    • 配置
      # 黑名单模式(推荐)
      [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头部信息.png LSA三要素LS Type + Link State ID + Advertising Router 共同唯一标识一条LSA。 LSA标识.png

OSPF域内路由计算

路由器使用SPF算法,以自己为根,计算到达所有网络的最短路径树。

1类LSA

  • 功能:描述路由器自身的直连链路状态,并标识自身角色(如ABR、ASBR)。
  • 内容
    • StubNet Link:描述一条直连路由(叶子)。包含网络号、掩码和开销。 1类LS信息.png
    • P-2-P Link:描述一个点对点邻居(树干)。包含邻居Router ID、本地接口IP和开销。 1类LS信息-邻居.png

2类LSA

  • 产生条件:仅在广播或NBMA网络中,由DR产生。
  • 功能:描述一个伪节点,代表该多路访问网络本身。包含该网络掩码和所有连接到此DR的路由器列表(Attached Router)。 TransNet.png
  • 伪节点的Cost为0。1类和2类LSA仅在区域内泛洪。

OSPF域间路由计算

区域设计原则

  1. 骨干区域(Area 0)必须存在且唯一。
  2. 所有非骨干区域必须与骨干区域直接相连。

3类LSA

  • 产生者区域边界路由器
  • 功能:描述域间路由信息。ABR将一个区域内的最优路由(由1/2类LSA计算得出)转换为3类LSA,泛洪到其他区域。 三类LSA.png
  • 关键规则(防环)
    1. ABR不会将非骨干区域的3类LSA注入骨干区域。
    2. ABR只将骨干区域的3类LSA注入非骨干区域。
    3. 区域内路由(1/2类)优先级高于域间路由(3类),即使后者Cost更优。

ABR

  • 定义:连接多个区域,且在骨干区域至少有一个活跃接口的路由器。
  • 功能:汇总并传递3类LSA。其1类LSA中B-bit(Border位)被置位,标识其ABR身份。 ABR标识.png

虚链路

  • 作用
    1. 将非骨干区域逻辑连接到骨干区域(解决区域0被分割问题)。
    2. 提供一条经过非骨干区域的骨干区域路径(优化Cost)。 优化路径.png
  • 限制:只能穿越一个非骨干区域,且不能穿越特殊区域。

OSPF外部路由计算

5类LSA

  • 产生者自治系统边界路由器
  • 功能:描述引入到OSPF的外部路由(如静态路由、直连路由或其他协议路由)。在整个OSPF域内泛洪。
  • 关键字段
    • E Type:开销值类型。
      • Type 1:外部开销 + 内部到达ASBR的开销。总开销 = 种子度量值 + 内部开销
      • Type 2(默认):仅考虑外部种子度量值。总开销 = 种子度量值
    • Forwarding Address:转发地址。若非0.0.0.0,则数据包直接发往FA地址而非ASBR,用于优化路径。 ospf_import.png

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下发的缺省路由类型
骨干区域/普通区域标准区域,泛洪所有LSA1, 2, 3, 4, 5
Stub区域过滤4、5类LSA1, 2, 33类LSA (自动)
Totally Stub区域过滤3, 4, 5类LSA1, 23类LSA (自动)
NSSA区域过滤4、5类LSA,但允许引入外部路由(以7类LSA形式)1, 2, 3, 77类LSA (通常需手动default-route-advertise)
Totally NSSA区域过滤3, 4, 5类LSA,允许引入外部路由(7类)1, 2, 73类LSA (自动) & 7类LSA

关键特性对比

  • Option字段
    • E-bit:处理5类LSA能力。Stub和NSSA区域该位为0。
    • N-bit:处理7类LSA能力。仅NSSA区域该位为1。 NSSA_HELLO报文.png
  • 7类LSA
    • 仅在NSSA区域内泛洪。
    • 由NSSA区域的ABR转换为5类LSA后,泛洪到其他区域。通常由Router ID最大的ABR执行转换。
    • FA地址通常不为0,以优化路径。 7类LSA.png
  • 多ABR问题:Stub/NSSA区域存在多个ABR时,每个ABR都会下发缺省路由,可能导致区域内设备负载分担,引发次优路径。需通过调整接口Cost、缺省路由Cost或路由策略进行干预。 Stub次优路径问题.png

OSPF路由加表优先级

域内路由 > 域间路由 > 外部路由Type1 > 外部路由Type2 > NSSA区域外部路由Type1 > NSSA区域外部路由Type2

相同优先级,比开销。如果开销一直,则进行等价多路径负载均衡(默认最多4条)。


MTU不一致会导致OSPF协商失败,什么场景要改MTU?

问题现象:如标题所述,当OSPF接口MTU不匹配且开启检测时,邻居状态会卡在ExStartExChange,导致邻接无法建立。

问题根源:OSPF在ExStart状态交换DD报文进行主从选举时,报文中会携带本接口的MTU值。如果对端接口的MTU值小于此值,且开启MTU检测(某些厂商默认开启,如思科;华为/华三默认不检测),对端将拒绝处理此报文,导致协商失败。

那么,什么情况下我们需要主动修改接口的MTU值?

核心场景:隧道封装。这是最常见且最重要的原因,如GRE隧道场景。

  1. 原理分析

    • 标准以太网的MTU默认是1500字节,这意味着一个数据帧所能承载的IP报文最大为1500字节。
    • 当我们在两个站点间建立GRE隧道时,原始IP报文(假设正好1500字节)会被封装上新的GRE头部外层IP头部。这使得报文总长度超过了1500字节
    • 当这个“变胖”的报文被发送到物理接口(MTU=1500)时,接口会发现它超出了自己的MTU限制,从而触发IP分片。报文被拆分成多个片段传输。
  2. 分片带来的危害(为什么需要优化):

    • 性能下降:分片和重组需要消耗CPU和内存资源。
    • 可靠性降低:任何一个分片丢失,整个原始报文都需要重传,增加了丢包率和网络延迟。
    • 潜在兼容性问题:某些网络设备或安全策略可能阻止分片报文。
  3. 解决方案

    • 为了避免隧道报文在传输过程中被分片,常见的优化手段是调小隧道接口及路径上相关物理接口的MTU值
    • 调整方法:将隧道接口及其底层物理接口的MTU值设置为 1500 - (隧道封装开销)。对于GRE over IP,开销通常是24字节(新IP头20字节 + GRE头4字节),因此MTU常设置为 1476
      # 例如,在物理接口和隧道接口上均进行设置
      [H3C-GigabitEthernet0/1] mtu 1476
      [H3C-Tunnel0] mtu 1476
      
  4. 对其他隧道类型的延伸

    • 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优化。如有问题,感谢指正。内容仅供参考,请仔细甄别。