Luckylau's Blog

你懂网络吗(6)

本文主要是基于学习《CCNA学习指南》和《史上最“牛”的 Cisco 路由器配置与管理手册》总结网络必备的知识。

本篇章涉及以下内容:

OSPF协议

OSPF 术语

链路 链路就是一个网络或者一个被指定给任一给定网络的路由器接口。当一个接口被添加到 OSPF 进程时,它就被 OSPF 认定是一个链路。这个链路或接口都将有一个与它关联的状态信息( up 或 down),以及一个或多个 IP 地址。

路由器 ID 路由器 ID( RID) 是一个用来标识此路由器的 IP 地址。

邻居 邻居可以是两个或更多的路由器,这些路由器的某个接口是连接在同一个公共网络上,比如两个通过点到点串行链路连接在一起的路由器。

邻接 邻接是指两个 OSPF 路由器之间的关系,这两个路由器之间允许直接交换路由更新数据。

Hello协议 OSPF 的 Hello 协议能够动态地发现邻居,并维护邻居关系。 Hello 数据包和链路状态通告 (LSA) 共同用于建立并维护拓扑数据库。 Hello 数据包使用的是组播地址 224.0.0.5 0。

邻居关系数据库 邻居关系数据库是一个 OSPF 路出器的列表,这些路由器的 Hello 数据包相互可见 。

拓扑数据库 拓扑数据库中包含有来自为同一区域接收的所有链路状态通告数据包中的信息。

链路状态通告 链路状态通告 (LSA) 是一个 OSPF 数据包,它包含着 OSPF 路由器中共享的链路状态和路由选择信息。

指定路由器 无论什么时候,当 OSPF 路由器被连接到同一多路访问网络时,都需要选择一个指定路由器 (DR) 。 一个 DR ,它负责将路由选择信息分发到广播网络或链路中其他路由器上,或收集其他路由器的路由选择信息。这样就可以确保所有路由器上的拓扑表是完全同步的。

备用指定路由器 备用指定路由器 (BDR) 是在多路访问链路上随时准备着的待命的 DR。BDR从 OSPF 邻接路由器上接收所有的路由更新,但并不泛发 LSA 更新。

OSPF 区域 一个 OSPF 区域是一组相邻的网络和路由器。

广播(多路访问) 广播(多路访问)网络允许多个设备连接(或者是访问)到同一个网络上,并通过将单一数据包投递到网络中所有的结点来提供广播能力,如以太网。在 OSPF 中,每个广播多路访问网络都必须选出一个 DR 和一个 BDR。

非广播多路访问 非广播多路访问 (NBMA) 网络是那些诸如帧中继、 X.25 和异步传输模式(ATM) 等类型的网络。这些网络允许多路访问,但不具备以太网那样的广播能力。因此,要实现恰当的功能, NBMA 网络需要特殊的 OSPF 配置,并且邻居关系必须详细定义。

点到点 点到点被定义为一种由两个路由器间的直接连接组成的网络拓扑类型,这一连接为路由器提供单一的通信路径。

点到多点 点到多点也被定义为一种网络拓扑类型,这种拓扑中包含单个路由器上的单一接口与多个目的路由器间的一系列连接。所有位于不同路由器上的接口都共享属于同一网络的点到多点的连接。与点到点一样,这里不需要 DR 或 BDR。

OSPF协议介绍

​ 每个 OSPF 路由器维护相同 AS 拓扑结构的数据库。从这个数据库里,构造出最短路径树来计算出路由表。当拓扑结构发生变化时, OSPF 协议能迅速重新计算出路径,而只产生少量的路由协议流量。此外,所有的 OSPF 路由选择分组的交换都是经过验证的。

OSPF 与 RIP

采用链路状态路由算法。RIP 采用的相对简单的“距离矢量”路由算法,仅以“距离”( Distance)作为度量; 而 OSPF采用的是更加复杂的“链路状态”路由算法包括线路带宽、 端口状态、端口带宽、端口优先级、链路稳定性等方面,是以“开销”( cost)作为其度量的。

可划分不同区域。在一个 OSPF 网络中,只能有一个 AS,但在这个 AS 中可以划分多个区域( Area),同一个区域的不同 OSPF 路由器进程可以一样,也可以不一样。 在 OSPF 路由协议中,每一个区域中的路由器都按照该区域中定义的链路状态算法来计算网络拓扑结构,这意味着每一个区域都有着该区域独立的网络拓扑数据库及网络拓扑图。对于每一个区域, 其网络拓扑结构在区域外是不可见的,同样,在每一个区域中的路由器对其域外的其余网络结构也不了解。这样做有利于减少网络中链路状态数据包在全网范围内的广播,也是 OSPF 将其路由域或一个 AS 划分成很多个区域的重要原因。

