OSPF路由协议简介

开放式最短路径优先(OSPF)路由协议是当今企业IPv4网络中的路由器上最常用的IGP路由协议。路由协议基本上交换信息,因此路由器可以动态地学习路由。

路由器学习有关子网的信息,到这些子网的路由以及有关每条路由与其他路由的比较程度的度量信息。该协议使用称为“成本”的链路状态机制来找到到达目的地的最短路径。 

本文首先讨论OSPF路由器如何学习信息并选择要添加到路由表的路由。本文的第二部分着眼于OSPF流程的基本部分。它显示了OSPF路由器如何使用邻居关系,以及路由器在交换路由信息以学习路由之前必须如何成为邻居。

本文以关于OSPF如何扩展到大型企业设计的一些设计讨论结尾,以及有关链接状态协议如何工作的详细信息。

在OSPF中构建LSDB和创建IP路由

链接状态协议通过几个主要步骤来构建IP路由。首先,路由器共同构建了大量有关网络的信息:路由器,链接,IP地址,状态信息等。然后,路由器将信息泛洪,因此其他路由器将学习相同的信息。届时,每个路由器都可以从自己的角度计算到所有子网的路由。

使用链接状态路由协议的路由器需要将有关网络间的每个详细信息共同通告给所有其他路由器。在将信息泛洪到所有路由器的过程结束时,网络间的每个路由器将具有与网络间完全相同的信息。

OSPF是最流行的链路状态IP路由协议,它使用链路状态通告(LSA)和链路状态数据库(LSDB)来组织拓扑信息。每个LSA都是一个数据结构,其中包含有关网络拓扑的一些特定信息。LSDB只是路由器已知的所有LSA的集合。在Cisco路由器中,show ip ospf database 命令列出有关LSDB的信息。

下图显示了泛洪过程的总体思路,其中R8创建并泛洪了其
路由器LSA。路由器R8的路由器LSA描述了路由器本身,包括
子网172.16.3.0/24的存在,如图右侧所示。

OSPF路由交换

上图显示了一个相当基本的泛洪过程,R8为自己发送原始LSA,其他路由器通过转发LSA泛洪LSA,直到每个路由器都有副本为止。泛洪过程具有一种防止循环的方法,以使LSA不会被淹没。 

基本上,路由器在将LSA发送给另一个邻居之前,先进行通信,然后询问“您是否已经有了此LSA?” 然后他们避免将LSA泛洪到已经拥有LSA的邻居。

淹没后,路由器有时会重新淹没特定的LSA。当
某些信息发生更改(例如,链路上升或下降)时,路由器会重新注入LSA 。他们还
根据每个LSA的单独老化计时器(默认值为30分钟)重新注入每个LSA。

应用Dijkstra SPF Math查找OSPF中的最佳路由

链路状态洪泛过程导致每个路由器在内存中具有LSDB的相同副本,但是仅洪泛过程并不会导致路由器了解要添加到IP路由表的路由。尽管LSDB中的信息非常详细和有用,但它并未明确说明每个路由器到达目的地的最佳路由。

要建立路由,链路状态路由器必须做一些数学运算。值得庆幸的是,我们不必知道数学!所有链路状态协议都使用Dijkstra最短路径优先(SPF)算法来处理LSDB。 

该算法分析了LSDB,并构建了本地路由器应添加到IP路由表中的路由-列出了子网号和掩码,出接口和下一跳路由器IP地址的路由。

OSPF邻居的基础

OSPF邻居是既使用相同的路由协议又使用相同的数据链路协议的路由器。这意味着连接到同一VLAN的两个路由器成为OSPF邻居,或者串行链路末端的两个路由器成为OSPF邻居。

除了简单地存在于同一链路上以成为OSPF邻居之外,两个路由器还需要做更多的工作。
他们必须发送OSPF消息并同意成为邻居。为此,路由器发送
Hello消息以将自己介绍给邻居。假设两个邻居具有兼容的OSPF参数,则两者形成邻居关系,并且将显示在Cisco路由器中的show ip ospf neighbors命令的输出中。

