OSPF协议分析

摘要

这是OSPF协议的两份报告中的第一份,这些报告是因特网工程指导组要求的,是用来将一个因特网协议写成标准草案的。OSPF是一个TCP/IP协议族中的一个的路由协议,被设计用于一个自治系统的内部(换句话说,OSPF是内部网关协议)。

这份报告试图总结一下OSPF第二版本的关键特征,它也试图去分析该协议在因特网中将如何运行和扩展。

1.0介绍

这份文档为OSPF V2说明了因特网工程指导组将一份协议升级为标准草案的一些要求。这些要求会被在下文简单的加以总结。文档剩余部分则说明了OSPF V2如何去满足这些要求:

  • 协议的关键特征和算法
  • 在正常情况下,协议需要消耗多少的带宽,路由内存,路由CPU;
  • 对于这些度量,随着路由环境的增长,消耗量会如何增加?这至少得包含对比现在情况大一个数量级的路由拓扑的考察;
  • 协议在这些度量方面的局限在于哪里?(换言之,什么时候路由协议崩溃?)
  • 在什么环境下协议是最合适的,什么情况下又是不合适的?

1.1基本

OSPF协议是由Internet任务工程组的OSPF工作小组开发的。

2.0 OSPF协议的关键特征

这部分总结了OSPF的关键特征。OSPF是一个内部网关协议,它被设计用于一个单一自治系统的内部。OSPF使用基于链路状态和SPF算法的技术(其余的路由协议比如RIP则是基于距离向量或者Bellman-Ford算法的)。一个链路状态通告描述了部分OSPF路由区域(自治系统)的情况。这些LSAs在路由区域内传递,形成链路状态数据库。每一个路由都有一个完全一样的链路状态数据库,链路状态数据库的同步依赖于一个可靠的flooding算法。根据这个链路状态数据库,每个路由器通过计算一棵最短路径树建立一个路由表,而最短路径树的根就是进行计算的路由器本身。计算过程通常被称作Dijkstra算法过程。

LSAs是很小的,每一个通告都描述了OSPF路由域的一小部分。也即是:附近的路由器,附近的一个传输网络,一个区域间路由或者一个外部路由。

OSPF协议的其余关键特征如下:

  • Adjacency bringup。某些特定的OSPF路由器对称为“邻接”的。当一个邻接形成的时候,两个路由器就以OSPF数据库交换包的形式通过交换数据库摘要同步它们的链路状态数据库,然后邻接路由就通过可靠的Flooding算法来维护链路状态数据库的同步。通过串行线连接的路由器总是邻接的。在多路访问网络上,所有连接到该网络的路由都和指定路由以及备份指定路是邻接的。
  • 指定路由。所有的多路访问网络都有一个指定路由。网络的指定路由产生描述网络本地状态的LSA。它也会在Flooding算法中扮演一个特殊的角色,在Flooding过程中,所有的路由都通过向指定路由发送和接受LSAs来同步它们的链路状态数据库。
  • 备份指定路由。备份指定路由器是在多路访问网络上,当当前的指定路由器失效的时候被选来加快指定路由器的切换速度,减轻路由器切换的负担。当指定路由器失效的时候,备选指定路由器就担负起占指定路由器的职责,并且不需要再去走一遍LAN上的adjacency bringup过程。
  • 支持没有广播的多路访问网络。OSPF对LAN提供非常良好的支持。然而这需要连接到该网络的路由提供额外的配置信息以便于一开始就让它们能发现对方;
  • OSPF域。OSPF允许自治系统分裂成称为域的部分。这非常有用:第一,这提供了更高级的路由保护:一个域之内的路由被与其他域的各种路由信息隔离开来。第二,将自治系统分割成域降低了Dijkstra算法的开销;
  • 外部路由信息的灵活导入。使用OSPF,每一条外部路由都是通过一个独立的LSA导入到自治系统的。这减少了Flooding算法的开销(因为外部路由经常变化,你只需要关注变化即可)。它也允许当一个外部路由变化部分路由表进行更新。OSPF外部LSAs也提供如下特征:一个forwarding address会被包含在外部LSA中,估计从自治系统边缘到该路由的多余跳数。有两种级别的外部度量方式可以被采用,类型1和类型2。而且,外部路由可以使用一个32-Bit的数进行标记,这简化了自治系统对外部路由的管理。
  • 四种级别的路由类型。OSPF有四种路由类型:域内路由,域间路由,E1,E2。这提供了多种级别的路由保护,也简化了自治系统对路由的管理。
  • 虚拟链路。通过对虚拟链路的设置,OSPF消除了自治系统对域布局的拓扑限制;
  • 路由协议交换认证。每次运行OSPF的路由收到一个路由协议包,它就会在处理它之前去认证它;
  • 灵活的路由度量。在OSPF中,度量被分配到边界路由的端口上。路径的开销则是组成路径的端口的度量的总和。路由度量本身是可以被系统管理员进行设置来反映网络特征的组合的(比如:延迟,带宽,花费,等等)
  • 等价路径负载均衡。当到达一个目的地的多条花费最少的路径存在,OSPF就会找到它们并且利用它们分担到达目的地的通信负担;
  • 支持可变长度子网掩码。