有不同路由器角色。OSPF 可以划分不同的多个区域,所以就涉及相同区域内部,以及不同区域间的路由问题。这也就决定了在 OSPF 网络中存在多种不同类型的路由器, 担当不同角色。如区域内部路由器、区域边界路由器、 AS 边界路由器。

收敛性能更高。RIP 协议中,所有的路由都由跳数来描述,到达目的地的路由最大不超过 15 跳,这就限制了 RIP 的服务半径,同时需要定期(默认为 30 秒)在网络邻居路由器上通告自己的整个路由表信息,以便及时对网络拓扑结构的改变进行收敛。OSPF 是基于链路状态的路由协议不再交换整个路由表,而是同步各路由器对网络状态的认识,即链路状态数据库,然后通过 Dijkstra 最短路径算法计算出网络中各目的地址的最优路由。这样 OSPF 路由器间不需要定期地交换大量路由数据,而只是保持着一种连接,仅在链路状态发生变化时,才通过组播方式对进行触发式路由更新。

无环路。从OSPF 网络的两层结构来说, OSPF 网络中包括唯一的骨干区域和许多普通的非骨干区域。在普通区域内部的路由采用的是 SPF 链路状态路由算法,而在区域之间的路由采用的是 DV(距离矢量)路由算法。同时要求所有非骨干区域必须与骨干区域连接(可以是直接连接,也可以是通过虚拟链路进行间的接连接),非骨干区域之间的通信也必须通过骨干区域,形成了一种 Hub-Spoken 星状结构。 这样所有非骨干区域没有了直连,不具备形成环路的条件。 而在同一个区域内部, OSPF 所采用的 SPF(Shortest Path First,最短路径优先)路由算法所生成的单向 SPT(Shortest Path Tree, 最短路径树)又保证了区域内部没有路由环路。 两者结合就决定了整个 OSPF 网络不会出现路由环路了。

AS和Area

AS 是一组使用相同路由协议交换路由信息的路由器, 也称路由域(Routing Domain)。在 OSPF 网络中,只有在同一 AS 中的路由器才会相互交换链路状态信息;在同一个 AS 中,所有的 OSPF 路由器都维护一个相同 AS 结构描述的数据库。该数据库中存放的是路由域中相应链路的状态信息。 OSPF 路由器正是通过这个数据库计算出其 OSPF 路由表的。而且 OSPF 可以将个 AS 分割成多个小的区域,便于网络的拓展,而且每个 OSPF 路由器只在区域内部学习完整的链路状态信息,便于路由更新管理。

​ 为了减小 LSDB 的大小,降低 SPF 运算的系统资源开销,减少路由表项数, OSPF 允许 AS被划分成多个连续网络群组,这就是“域”(Area)。在 OSPF 路由协议中,每一个区域中的路由器都独立计算网络拓扑结构,区域间的网络结构情况是互不可见的。在每一个区域中的路由器也不会了解外部区域的网络结构,可谓是“各自为政,互不干涉”。这就意味着每一个区域都有着该区域独立的网络拓扑数据库及网络拓扑图。这样做的好处就是有利于减少网络中 LSA 报文在整个 OSPF 网络范围内的通告。

OSPF 网络路由器类型

内部路由器(Internal Router, IR)当一个 OSPF 路由器上所有直连的链路(也就是路由器上所有接口)都处于同一个区域(不直接与其他区域相连)时,我们称这种路由器为“内部路由器”。 内部路由器上仅仅运行其所属区域的 OSPF 运算法则,仅生成区域内部的路由表项。
区域边界路由器(Area Border Router, ABR)当一个路由器有多个接口,其中至少有一个接口与其他区域相连时,我们称之为“区域边界路由器”。区域边界路由器的各对应接口运行与其相连区域定义的 OSPF 运算法则,具有相连的每一个区域的网络结构数据,并且了解如何将该区域的链路状态信息通告至骨干区域,再由骨干区域转发至其余区域。
AS 边界路由器(Autonomous System Boundary Router, ASBR)AS 边界路由器是与 AS 外部的路由器互相交换路由信息的 OSPF 路由器。该路由器在 AS 内部通告其所得到的 AS 外部路由信息,这样 AS 内部的所有路由器都知道 AS 边界路由器的路由信息。 AS 边界路由器的定义是与前面几种路由器的定义相独立的,一个 AS 边界路由器可以是一个区域内部路由器,或是一个区域边界路由器。
骨干路由器(Backbone Router)骨干路由器是指至少有一个接口定义为属于骨干区域的路由器。任何一个与骨干区域互联的ABR 或者 ASBR 也将成为骨干路由器。