最后,OSPF邻居模型允许动态发现新路由器。这意味着
可以将新路由器添加到网络,而无需重新配置每个路由器。取而代之的是,该配置在路由器的接口上启用OSPF,然后只要碰巧安装了邻居,路由器就会对来自新邻居的任何Hello消息做出反应。

在OSPF中与邻居见面并了解其路由器ID

我们知道OSPF进程始于称为Hello消息的消息。Hellos依次列出每个路由器的路由器ID(RID),用作每个路由器的唯一名称或标识符。最后,OSPF对Hello消息中的信息进行多次检查,以确保两个路由器是否应该成为邻居。

RID是32位数字。结果,大多数命令输出将它们列出为点分十进制数字。另外,默认情况下,路由器会根据接口IPv4地址选择其OSPF RID,因为它们也是附近的一些方便的32位数字。但是,可以直接配置RID。

一旦路由器选择了其RID,并且出现了两个路由器之间的连接接口,如果通过以下步骤,该路由器就可以成为OSPF邻居:

  1. 设备必须位于同一区域。
  2. 设备必须具有相同的身份验证配置。
  3. 设备必须在同一子网中。
  4. 设备的 问候 间隔和 停顿 间隔必须匹配。
  5. 设备必须具有匹配的存根标志。
  6. 两个路由器上的MTU单位必须相同。

OSPF问候消息

为了发现其他使用OSPF的路由器,一台路由器向每个接口发送多播OSPF Hello数据包,并希望从连接到这些接口的其他路由器接收Hello数据包。前面的图概述了基本概念。

OSPF问候报文

路由器A和B都将Hello消息发送到LAN。他们继续
根据其Hello Timer设置定期发送Hello。Hello消息本身具有以下功能:

  • Hello消息跟随IP协议类型为89的IP数据包头 。
  • Hello数据包被发送到多播IP地址224.0.0.5,该多播IP地址适用于所有使用OSPF的路由器。
  • 路由器侦听发送到IP多播地址224.0.0.5的数据包,部分是希望接收Hello数据包并了解新邻居。

Hello消息包含各种参数。这些详细信息使每个路由器都知道
有关其潜在邻居的信息,包括两个路由器是否应该
成为邻居。

例如,如果两个OSPF路由器的接口的IPv4地址位于不同的子网中,则它们将不会成为邻居。因此,仅因为两个路由器碰巧听到邻居发出的Hello消息并不意味着它们将成为邻居。但是,如果路由器确实成为邻居,它们将开始交换其LSDB,然后计算新的IP路由。

通过分层设计扩展OSPF

OSPF可以在某些网络中使用而无需考虑设计问题。但是,在大型网络中,工程师需要考虑并计划如何使用多个OSPF功能,以使其网络在以后能够很好地扩展。

例如,下图中的OSPF设计使用单个区域,因为这种小型的网络间不需要OSPF区域的可伸缩性优势。

如上图所示,将一个OSPF区域用于较小的互联网络,效果很好。配置很简单,并且故障排除也很容易。但是想象一下,一个网络由900个路由器而不是只有11个和数千个子网组成。

在这种规模的网络中,运行复杂的SPF算法所需的大量处理过程可能会导致收敛时间变慢,这仅仅是因为每个路由器都要花费所有时间来处理所有数学运算。此外,路由器可能会遇到内存不足的情况。

这些问题可以总结如下:

  • 较大的拓扑数据库在每个路由器上需要更多的内存。
  • 使用SPF算法处理较大的拓扑数据库需要的处理能力随拓扑数据库的大小呈指数增长。
  • 单个接口状态更改(向上或向下)将强制每个路由器再次运行SPF!

用Area打破OSPF LSDB的大小

OSPF通过使用区域来分解在大型LSDB上运行SPF的繁琐任务。该
工程师放在一个区域,一些在另一个人在第三个区域,等等一些链接。
OSPF然后为每个区域创建了一个较小的LSDB,而不是为
互联网络中的所有链接和路由器创建了一个庞大的LSDB 。使用较小的拓扑数据库,路由器将消耗较少的内存,并花费
较少的处理时间来运行SPF。