3.0协议开销

这部分试图分析OSPF协议如何在网络中运行和扩展。在本次分析中,我们将会专注在以下四个部分:

l  链路带宽。在OSPF中,可靠的Flooding机制被用来保证路由器之间的链路状态数据库是同步的。链路数据库的单条记录会定期被更新,但是不经常发生(大约30分钟一次),这是在拓扑结构没有变化的时候。而随着网络规模的扩大,Flooding过程所消耗的链路带宽也会一起增加;

l  路由内存。OSPF链路状态数据库可以变得非常大,尤其是当出现很多的外部LSAs的时候,这就需要更多的路由内存

l  CPU的使用。在OSPF中,这是由计算最短路径所花时间的长度主导的。它是OSPF系统中路由数量的函数;

l  指定路由的角色。在多路访问网络中指定路由比其他链接到网络的路由会接收和发送更多的包。而且,也会有一些时间花费在:当老的指定路由失效的时候切换到新的指定路由上去(尤其是当指定路由和备份指定路由同时失效的情况)。因为这个原因,你可能会想去限制连接到同一个网络的路由器的数量。

剩余的部分将会分析这些方面,去估计OSPF协议将会在现在和未来产生多大的开销。为了辅助分析,下一部分将会展示一些从实际的OSPF部署中得到的数据。

3.1实际数据

OSPF协议已经被部署到因特网的许多地方,所以可以通过本地网络管理设备从一些实际的实验中收集一些数据。一些数据展示如下表:

表1 相关实际数据

第一行数据显示了三个网络上数据收集的时间,其余的数据简单解释如下:

l  Dijkstra频率。在OSPF中,Dijkstra计算仅仅包含属于自治系统的路由和传输网络。Dijkstra算法只会在系统发生变化的时候运行。值得注意的是在这些系统中,Dijkstra运行的其实并不频繁(最频繁的才13分钟一次);

l  外部增减变化频率。在OSPF中,当一个外部路由变化的时候,只有它在路由表中的记录会被重新计算,这就是外部路由变化更新。要注意的是,外部变化发生的频率要比Dijkstra运行的频率高得多(换句话说,外部增减变化节省了很多的运行时间)

l  数据库更新。在OSPF中,链路状态通告每30分钟更新一次。当网络拓扑发生变化的时候新的通告就会被更加频繁的发出去。表格数据显示,即使将网络变化考虑在内,通告还是平均接近30分钟更新一次。这些数据将会在接下来的链路带宽计算中被使用。

l  每一个包中的LSA。在OSPF中,多个LSAs可以被包含在一个链路状态更新或者链路状态告知包里面。表格数据显示,一个包里面平均有3个LSAs。这些数据是将传送出去的LSAs除以广播数量得到的;

l  Flooding重传。这里计算了链路状态更新包和链路状态确认包两种包的重传,算出了作为原始包数量的百分比。表中数据显示Flooding工作的很好,重传的包的数量在链路带宽计算中基本可以被忽略。

3.2 链路带宽

