Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

Vinllen Chen


To be a better coder

ospf协议

  最近系统的学习了下ospf路由协议,ospf较rip还是复杂很多,很多状态变迁,区域划分,不同的报文交互。每当拓扑发生变化,每台路由器都重新计算数据库,单个区域的ospf势必会导致拓扑过大,重计算消耗cpu的时间,以及存储完整地链路状态数据库消耗大量内存,所以在拓扑复杂情况下一般建议划分多个区域。
  ospf下路由器有以下几种角色:主干路由器、内部路由器、区域边界路由器、自主系统边界路由器。链路状态通告(LSA)描述了路由器及其连接的网络。路由器彼此交换LSA以获悉完整地网络拓扑,这让所有路由器的拓扑数据库都相同。建立拓扑数据库后,OSPF使用Dijkstra算法找出前往每个远程网络的最佳路径,再将它们加入到路由选择表。

1.DR和BDR

  DR和BDR:在OSPF网络中,各路由器之间不直接两两发链路状态信息,而是通过选举DR/BDR,DR为主,BDR为备份DR,把链路状态信息发给DR/BDR,由DR在组播给所有非DR/BDR的DROTHER路由器。

2.建立邻居

  发现邻居后,必须建立邻居关系,这样才能与邻居交换路由选择信息(LSA)。相邻OSPF路由器要建立邻居关系,需要经过两个步骤:

  1. 双向通信。使用Hello组播。
  2. 数据库同步。在此期间路由器将交换三种分组:数据库描述(DD)分组、链路状态请求(LSR)分组、链路状态更新(LSU)分组。

两台路由器的DB同步后,他们就建立了邻居关系。要建立邻居关系,以下方面必须一致:

  • 区域ID
  • 子网
  • Hello定时器和失效定时器
  • 身份验证方法(如果配置了)。

具体何时建立邻居关系取决于网络类型。如果链路是点对点的,只要两台路由器正确配置了Hello分组包含的信息,它们就将建立邻居关系。在广播多路访问网络中,OSPF路由器只与DR和BDR建立邻居关系。

3.OSPF路由器类型

  OSPF下必须有一个区域为0,这种区域称为主干区域。其他所有区域都必须与区域0直接相连。以下介绍了OSPF下几种路由器的类型。
  位于边界的路由器,即它的接口分属于多个区域,这种路由器被称为区域边界路由器(ABR)。ABR是属于多个OSPF区域的路由器,它在拓扑表中维护来自所有直连区域的信息,但不在区域之间分析拓扑信息。ABR分隔LSA洪泛区,是主要的区域地址汇总点,通常提供默认路由,同时维护其他连接的每个区域的链路状态数据库(LSDB)。
  内部路由器是这样的路由器:它们的所有接口都属于同一个区域。
  自主系统边界路由器(ASBR)是这样的OSPF路由器:至少有一个接口连接到外部网络(其他AS)。ASBR并不会自动在其OSPF路由选择进程和外部路由选择进程之间交换路由选择信息。这种路由交换是通过路由重发进行的。具体内容可以参考网上资料。

4.链路状态通告

  路由器的链路状态数据库由链路状态通告(LSA)组成。其一共有以下5种:

  1. 1类LSA。被称为路由器链路通告(RLA)或路由器LSA。由每台路由器向其所属区域的其他路由器发送。这种通告包含路由器连接的属于当前区域的链路的状态。如果路由器属于多个区域,则它分别发送针对各个区域的1类LSA。
  2. 2类LSA。被称为网络链路通告(NLA)。是由指定路由器(DR)生成的。DR使用2类LSA来发送网络中其他路由器的状态信息。2类LSA被洪泛到当前区域的所有路由器,而不会传到区域外部。
  3. 3类LSA。被称为汇总链路通告(SLA)。是由区域边界路由器(ABR)产生的。ABR将3类LSA发送到它连接的其他区域。3类LSA通告网络,还通告前往主干区域(区域0)的区域间路由。
  4. 4类LSA。由区域边界路由器生成(ABR)。ABR将4类LSA发送到它连接的其他区域。与3类不同的是,专门用于告诉其他OSPF区域如何前往ASBR。
  5. 5类LSA。被称为外部链路通告。由ASBR发送,用于通告前往OSPF自主系统外部的路由,将传遍整个OSPF自主系统。每通告一个外部网络,ASBR都将生成一个5类LSA。

  注意,在OSPF中,汇总链路通告并不一定包含网络汇总。除非管理员手动创建汇总,否则LSA通告的将是区域内所有的网络。

5.OSPF Hello

  Hello采用组播报文,使用224.0.0.5224.0.0.6分别表示所有OSPF路由器和DR/BDR路由器。默认10秒交换一次该消息,包括如下内容。

  • 路由器ID(RID)。如果配置了环回地址,则采用这个;否则,选择使用最大的物理接口地址。
  • Hello间隔和失效间隔。Hello默认10秒,失效为Hello4倍。
  • 邻居列表。发送Hello分组的路由器的所有邻居的路由器ID。
  • 区域ID。
  • 路由器优先级。
  • DR的IP。
  • BDR的IP。
  • 身份验证信息。(如果有)

6.邻居状态

  以下两个图是关于ospf的状态变迁图,图来自RFC2328。
ospf1
ospf2
  各个状态的简单说明:

  1. Down为初始状态。
  2. Attemp为非广播多路访问(NBMA)专用。该状态下,必须手动指定邻居。
  3. Init为接收Hello报文后额状态,此状态下邻居可见。
  4. 2-Way已建立双向通信。在广播多路访问网络中,此时将开始选举DR和BDR。
  5. ExStart状态下,DR和BDR已与网络中其他路由器建立邻居关系。在每台路由器和DR(BDR)之间建立主备关系。交换DBD分组后,进入ExChange。
  6. ExChange时,使用数据库描述(DD或DBD)分组来交换路由选择信息,还可能发送LSR分组和链路更新状态。此状态下有能力接收/发送所有OSPF报文。路由器开始发送LSR后,进入Loading。
  7. Loading状态为LSA DD交互完毕,发送LSR分组,收到LSU。
  8. Full为全连接建立。

  注意,点到点链路默认不选举DR和BDR。路由器ID默认为路由器的最大IP,但也可手动指定。配置OSPFv2时,不能将具体的网络和接口加入OSPF进程,必须用network命令指定,而OSPFv3支持对接口指定进程ID和区域号。


  最近碰到的问题是ospf在交互时阻塞在一端阻塞在exstart状态,另外一端阻塞在exchange状态,上网查了一些资料,普遍都说是MTU不同造成的,然后我这查看了下报文交互中的MTU字段,还真不是这个原因。真实原因在于报文只是单向能通,另外一向的报文由于种种原因被中断了,导致状态一直阻塞在exstart/echange状态。

参考

http://www.cisco.com/c/en/us/support/docs/ip/open-shortest-path-first-ospf/13685-13.html
http://www.cisco.com/c/en/us/support/docs/ip/open-shortest-path-first-ospf/13684-12.html
《CCNA路由和交换认证》

说明

装载请注明地址: http://vinllen.com/ospf


About the author

vinllen chen

Beijing, China

格物致知


Discussions

comments powered by Disqus