DR 和 BDR

​ DR 就是集中负责一个区域内各路由器间的 LSU 交换和邻接关系建立,相当于这个区域的负责人一样。这个负责人负责其他成员的信息反馈、 转发和广播(他保存有所有成员之间的联系信息),其他每个成员也都与这个负责人建立单线联系,而其他成员之间彼此不建立联系。这样就不需要每个成员都保存整个团体会员的联系信息,也不必每个成员都与其他成员建立联系,管理更加简单。

​ BDR 是用于在 DR 失效后接替 DR 的工作(也可不选举 BDR),在 DR 正常工作时,它不担当 DR 的职责。在同一个OSPF 区域中,每个路由器都和 DR, BDR 相连。当区域中的路由器有路由更新时, DR Other 路由器不会向其他 DR Other 路由器发送自己的LSU,而只会向 224.0.0.6 这个组播地址发送,然后由 224.0.0.6 这个地址会把 DR Other 发上来的LSU 组播给 DR/BDR, 之后 DR/BDR 都会收到这个 DR Other 的路由更新。在 DR/BDR 收到从224.0.0.6 发过来的 LSU 后又会把这些 LSU 发给 224.0.0.5 这个组播地址,这时 224.0.0.5 会把 LSU
泛洪到区域内的所有 DR Other 路由器上。

对于DR 和 BDR 的选举是这样的: DR 是通过接口优先级(Interface Priority)进行选举,最高优先级的路由器被选为DR,次高者被选为 BDR; 如果接口优先级相同,就按 router-id 进行选举,由最大到次大选举DR、 BDR。但 DR、 BDR的选举不支持抢占(Preemption), 也就是一旦选举完成,即使新加一个优先级更高的设备也不会进行重新的选择,相反只有在 DR 或者 BDR 出问题的时候才会发生重选。

OSPF 路由计算基本过程

整个 OSPF 路由计算过程可分为:邻接关系建立→DR/BDR 选举→发送 LSA→创建路由表→维护路由表这五大基本步骤。

邻接关系建立

​ 路由器首先发送拥有自身 ID 信息(Loopback 端口或最大的 IP 地址)的 Hello 报文。与之相邻的路由器如果收到这个 Hello 报文,就将这个报文内的 ID 信息加入到自己的 Hello 报文内。然后在后面发送的 Hello 报文中就包括了原来所接收到的邻居路由器的 ID 信息。如果路由器的某端口收到从其他路由器发送的含有自身 ID 信息的 Hello 报文,则它根据该端口所在网络类型确定是否可以与对端路由器建立邻接关系。

DR/BDR 选举

​ DR 和 BDR 是由同一网段中所有的路由器根据路由器优先级、 Router ID 通过 Hello 报文选举出来的,只有优先级大于 0 的路由器才具有选举资格。 具体的选举过程如下:(1)在与一个或多个邻居之间的双向通信建立起来之后,本地路由器对每个邻居发送来的 Hello包中的优先级、 DR 和 BDR 域进行检查。此时所有路由器都宣称自己为 DR(将它们自己的接口地址置于 Hello 包的 DR 域中);而且所有路由器都宣称自己为 BDR(将它们自己的接口地址置于Hello 包的 BDR 域中)。(2)如果一或多个备选路由器将它(们)自身的接口地址置于 DR 域中,拥有最高优先级的邻居将被宣告为 DR。如果路由器优先级一样,拥有最高 Router ID 的邻居将被选举出来。(3)然后再将自身的接口地址置于 BDR 域中的路由器中选择拥有最高优先级的路由器作为BDR。如果这些宣称自己为 BDR 路由器的优先级相等,则拥有最高 Router ID 的邻居将被选举作为 BDR。(4)如果没有任何路由器被宣告为 BDR,拥有最高优先级的非 DR 邻居路由器将被宣告为BDR;如果多个优先级相同的这样的路由器,则拥有最高 Router ID 的邻居将被选举作为 BDR。

发送 LSA

​ 路由器与路由器之间首先利用 Hello 报文的 ID 信息确认主从关系,然后主从路由器相互交换部分链路状态信息。每个路由器对信息进行分析比较,如果收到的信息有新的内容,路由器将要求对方发送完整的链路状态信息。这个状态完成后,路由器之间建立完全邻接关系,同时各邻接路由器拥有自己独立的、完整的链路状态数据库。

