编辑
2025-09-10
网工之路
00

目录

1. OSPF协议介绍
1.1 静态 VS 动态路由协议
1.2 距离矢量 VS 链路状态
2. OSPF的区域
2.1 分区的基本特点
2.2 路由器的角色
2.3 特殊区域
3. OSPF包类型
3.1 OSPF包报头格式
3.2 Hello包
3.3 DBD包
3.4 LSR包
3.5 LSU包
3.6 LSAck包

OSPF0.jpeg

本文详细介绍了开放式最短路径优先(OSPF)协议,一个用于自治系统内部的动态链路状态路由协议。文章首先对比了静态与动态路由协议、距离矢量与链路状态路由协议的特点,明确了OSPF的定位。接着,深入探讨了OSPF的区域概念,包括骨干区域与非骨干区域的结构、区域划分的优势、路由器角色(如ABR、ASBR)以及特殊区域类型(Stub、Totally Stub、NSSA等)。最后,文章详细解析了OSPF的五种报文类型:Hello、DBD、LSR、LSU和LSAck,逐一阐述了它们的用途、报文结构中的关键字段,并辅以Wireshark抓包示例,帮助读者全面理解OSPF协议的运作机制。

1. OSPF协议介绍

OSPF(Open Shortest Path First,开放式最短路径优先)协议是一个动态路由协议。它是开源、非厂商私有的,用于在一个自治系统(AS)内部,动态发现网络拓扑,计算最优路由,快速收敛。

1.1 静态 VS 动态路由协议

静态路由协议需要手动去配置路由。在网络发生变化的时候,需要手动更新静态路由。它配置简单,但是不够灵活,适合设备数量不多的小型网络。

动态路由协议可以自动计算出路由表。在有网络变动时,会自动更新路由表,整网的收敛速度快。它可以用于更复杂的大型网络。配置复杂,但提供了更好的拓展性,性能和适应性。

1.2 距离矢量 VS 链路状态

OSPF1.jpeg

距离矢量型路由协议 基于距离度量来计算到目标的最优路径,譬如从邻居学到的到目标的跳数。

  • 设备只知道它直连的邻居以及到每个目标的距离度量。
  • 周期性更新,跟邻居周期性地交换整张路由表。
  • 使用 Bellman-Ford 算法,度量值比较简单,为跳数或是其他度量的加权(EIGRP)。
  • 收敛速度通常比链路状态型路由协议慢一些,适合不太复杂的网络。

链路状态路由协议 通过交换设备的链路及状态来计算出整网的拓扑。

  • 设备有整网的拓扑信息。
  • 设备间交换SLAs(Link-State Advertisements)来取得链路及其状态信息。每台设备的数据路都存有整网的链路及状态信息。
  • 使用 Dijkstra 算法,独立计算到每个目标的最短路径。
  • 收敛速度快,适合复杂的大型网络。

2. OSPF的区域

2.1 分区的基本特点

网络结构 OSPF要求网络分为两个层次的区域,区域0也叫做骨干区域和非0区域。非0区域必须和骨干区域相连,通常是物理相连,部分情况可以是逻辑接口相连。总得来说,OSPF是类似一种向日葵形状的网络结构。

区域标识 单个数字,譬如Area 0,Area 10。或是类似于IP地址的点分十进制,区域0为 0.0.0.0,其他区域为0.0.0.21。

分区的好处 LSA泛洪只在一个区域内进行。当网络发生变化时,SPF的重新计算被限制在本区域。此外,区域内路由器的路由表也会尽量小一些。

保持分区的规模 一个OSPF区域内推荐不超过50台路由器。对于边界路由器,推荐不超过连接超过3个区域。这样是平衡路由器的硬件资源和性能。对于现在的网络设备,CPU和内存基本不存在瓶颈。但是过大的区域会导致网络的不稳定,过于频繁的网络变化导致频繁的SPF计算。推荐阅读 ISR 4331 / Number of supported OSPF areas

非连续区域 在特殊情况下,譬如地理的分割,导致非0区域无法可以直连骨干区域,而需要借道另一个非0区域来连接到骨干区域。 这时会在两个ABR R1和R2上建立跨Area 5的虚连接。 ospf3.jpeg

2.2 路由器的角色

