网络互联技术(一)-OSPF协议
OSPF协议
一、OSPF介绍
开放式最短路径优先(Open Shortest Path First,OSPF)是对链路状态路由协议的一种实现,隶属内部网关协议(InternalGateway Protocol,IGP),运作于一个自治系统的内部。
1.每台路由器通过使用Hello报文与它的邻居之间建立邻接关系。
- 某一区域内的路由器只用维护该区域的链路状态数据库,而不用维护整个OSPF网络的链路状态数据库。
- 将某一区域网络拓扑变化的影响限制在该区域内,不会影响到整个OSPF网络,从而减小OSPF计算的频率。
- 将链路状态通告(LSA)的洪泛限制在本区域内,从而降低OSPF协议产生的数据量。降低网络的流量负担。
- 划分区域可以对网络进行层次化结构设计。
- 划分区域有利于资源合理调配,核心区域部署性能较好的设备资源,边缘区域部署性能较差的设备资源即可。
OSPF的区域一般分为骨干区域(Backbone Area)和非骨干区域(non-Backbone Area),如图。
骨干区域用于连接各个非骨干区域,非骨干区域之间并不能直接交换数据,必须通过骨干区域中的路由器(Router-A,Router-B)来进行网络通信。
图中的Router-C,Router-D,Router-E称为区域边界路由器(Area Bounder Router,ABR),用于其所属区域与骨干区域的联接。
三、DR/BDR/Dother
四、OSPF形成邻接的5个步骤及5个数据包
上面说过,OSPF网络中的路由器需要先与区域内的其他路由器(Neighbor,邻居)形成邻接(Adjacency)关系,OSPF网络的路由器只有邻接状态才会交换LSA,路由器会将链路状态数据库中所有的内容毫不保留地发给所有邻居。那么,要如何建立起邻接关系呢?这一过程具体涉及5个步骤及5个数据包,我们用上图Area 0中的Router-A和Router-B来举例说明。
1.Router-A首先使用组播地址(通常为224.0.0.5)发送Hello包(OSPF的第1个包),Router-B接受到Hello包之后给Router-A回复相关信息,两个Router建立起邻居关系(注意不是邻接关系)。
2.Router-A与Router-B相互发送DBD包(DataBase Description包,记录Router的链路数据库信息,是OSPF的第2 个包),确定Master/Slave。我们假使Router-A为Master(Router-A为DR),Router-B为Slave(Router-B为Dother)。
3.确定Master/Slave后,Dother向DR发送 LSR包(Link-state Request包,OSPF的第3个包),请求更新其链路状态数据库。
4.DR收到LSR包后,向Dother发送LSU包(Link-state Update包,OSPF的第4个包),更新其链路状态数据库。
5.完成更新后,Dother向DR发送LSAck包(Link-state Acknowledgment包。OSPF的第5个包),向Master表示答谢。
至此,Router-A和Router-B的完全邻接关系建立。更详细的过程如下图:
注:两台OSPF路由器要创建完全邻接关系,还有些前提条件,即,以下带*参数必须相同:
- Hello时间间隔*
- Dead时间间隔*
- 区域编号*
- 认证(如果启用了认证)*
- 链路MTU大小
- 子网掩码
- 子网号
- 末梢区域设置*
一般来说,创建OSPF完全邻接时会经过以下状态:
- 失效状态(Down):这是邻居会话的初始状态,表示最近没有从邻居收到信息。在NBMA网络上,可能仍然会以较低频率向处于Down状态的邻居发送Hello数据包。
- 尝试状态(Attempt):该状态仅仅适用于连接在NBMA网络上的邻居。该状态表示最近没有从邻居收到信息,但仍需要作进一步的尝试,来联系邻居。这时按某一特定间隔向邻居发送Hello数据包。
- 初始状态(Init):在此状态下,表示最近收到了从邻居发来的Hello数据包。但是,仍然没有和邻居创建双向通信(Bidirectional Communication),例如,路由器自身并没有出现在邻居发送的Hello数据包中。
- 双向通信状态(2-Way):此状态意味着两台路由器之间创建了双向通信。在此状态下还将进行DR和BDR的选举(只有处于2-Way状态的路由器才有资格参选DR和BDR)
- 信息交换初始状态(ExStart):这个状态是创建邻接关系的第一步。该状态的目标是决定信息交换时路由器的主从关系,并确定初始数据库描述(DD)数据包的序列号。具有最高路由器ID的路由器将成为主路由器。
- 信息交换状态(ExChange):在此状态的路由器通过向邻居发送DD数据包来描述其完整的链路状态数据库。每一个DD数据包都有一个序列号,并且需要被显式的确认。在任何时候,每次只能发送一个DD数据包。在此状态下,路由器也可以发送链路状态请求数据包,用来向邻居请求最新的LSA。实际上,这些状态的邻接关系完全有能力发送和接收所有类型的OSPF协议数据包。
- 信息加载状态(Loading):在此状态下,路由器将会向邻居路由器发送链路状态请求数据包,用来请求信息交换状态发现的最新的LSA。
- 完全邻接状态(Full):在此状态下,邻居路由器形成完全邻接关系。这些邻接关系将会在路由器LSA和网络LSA中被描述。
五、具体的实验过程
理论的东西讲完了,我们来看看具体的实验过程是怎么样的。
下图为本次实验的拓扑图,是一个非常简单的网络拓扑结构,仅由2个Router组成。
1、 具体配置:
R1(config)#int f0/0
R1(config-if)#ip add 192.168.1.1 255.255.255.0
R1(config-if)#no sh
R1(config-if)#int lo 0
R1(config-if)#ip add 1.1.1.1 255.255.255.0
R1(config-if)#exit
R1(config)#router ospf 1
R1(config-router)#router-id 1.1.1.1
R1(config-router)#network 192.168.1.0 0.0.0.255 a 0
R1(config-router)#network 1.1.1.1 0.0.0.255 a 0
R2(config)#int f0/0
R2(config-if)#ip add 192.168.1.2 255.255.255.0
R2(config-if)#no sh
R2(config-if)#int lo 0
R2(config-if)#ip add 2.2.2.2 255.255.255.0
R2(config-if)#exit
R2(config)#router ospf 1
R2(config-router)#router-id 2.2.2.2
R2(config-router)#network 192.168.1.0 0.0.0.255 a 0
R2(config-router)#network 2.2.2.0 0.0.0.255 a 0
2、 查看OSPF 邻接关系形成过程
命令:debug ip ospf adj (可用 u all 关闭调试进程)
clear ip ospf process
R2类似(略)
在显示的邻接信息中,我们可以看到上文中提到的数据包的具体发送与接收过程,下面还有更多的内容,这里就不展开了,有兴趣的朋友可以自己查看一下。
3、 查看OSPF包的发送过程
命令:debug ip ospf packet
OSPF包的组成
4、 查看哪些接口宣告进了OSPF?
show ip ospf interface
show ip ospf interface brief
Reference:
维基百科OSPL介绍:https://zh.wikipedia.org/wiki/%E5%BC%80%E6%94%BE%E5%BC%8F%E6%9C%80%E7%9F%AD%E8%B7%AF%E5%BE%84%E4%BC%98%E5%85%88
CCNP OSPF协议详解:http://blog.51cto.com/crystals/278415