在这一部分,我们试图去计算OSPF的Flooding过程消耗了多少的链路带宽。链路带宽的消耗随着OSPF数据库中的通告数量线性增加。我们假定OSPF数据库中主要的通告是来自自治系统外部的LSA。

根据在3.1中的表格数据,任何通告都会在30分钟左右被Flood一次。另外,一个数据包中包含三个通告。一个自治系统外部的LSA是36个bytes大小,加上1/3的头部大小(IP头部大小加上OSPF更新包的大小)是52个bytes。每30分钟传输这个数量的数据,平均速率是23/100bits/s(52*8/30*60)

如果你想把路由通信量限制在总体带宽的5%以下,你就会得到以下数据库的最大值

表2链路速度和数据库的大小

(2087=9.6Kb/s * 5%  /(23/100b/s) )

更高的链路速度没有被包括进来,因为其他因素会在链路速度成为问题之前限制数据库的大小(比如路由内存)。值得注意的是,在前面的计算中,数据链路头的大小没有被考虑进去。而且,注意到虽然OSPF数据库中绝大部分是外部路由LSAs,其他的LSAs也还是有大小的。粗略估计,路由链路和网络链路大概是外部链路的三倍大小,总共的链路通告则和外部链路LSAs差不多一样大。

OSPF比起RIP消耗的链路带宽要小得多。这在NSI网络中已经被实际验证。

3.3 路由内存

OSPF的存储需求是由链路状态数据库的大小决定的。根据前面的部分,合理假设数据库中的绝大部分通告是外部LSAs。外部LSAs是36个byte大小,它会被OSPF实现利用一些支持数据存储下来。所以,一个外部LSA尺寸比较准确的估计是64bytes。所以一个有10000条外部LSAs记录的数据库会消耗640kb的路由存储空间。P4200是由足够的存储空间容纳10000条外部LSAs的,并且也有足够的包缓存空间供足够数量的接口使用。

同样需要注意的是,别的LSAs也有一定的尺寸。

3.4 路由CPU

假设随着OSPF路由域的扩大,每个路由的接口数量仍然是有限制的。那么Dijkstra算法的复杂度就是O(n*logn)的,n是路由域中路由的数量。当然,至于到底Dijkstra算法会消耗多少的计算能力,这要看算法的具体实现。

我们没有真的OSPF实现中Dijkstra算法CPU消耗量的具体实验数据。然而,Steve Deering在”MOSPF meeting report”中呈现了Dijkstra算法的结果。他的计算是在DEC5000上进行的,使用斯坦福的网络作为模型。他的图是基于网络的数量而不是路由的数量。但是如果我们推断路由数量和网络数量一致,那么在Steve的实现中200个路由运行Dijkstra算法的时间大约是15ms。

这看上去是一个合理的开销,尤其是当你注意到Dijkstra计算在实际的部署中运行的并不那么频繁。在3.1中展现的三种网络平均13-50min运行一次Dijkstra算法。由于Dijkstra算法运行的并不是那么频繁,所以大致上OSPF比起RIP来可以更少的消耗CPU资源(RIP频繁的更新,要求查询路由表)。

另外一个例子是,MILNET中的路由算法是基于SPF的。MILNET目前有230个结点,路由计算仍始终低于MILNET交换机处理器能力的5%。因为MILNET网络中的路由算法会根据网络负载调整,它会非常频繁的运行Dijkstra算法。然而,需要注意的是MILENET中的路由算法会逐渐的更新SPF树,而OSPF每次计算都会从头开始构建树。

OSPF的域能力提供了一个方法来减少Dijkstra开销,如果它的开销过大的话。路由域可以被分割成很多个域。每次Dijkstra计算的范围以及复杂性都被限制在一个单独的域中了。

3.5 指定路由器的角色

这部分探索了一个单一网络可以容纳的路由器数量的最大值。随着一个网络中路由器数量的增长,OSPF产生的路由通信量也会增加。有一些是建立通信的通信量,大致每隔10秒中每隔路由就会广播一次。这个开销是网络中所有路由一起产生的。然而,由于指定路由在Flooding过程中的特殊角色,指定路由最后肯定会比网络中别的路由产生更多地链路状态更新包。而且,其余的路由只会从指定路由获取链路状态确认包,而指定路由则会接收所有路由的确认包。

