一、背景介绍

OSPF作为IGP中最常用的2种协议之一(另一种ISIS后续介绍),有很多可以深挖的地方,所以作为重点会详细介绍,闲言少叙,言归正传。

二、什么是OSPF

ospf全称open shortest path first,是一种链路状态协议,即每一个接口向它同area的直连接口发送报文,最终以自己为根计算出一个无环的树,而这个树就是去往area各个角落的路由,计算出的路由保存在本地的lsadb中,同area内每一台路由器上的lsdb都相同。

三、OSPF的工作位置

根据TCP/IP协议的四层模型来划分,OSPF工作在第四层的传输层,协议号为89,而ttl值为1说明hello报文只和直连接口通过224.0.0.5的多播地址进行通信。
假装网络工程师2——初识OSPF_第1张图片
报文直接通过ospf封装后交给ip层,通过前面也了解到,ip层本身不具备可靠性链接的功能,而他又不是通过TCP这种可靠性链接进行传送,这就要求在通讯的机制中要保证可靠性。
假装网络工程师2——初识OSPF_第2张图片

四、OSPF建立连接的过程

上面说了ospf是将报文封装后直接交给网络层,而网络层本身不具备可靠性传输的机制,为了保证传输的可靠性,就需要ospf机制本身具备校验。
ospf建立连接分为5步,对应的报头编号为别为1~5为了便于记忆通过相亲的例子来进行说明,步骤如下:
1. A路由器加入ospf进程的端口向它直连B路由器的端口发起hello报文,此时好比相亲的双方初相识打个招呼一样。
假装网络工程师2——初识OSPF_第3张图片
2. 既然是相亲,主动发起的人就要主动一些,所以此时路由器A会向路由器B发出dbd(database describe)报文,其中包含了路由器A的lsa摘要信息,就好比相亲者会介绍自己的基本信息一样。需要注意的是:这一步如果是在多点接入和以太网环境下就确立了DR和BDR角色。
3. 此时B路由器会向A路由器发出lsr报文,索要更多的信息,就像女方觉得男嘉宾还不错,想多了解一些情况一样。
4. A路由器再次发出lsu报文,包含A路由器信息的lsa报文也在lsu报文中,该报文的报头编号为4。
假装网络工程师2——初识OSPF_第4张图片
5. 路由器B接收到路由器A的报文后会给A发送一条lsack信息,表示报文已接受到,正是这一步保证了ospf传输的可靠性。
假装网络工程师2——初识OSPF_第5张图片
至此,ospf的邻接关系就以建立完成,所有接口最后会进入全毗邻状态(full),上图中las的type类型会在后续进行说明,此处还需要说明的几处是:
1. ospf是一种端口敏感性协议,准确地讲ospf进程使起在接口而不是路由器本身上。
2. 所谓全毗邻(full)状态,他不是形容2个路由器之间的状态,而是站在一台路由器本身看对端与我的状态。
3. 邻居与邻接是两种不同的状态。举例来说,邻居就像你家对门的路人甲,虽然跟你是对门,但你们彼此不相识,ospf中的2-way就是一种邻居状态;而邻接是指对方不仅住在你在对门,而且你们彼此相识,full就是邻接状态。

五、OSPF的选举

前文说过,ospf工作在多路访问(MA)环境下会有dr、bdr的角色产生,角色选取的优先顺序如下:
1. 物理接口优先级
所有物理接口的默认优先级为1,数值越大优先级越高,优先级范围为0~255,0表示不参与选举。
2. route id,dr和bdr选取的依据,首先看route id,这是一个点分十进制的数值,可以手动指定,值越大,优先级越高,每一个ospf进程可以有不同的route id,指定时推荐的做法是在相应的ospf进程下指定doute id。
需要说明的是:ospf为了保证其稳定性,工作在非抢占模式,即当选举出dr后,后期就算有route id值更大的路由器加入,dr角色也不会转移,除非拥有dr角色的路由器下线或者对应ospf进程重启,才会重新选举。多路访问(MA)包括支持广播多路访问的以太网(BMA)和不支持广播多路访问的帧中继(NBMA)。

六、实验

实验拓扑如下图所示,最终要求1.1.1./24能够ping通2.2.2.2/24地址:
假装网络工程师2——初识OSPF_第6张图片
R1路由器上配置:

[R1]int g0/0/0  
[R1-GigabitEthernet0/0/0]ip add 12.0.0.1 24  
[R1-GigabitEthernet0/0/0]int lo0  
[R1-LoopBack0]ip add 1.1.1.1 24  
[R1-LoopBack0]q  
[R1]ospf 1 router-id 1.1.1.1  
[R1-ospf-1]area 0   
[R1-ospf-1-area-0.0.0.0]network 12.0.0.1 0.0.0.0  
[R1-ospf-1-area-0.0.0.0]network 1.1.1.1 0.0.0.0   

R2路由器上配置:

[R2-GigabitEthernet0/0/0]ip add 12.0.0.2 24  
[R2-GigabitEthernet0/0/0]int lo0  
[R2-LoopBack0]ip add 2.2.2.2 24  
[R2-LoopBack0]q  
[R2]ospf 1 router-id 2.2.2.2  
[R2-ospf-1-area-0.0.0.0]network 12.0.0.2 0.0.0.0  
[R2-ospf-1-area-0.0.0.0]network 2.2.2.2 0.0.0.0  

配置完成后发现尽管R2的router id为2.2.2.2但是dr的角色应然实在12.0.0.1接口上,应证了ospf工作在非抢占模式下。
假装网络工程师2——初识OSPF_第7张图片
在用户视图下重置R1上的ospf进程,再次检查,12.0.0.2接口则变为dr角色。

reset ospf 1 process  
[R1]dis ospf brief   

假装网络工程师2——初识OSPF_第8张图片
更多ospf的信息,可以从ospf的三张表中获取:

[R1]display ospf peer   //邻居表  
[R1]display ospf routing   //路由表  
[R1]display ospf lsdb  //lsdb表