多区域设计将所有链接(串行链接和VLAN等)置于一个区域内。为了
使该工作可行,某些路由器(区域边界路由器或ABR)位于多个区域之间的边界。路由器D1和D2在下图所示的区域设计中充当ABR。

尽管上图显示了样本区域设计和与区域相关的一些术语,但并未显示区域的功能和优势。通过使用区域,OSPF SPF算法将忽略其他区域中拓扑的详细信息。

例如,当路由器B1(区域1)正在处理复杂的SPF数学时,它会忽略有关区域0和区域2的拓扑信息。这样,每个路由器要做的SPF工作要少得多,并且可以更快地完成其SPF工作,从而发现当前最佳的OSPF路由。

OSPF网络命令

所述网络命令用于识别哪个设备接口将包括在OSPF过程中以及在何种区域的接口将被分配到。OSPF使用通配符掩码从网络命令范围内的接口发送hello数据包。

network命令将命令中的第一个参数与本地路由器上的每个接口IP地址进行比较,以尝试找到匹配项。但是,路由器可以根据通配符掩码将八位字节的子集进行比较,而不是将network命令中的整数与接口上的整个IPv4地址进行比较,如下所示:

通配符0.0.0.0:比较所有4个八位字节。换句话说,数字必须完全匹配。
通配符0.0.0.255:仅比较前3个八位位组,而忽略最后一个八位位组。
通配符0.0.255.255:仅比较前两个八位字节,并忽略最后两个八位字节。
通配符0.255.255.255:仅比较第一个八位位组,而忽略最后三个八位位组。
通配符255.255.255.255:不进行任何比较;此通配符掩码表示所有地址
都将与网络命令匹配。

基本上,八位字节中的通配符掩码值0告诉路由器进行比较以查看数字是否
匹配,而值255则告诉路由器在比较数字时忽略该八位字节。

OSPF路由器ID

尽管OSPF具有许多其他可选功能,但大多数使用OSPF的企业网络都选择配置每个路由器的路由器ID。OSPF路由器必须具有路由器ID(RID)才能正常运行。默认情况下,路由器将选择一个接口IP地址用作RID。但是,许多网络工程师更喜欢选择每个路由器的ID,因此show ip ospf neighbor等命令的命令输出会在Cisco设备中列出更多可识别的路由器ID。

要找到其RID,路由器在重新加载并启动OSPF进程时会使用以下过程。请注意,当这些步骤之一标识RID时,该过程将停止。

  1. 如果配置了router-id,则将该值用作RID。
  2. 如果任何环回接口都配置了IP地址并且接口的状态为up,则路由器将在这些环回接口中选择最高的数字IP地址。
  3. 路由器从所有其他物理连接的接口中选择最高的数字IP地址。换句话说,在上/下状态的接口将通过OSPF选择其路由器ID当包括。

请注意,回送接口是可以配置的虚拟接口。环回接口始终处于“启动和启动”状态,除非在管理上处于关闭状态。

OSPF被动接口

一旦使用network命令在接口上启用了OSPF ,路由器便会尝试发现相邻的OSPF路由器并形成邻居关系。路由器还侦听来自潜在邻居的传入Hello消息。

有时,路由器不需要与接口上的邻居形成邻居关系。通常,特定链路上不存在其他路由器,因此该路由器无需继续发送那些重复的OSPF Hello消息。

当路由器不需要通过某个接口发现邻居时,工程师可以使用几个配置选项。首先,由于不执行任何操作,路由器将继续发送消息,从而浪费了一些CPU周期和精力。或者,工程师可以将该接口配置为OSPF被动接口,告诉路由器执行以下操作:

  • 退出在该接口上发送OSPF Hello消息
  • 忽略在该界面上收到的Hello
  • 不要在该特定接口上形成邻居关系

请记住,通过在被动端口上设置接口,OSPF不会在该接口上形成邻居关系,但它仍会通告连接到该接口的子网。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