所以,如果LAN上协议的通信量成为一个问题的话,问题一定最先在指定路由上被探测到。然而,这样的问题在实际中是不会产生的,因为OSPF产生的路由协议通信量被证明是很小的。而且,如果需要,OSPF的Hello定时器可以被设置来减少网络上的路由协议通信量。在协同工作测试中,13个路由器被放置在一个网络中,而没有任何问题发生。

另外一个问题是,当指定路由失效,新指定路由的切换时间。OSPF有一个备份指定路由以便于当当前的指定路由失效的时候,切换到新的指定路由器不需要需要等到它和所有其余的路由完成同步才能进行。然而,有一些极端稀少的情况是,指定路由和备份指定路由同时失效,则新的指定路由在可以工作之前就需要和其余的路由进行同步。现场实验表明同步过程发生的非常及时。然而,在有很多的路由的网络中这或许会是一个问题。

在LAN中路由数量成为问题这样一个不太可能发生的事情上,也不会因为路由协议通信量或者切换时间成为一个问题,因为LAN可以被切分为几个单独的部分(类似于将AS切成几个域)。

3.6总结

总体看来,限制OSPF系统大小的瓶颈最有可能是路由的内存大小了。我们已经知道,通过特定实现的配置组合,10000条外部LSAs是可以被支持的。其他的实现或许会有所变化。如今的路由已经有越来越多的内存了,而且10000个路由器已经远比最大的现实实现要大得多了。

注意到,在一个路由范围中,是可以有一些别的办法去减少数据库大小的。第一,路由范围可以利用默认路由,减少导入的外部路由的数量、第二,EGP协议可以被使用来在AS之间传递路由信息,而不用依赖IGP(这里是指OSPF)来做路由信息转换;第三,内存不足的路由可以使用末梢区域;最后,如果网络抛弃了平面地址空间,导入OSPF路由范围的外部信息的数量就会被大大的减少。

虽然不大可能,但是仍然有其他因素会限制路由范围的大小,比如:如果链路很慢,那么数据库的大小就会受到限制;如果有网络中有上百个路由,Dijkstra算法就会变的非常昂贵;最后,当有很多的路由在同一个网络中的时候,那么指定路由就会承担过度的负担(这个时候LAN可以被分解成几个单独的LAN)。

4.0 适合的环境

OSPF协议适合大小各异的网络环境。OSPF有以下几个原因特别适合transit自治系统:OSPF可以承受大量的外部路由;使用OSPF,外部信息的导入非常灵活,提供了forwarding address,两种外部路由度量方式以及为了方便管理管理外部路由使用AS数字给它们打上标签的能力。当外部路由变化OSPF可以只进行部分更新的能力使得它在这些网络中变得非常有用。

OSPF也因为它的一系列特征,非常适合更小的,独立的或者stub自治系统:快速集合,等价路径负载均衡,TOS路由,域,等等;

5.0 不适合的环境

OPSF的表达策略能力很有限。基本上来说,它的策略机制只表现在四种路由类型的建立中:域内路由,域间路由,E1,E2。如果一个系统想要更加精细的策略,就将它划分成多个独立的自治系统,使用基于策略的EGP连接它们。