ospf2.jpeg

  • 骨干区域路由器:譬如R1,它在Area 0内部。
  • 区域边界路由器 ASR:譬如R3和R4,他们一部分在Area 0里,一部分在其他其余区域里,是连接骨干区域和其他区域的桥梁。
  • 自治区域边界路由器 ASBR:譬如R2,它是可以是连接到Internet的路由器,确切地说它是连接OSPF进程和其他路由协议的连接点。譬如,OSPF和BGP,则在此处会有相互的路由重分发,用于和外部交换路由。
  • 路由器可以即是区域边界路由器,也是自治系统边界路由器。

2.3 特殊区域

为了节约路由表,有下列四种特殊区域。区别如下图,在介绍SLA的类型时会再讨论。

  • Stub Area 末节区域
  • Totally Stub Area 完全末节区域
  • NSSA 次末节区域
  • Totally 完全次末节区域

ospf4.jpeg

3. OSPF包类型

OSPF有如下5种类型的包。

ospf5.jpeg

3.1 OSPF包报头格式

  • Version版本:8比特长度,2为OSPFv2,3为OSPFv3。
  • Type类型:8比特长度,1-5,表示如上的5种类型。
  • Packet Length包长度:16比特长度,包括报头在内的OSPF包的长度,单位为字节。
  • Router ID路由器标识:32比特长度,发送此包的路由器的标识。
  • Area ID区域标识:32比特长度,发送此包的路由器所属的区域标识。
  • Checksum校验值:16比特长度,不包括认证字段在内的OSPF包的校验值。
  • Authentication Type认证类型:16比特长度,0为不认证,1为明文认证,2为密文认证。
  • Authentication认证信息:64比特长度,根据认证类型,包括的信息也不同。明文认证则为密码信息。密文认证包括加密密钥ID,MD5认证数据长度和序列号(用于防止重放攻击),消息摘要不包含在报头中。

ospf7.jpeg

3.2 Hello包

  • 用于建立和维持邻居关系。
  • 包括路由器标识,hello和dead间隔时间,多路访问网络的指定路由器DR和备份指定路由器BDR的地址,以及路由器的邻居列表。
  • 如果路由器没有dead间隔时间内没有收到邻居的hello包,则会认为邻居down了。
  • Network Mask网络掩码:指明发送这条Hello消息的接口的网络掩码。
  • Hello间隔在广播和P2P网络下默认是10秒,在NBMA网络下默认是30秒。而Dead间隔则通常为4倍的Hello间隔。
  • Router Priority路由器优先级:用于多路访问网络选举DR和BDR。默认值是1,取值区间为0-255,优先级最高的路由器成为DR。

ospf9.jpeg

WireShark抓包如下:

ospf8.jpeg

3.3 DBD包

DBD是Database Description Packet的缩写。

  • 用于总结链路状态数据库的内容,包括路由器SLA(链路状态通告)的描述及其报头。
  • 在两台路由器第一次交换链路状态信息的时候,双方会将各自数据库的内容描述给对方,双方根据现有数据库的内容来请求其缺失的或是需要更新的SLA。
  • Interface MTU:在不分片的情况下,接口可以发送DBD包的最大长度。
  • I & M标识:在多个连续的DBD包的情况下,如果是第一个DBD包,I设为1;如果是最后一个,M设为0。
  • M/S 主从标识:两台路由器在交换DBD包的时候,它们会协商成主从关系。如果设置为1,主路由器发送DBD包。
  • DBD Sequence Number:DBD包的序列号。主从使用需要序列号来确保传输的DBD包是正确的。
  • LSA Headers: 包含在DBD包里的SLA报头。

ospf10.jpeg

WireShark抓包如下:

ospf11.jpeg

3.4 LSR包

LSR是Link-State Request的缩写。

  • 用于从邻居处请求特定的LSA,包括请求的LSA的类型和ID。
  • 接收到DD包之后,路由器会确定缺失的或是过时的SLA,并从邻居处请求相应的SLA。
  • 一个包可以请求多条SLA。

ospf12.jpeg

WireShark抓包如下:

ospf13.jpeg

3.5 LSU包

LSU是Link-State Update的缩写。

  • 用于将SLA发送给邻居,包括一条或多条的SLA。
  • 它既可以是回应邻居的请求,也可以是将新的或是更新的LSA传播到网络中,确保所有的路由器都有最新和最准的网络拓扑。

ospf14.jpeg

WireShark抓包如下:

ospf15.jpeg

3.6 LSAck包

LSAck是Link-State Acknowledgement的缩写。

  • 用于确认从LSU包收到的SLA,防止不必要的重传。
  • 使用LSA的报头来进行确认。

ospf16.jpeg

WireShark抓包如下:

ospf17.jpeg

本文作者:潘晓可

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!