OSPF协议详解1:从基础概念到区域划分与报文类型解析
本文详细介绍了开放式最短路径优先(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 链路状态
距离矢量型路由协议 基于距离度量来计算到目标的最优路径,譬如从邻居学到的到目标的跳数。
- 设备只知道它直连的邻居以及到每个目标的距离度量。
- 周期性更新,跟邻居周期性地交换整张路由表。
- 使用 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的虚连接。
2.2 路由器的角色
- 骨干区域路由器:譬如R1,它在Area 0内部。
- 区域边界路由器 ASR:譬如R3和R4,他们一部分在Area 0里,一部分在其他其余区域里,是连接骨干区域和其他区域的桥梁。
- 自治区域边界路由器 ASBR:譬如R2,它是可以是连接到Internet的路由器,确切地说它是连接OSPF进程和其他路由协议的连接点。譬如,OSPF和BGP,则在此处会有相互的路由重分发,用于和外部交换路由。
- 路由器可以即是区域边界路由器,也是自治系统边界路由器。
2.3 特殊区域
为了节约路由表,有下列四种特殊区域。区别如下图,在介绍SLA的类型时会再讨论。
- Stub Area 末节区域
- Totally Stub Area 完全末节区域
- NSSA 次末节区域
- Totally 完全次末节区域
3. OSPF包类型
OSPF有如下5种类型的包。
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认证数据长度和序列号(用于防止重放攻击),消息摘要不包含在报头中。
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。
WireShark抓包如下:
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报头。
WireShark抓包如下:
3.4 LSR包
LSR是Link-State Request的缩写。
- 用于从邻居处请求特定的LSA,包括请求的LSA的类型和ID。
- 接收到DD包之后,路由器会确定缺失的或是过时的SLA,并从邻居处请求相应的SLA。
- 一个包可以请求多条SLA。
WireShark抓包如下:
3.5 LSU包
LSU是Link-State Update的缩写。
- 用于将SLA发送给邻居,包括一条或多条的SLA。
- 它既可以是回应邻居的请求,也可以是将新的或是更新的LSA传播到网络中,确保所有的路由器都有最新和最准的网络拓扑。
WireShark抓包如下:
3.6 LSAck包
LSAck是Link-State Acknowledgement的缩写。
- 用于确认从LSU包收到的SLA,防止不必要的重传。
- 使用LSA的报头来进行确认。
WireShark抓包如下:
📚 延伸阅读
更多内容持续更新于我的博客:https://www.zenseek.site