​ 在多路访问网络内, DR 与 BDR 互换信息,并同时与本子网内其他路由器交换链路状态信息。在 Point-to-Point(点对点)或 Point-to-MultiPoint(点对多点)网络中,相邻路由器之间会直接交换链路状态信息。

创建路由表

​ 当网络重新稳定下来,也可以说 OSPF 路由协议收敛下来时,所有的路由器会根据其各自的链路状态信息数据库,采用 SPF(最短路径优先)算法计算并创建路由表。 OSPF 路由器依据链路状态数据库的内容,独立地用 SPF 算法计算出到每一个目的网络的路径,并将路径存入路由表中。该路由表中包含路由器到每一个可到达目的地的开销以及到达该目的地所要转发的下一个路由器(next-hop)。

​ OSPF 利用开销来计算路由路径性能的, 开销最小者即为最短路径。在配置 OSPF 路由器时可根据实际情况,如链路带宽、时延等设置链路的开销大小;开销越小,则该链路被选为路由的可能性越大。这里的开销是根据链路类型来计算的,不同的链路类型对应的开销值不一样。

维护路由表

​ 当链路状态发生变化时, OSPF 通过泛洪过程广播网络上的其他路由器。 OSPF 路由器接收到包含有新信息的链路状态更新报文,将更新自己的链路状态数据库,然后用 SPF 算法重新计算路由表。在重新计算过程中,路由器继续使用旧路由表,直到 SPF 完成新的路由表计算。新的链路状态信息将发送给其他路由器。值得注意的是,即使链路状态没有发生改变, OSPF 路由信息也会自动更新,默认时间为 30 分钟。

OSPF 报头

​ OSPF 报文直接封装为 IP 协议报文,因为 OSPF 是专为 TCP/IP 网络而设计的路由协议。 OSPF报文主要有 5 种: Hello 报文、 DD(Database Description, 数据库描述) 报文、 LSR(LinkStateRequest, 链路状态请求) 报文、 LSU(LinkState Update, 链路状态更新) 报文和 LSAck(LinkStateAcknowledgment, 链路状态应答) 报文,它们使用相同的 OSPF 报头格式。

Version: 版本字段, 占 1 个字节,指出所采用的 OSPF 协议版本号,目前最高版本为 OSPFv4,即值为 4(对应二进制就是 0100)。
Packet Type: 报文类型字段,标识对应报文的类型。 前面说了 OSPF 有 5 种报文,分别是:Hello 报文、 DD 报文、 LSR 报文、 LSU 报文、 LSAck 报文。
Packet Length:包长度字段, 占 2 个字节。它是指整个报文(包括 OSPF 报头部分和后面各报文内容部分)的字节长度。
Router ID: 路由器 ID 字段,占 4 个字节,指定发送报文的源路由器 ID。
Area ID:区域 ID 字段,占 4 个字节,指定发送报文的路由器所对应的 OSPF 区域号。
Checksum:校验和字段, 占 2 个字节, 是对整个报文(包括 OSPF 报头和各报文具体内容,但不包括下面的 Authentication 字段)的校验和, 用于对端路由器校验报文的完整性和正确性。
AuType:认证类型字段, 占 2 个字节,指定所采用的认证类型, 0 为不认证, 1 为进行简单认证, 2 采用 MD5 方式认证。
Authentication:认证字段, 占 8 个字节,具体值根据不同认证类型而定:认证类型为不认证时,此字段没有数据, 认证类型为简单认证时,此字段为认证密码,认证类型为 MD5 认证时,此字段为 MD5 摘要消息。

Quagga实现OSPF路由器

​ quagga是一个主要部署在linux上的开源路由软件,是软路由的一种。 大部分企业的数据中心,在不同的网络里传输数据主要是依靠硬件路由器,在Linux系统部署上quagga也可以实现路由功能。 Quagga覆盖了所有重要的路由协议:OSPFv2和V3;RIP版本1,2和NG;甚至BGP。Quagga不止支持unix,也同样支持Linux,Solaris和FreeBSD,NetBSD等系统。

在CentOS上安装Quagga: yum install quagga

Quagga包括了几个协同工作的守护进程。Zebra: 核心守护进程,负责内核接口和静态路由。Ospfd: IPv4 OSPF 守护进程。

常见问题

Luckylau wechat
如果对您有价值,看官可以打赏的!