【网络】RFC1245-OSPF Protocol Analysis的更多相关文章

  1. 在 FR 网络配置 OSPF

    一.环境准备 1. 软件:GNS3 2. 路由:c7200 二.实验操作 实验要求: 1.掌握配置帧中继的基本方法. 2.掌握在路由器中模拟帧中继交换机的方法. 3.掌握 NBMA 网络中 OSPF  ...

  2. 网络:OSPF理解

    OSPF(开放最短路径优先)协议使用Dijkstra算法,常见的版本有:OSPFv2.OSPFv3等.以下主要介绍OSPFv2,OSPFv3是面向IPv6的且不兼容IPv4. 1.工作过程: 1)每台 ...

  3. IEEP部署企业级网络工程-OSPF邻居关系故障排除

    OSPF邻居关系故障-现象与排除 一.OSPF邻居关系故障-现象与排除 1.OSPF建立邻居关系时,将检验hello报文中的Area ID .Autype.Authentication.network ...

  4. Protocol Informatics (PI项目)【基于网络轨迹的协议逆向工程文献学习】

    Protocol Informatics[基于网络轨迹的协议逆向工程文献学习]by tsy 声明: 1)本报告由博客园bitpeach撰写,版权所有,免费转载,请注明出处,并请勿作商业用途.恕作者著作 ...

  5. 网络初级篇之OSPF(一)原理

    一.OSPF是什么 Open Shortest Path First, 开放最短路径优先协议,是一种开源的使用最短路径优先(SPF)算法的内部网关协议(IGP).常用于路由器的动态选路. 二.OSPF ...

  6. PatentTips - Highly-available OSPF routing protocol

    BACKGROUND OF THE INVENTION FIG. 1A is a simplified block diagram schematically representing a typic ...

  7. 前端学HTTP之网络基础

    × 目录 [1]网络 [2]OSI [3]TCP/IP 前面的话 HTTP协议对于前端工程师是非常重要的.我们在浏览网站时,访问的每一个WEB页面都需要使用HTTP协议实现.如果不了解HTTP协议,就 ...

  8. OSPF协议详解

    CCNP OSPF协议详解 2010-02-24 20:30:22 标签:CCNP 职场 OSPF 休闲 OSPF(Open Shortest Path Fitst,ospf)开放最短路径优先协议,是 ...

  9. RIP、OSPF、BGP、动态路由选路协议、自治域AS

    相关学习资料 tcp-ip详解卷1:协议.pdf http://www.rfc-editor.org/rfc/rfc1058.txt http://www.rfc-editor.org/rfc/rfc ...

随机推荐

  1. hadoop问题集(2)

      28. Sqoop: java.lang.NullPointerException sqoop import --connect jdbc:oracle:thin:@//xxxx:1521/aps ...

  2. 如果Python对于磁盘没有写入权限,还会运行吗?

    Python如果对于磁盘没有写入权限,那么编译成功的字节码文件就只会存储在内存当中,而不会写入到磁盘,每次运行Python都会重新编译,然后运行.

  3. default & delete

    一.使用“=default” 1. 显式生成拷贝控制成员的合成版本 class A { public: A() = default; A(const A &) = default; A& ...

  4. 【week2】 累计进度条、psp、饼图

    每周例行报告 本周PSP 类别 任务 开始时间 结束时间 被打断时间 总计工作时间 2016年9月9日 读书 构建之法-5.6章 19:00 20:00 0 60min 2016年9月10日 看博客 ...

  5. Jedis源码解析——Jedis和BinaryJedis

    1.基本信息 先来看看他们的类定义: public class Jedis extends BinaryJedis implements JedisCommands, MultiKeyCommands ...

  6. 【重读MSDN之ADO.NET】ADO.NET连接

    连接到ADO.NET中的数据源 在 ADO.NET 中,通过在连接字符串中提供必要的身份验证信息,使用 Connection 对象连接到特定的数据源.使用的 Connection 对象取决于数据源的类 ...

  7. JAVA IDE IntelliJ IDEA使用简介(二)—之基本操作

    一.在编辑器中打开文件  1.可以使用下面的几种方式打开project内的文件进行编辑  (·)在project窗口中双击需要编辑的文件.  (·)在project窗口选择需要编辑的文件,按F4  ( ...

  8. 使用WebClient类对网页下载源码,对文件下载保存及异步下载并报告下载进度

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAx4AAAI7CAIAAADtTtpYAAAgAElEQVR4nO3dX6xlV33Y8f3UJFUqHq

  9. C语言指针【转】

    一.C语言指针的概念 在计算机中,所有的数据都是存放在存储器中的.一般把存储器中的一个字节称为一个内存单元,不同的数据类型所占用的内存单元数不等,如整型量占2个单元,字符量占1个单元等,在前面已有详细 ...

  10. BZOJ4259:残缺的字符串——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4259 很久很久以前,在你刚刚学习字符串匹配的时候,有两个仅包含小写字母的字符串A和B,其中A串长度 ...