ospf协议基础和邻居的建立
网络互通:
-交换,同网段之间的设备通信;使用的互联设备是,叫交换机;
*核心工作表:MAC地址表
- MAC地址 ~~~~ 端口
-路由,不同网段之间的设备通信,使用的互联设备是,叫路由器;
*核心工作表:路由表
-网段 ~~~~ 端口
*路由器的类型:即路由表中的每个条目的学习方式
&直连路由
&非直连路由
#静态路由
#动态路由
IGP(internal gateway protocol ):内部网关协议,即在一个公司内部运行的路由协议
% DV(distance vector):距离矢量。该协议在路由器之间互相发送的是路由
1. RIP(routing information protocol):路由信息协议,适用于小型网络
2. EIGRP:增强型的内部网关路由协议;该协议是Cisco的私有协议;
%LS(link state):链路状态。该协议在路由器之间互相发送的是‘链路状态信息’
1. ISIS;当年提出是为了传递 CLNP 协议的路由;现在的ISIS也支持IPv4 / IPv6;
2.OSPF:open shortest path first ,开放式最短路径优先级协议,对网络规模理论来说是没有任何限制的
#EGP(external gateway protocol):外部网关协议,即运行在公司之间的路由协议
1. BGP(border gateway protocol):边界网关协议
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~·
OSPF:
- 概述:
该协议属于IGP中的LS类型,位于OSI模型的第三层,即该协议的数据包时包含在IP头部 后面
该协议运行在路由器之间,通过互相建立邻居,同步数据库的过程中,确保路由器之间的链路状态信息完全一致,从而可以计算出路由条目信息,实现不同网段之间的互 通。
-工作原理:
1. 建立邻居表,包含的是邻居路由器;
2. 同步数据库,包含的是链路状态信息;
3. 计算路由表,包含的是每个路由器基于自己的数据库条目信息‘独立计算’出来的路由条目
-报文类型:
1. 发送hello包,用于邻居的建立,维护和拆除
2. DD(database description),数据库描述报文。
3. LSR(link state request),链路状态请求
4. LSU(link state update),链路状态更新
5. LSACK(link state ack),链路状态确认报文,确保LSR和LSU的可靠传输;
实例:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
display ospf peer brief //查看ospf的邻居表
结果如下:
OSPF Process 1 with Router ID 192.168.12.1
Peer Statistic Information
----------------------------------------------------------------------------
Area Id Interface Neighbor id State
0.0.0.0 GigabitEthernet0/0/0 192.168.12.2 Full
----------------------------------------------------------------------------
#process,表示OSPF的进程号,用于在同一个路由器上区分不同的 OSPF 协议;进程号不同的两个OSPF互相不能通信;
#router-id,表示OSPF协议为该路由器起的名字。作用:在一个企业内网中,唯一的表示一个OSPF路由器。
router-id的格式类似于IP地址,是“点分十进制” 的表示方法。确定方式有两种:
--手动指定:手动指定的router-id,数值随意,比如1.1.1.1或2.2.2.2
--自动选举:首先会选择设备上的接口IP地址最大的 loopback接口,如果没有这种接口,就选择一个IP地址大的物理接口
#area ID,表示OSPF的接口所在的区域号。OSPF协议为了支持将企业网络分为两层,所以引入了“区域”这个概念
OSPF协议可以将网络分为“骨干区域”和“非骨干区域”。每个不同的区域都有一个区域号,该字段是4个字节;
取值范围是0---4294967295.其中的区域 0 表示骨干区域。其中非 0 的区域,称之为非骨干区域。
不同区域之间的互联原则是:所有的非骨干区域,必须连着骨干区域。
#interface,表示的是本地设备上用于和对方设备监理邻居时所使用的接口;
#neighbor ID ,表示的是邻居设备的router-id
#state ,表示的是邻居设备的状态。两个OSPF路由器之间的完美的状态,应该是FULL。此时两边的数据库完全同步!
但是中间也有很多中间状态:down--->init --> two-way-->exstart -->exchange-->loading --> full
如何修改R1的router-id ?
例:修改R1的router id 为1.1.1.1,修改R2的route ID为2.2.2.2
R1: ospf 1 router-id 1.1.1.1
R2:ospf 1 route-id 2.2.2.2
但是配置后使用display ospf peer brief 查看route id还是原来的route-id,配置并没有生效。
需要重启OSPF协议进程分别在R1和R2路由器上的用户模式使用命令:reset ospf process 选择 Y,就可以了。
router-id的特点:
稳定,即一旦OSPF进程的router-id确定了,那么就不会再改动。除非设备重启或者OSPF协议重启
OSPF建立的影响因素:
@确保两边的IP地址可以互通
*可以ping通
@确保设备可以发送OSPF报文
*设备互联接口网段进行了network
*设备之间的互联接口没有被配置为“被动接口”/“静默接口”
#命令:ospf 1
silent-interface GigabitEthernet 0/0/0 //配置g0/0/0为静默接口
@确保设备之间发送的方式相同
*要么都是组播,要么都是单播【单播的邻居,只有在“NBMA”环境下才会有!】
@确保设备可以接收OSPF报文
*设备互联接口网段进行了network
*设备之间的互联接口没有被配置为“被动接口”/“静默接口”
*设备之间配置的ACL没有拒绝OSPF报文
@比较hello报文参数。
--router-id,必须不同
--area ID,必须相同
--认证必须成功
--掩码必须相同(特殊情况下-即选举DR的情况下)
--子网掩码必须相同
--hello计时器必须相同(默认是10s发送一次hello包)
--dead计时器必须相同(默认是40s)
--特殊标记位必须相同
--优先级不能全为0(两个同域的ospf接口不能同时为0)
特殊情况下-即选举DR的情况下优先级不能全为0
修改优先级命令:int g0/0/0
ospf dr-priority 0 //范围0-255,默认是1
hello计时器和dead计时器配置命令:
查看hello计时器时间:display ospf int g0/0/0 //就是ospf协议的出接口
修改hello的时间使用命令:int g 0/0/0
ospf timer hello 5 //修改hello发送时间为5s,注意修改hello时间后 Dead (router dead interval)时间也会被动改变
dead的时间总是hello时间的4倍,所以修改hello时间为5S后,dead时间被动变为20s。
*Dead(router dead interval):表示维护ospf邻居关系的超时时间,默认40s,超时后未收到对方发送 的hello报文,邻居关系断裂。
修改dead的时间使用命令:int g0/0/0
ospf timer dead 15 // 单位为S,修改dead的时间不会影响hello的时间改变。
OSPF的网络类型:
任何一个运行了OSPF协议的链路,都对应这一个默认的网络类型。在不同的网络类型下,OSPF的工作方式不同的,并且,在数据库中表示这个链路的方式也是不相同的(即LSA也是不相同的)。
但是,我们可以基于需要,人为的修改每个链路的OSPF网络类型。
类型分类:
*broadcast,广播
*nbma,非广播(non-broadcast mulit-access)
*p2p,点到点(point to point)
*p2mp,点到多点(point to multi-point)
OSPF有多个邻居的情况下:
OSPF路由器建立邻居之后,就会在不同的路由器之间“同步数据库”。
如果一个接口上同时连着多个OSPF路由器,那么就会认为建立了多个OSPF邻居。所以后面再进行同步数据库的时候,就会出现:
&同网段中存在多个路由器的情况下,数据库的同步过程中,会出现大量的重复信息,降低了数据库的同步效率。
为了提高数据库的效率,我们可以:在多个路由器之间指定一个OSPF路由器,用来收集和扩散其他邻居设备的数据库信息,从而提高数据库的同步效率。
&这个指定的OSPF路由器称之为:DR(designated router) 指定路由器,该网段中的所有路由器都仅仅和DR路由器同步数据库信息。
&但是,如果DR故障了,那么数据库就无法同步了。所以为了安全,我们可以再次选举一个备份的DR出现,即BDR-backup DR。
如果在一个网段中存在多个OSPF路由器的情况下,我们选举DR和BDR,那么其他的设备,就只能称之为DRother。
那么他们的关系是:
&所有的设备都和DR/BDR 同步数据库,之间的状态时FULL
--224.0.0.5,表示的是所有的OSPF路由器;224.0.0.6,表示的是DR和BDR。即DRother发送数据库更新时,是给该地址
&DRother之间的状态时two-way
--DR指的并不是一个路由器,而是一个接口
DR的特点:
即当一个网段中需要选举DR的时候,并且已经选定了DR.那么即使后续该网段中再次接入其他优先级更高的路由器,也不会抢占DR的身份,除非重启OSPF协议进程。
DR的选举原则:
只有接口的DR优先级不为0的设备,才有资格参与。【优先级为0的设备,永远只能称之为DRother】
&首先比较设备的DR的优先级,数值越大越好;默认是1
&其次比较设备的router-id,越大越好
并且,OSPF的工作方式完全取决于一个接口的“网络类型”,当接口的网络类型是:广播和非广播的时候,才会进行DR/BDR的选举。
网络类型:广播(broadcast)
是否要DR:是
是否发包:是
发包方式:组播,224.0.0.5
hello计时器:10s
dead计时器:40s
网络类型:非广播(NBMA)
是否要DR:是
是否发包:否
如果要发包,则发包只能是:单播
hello计时器:30s
Dead计时器:120s
网络类型:点到点(P2P)
是否要DR:否
是否发包:是
发包方式:组播,224.0.0.5
hello计时器:10s
Dead计时器:40s
网络类型:点到多点(P2MP)
是否要DR:否
是否发包:是
发包方式:组播,224.0.0.5
hello计时器:30s
Dead计时器:120s
OSPF网络类型配置命令:
interface g0/0/0
ospf network-type [ broadcast | nbma | p2p | p2mp ]
手动向邻居发送hello包:
ospf 1
peer x.x.x.x //x.x.x.x为邻居接口的IP地址
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
详细分析OSPF邻居的状态:
Down-表示邻居挂掉了或者“在Dead时间内”,没有收到对方发送过来的Hello报文;
init-初始化,表示能够收到对方设备发过来的hello报文,但是对方的报文中并没有自己的router-id;
Two-way:双向通信状态。表示能够收到对方设备发送过来的hello报文,并且该报文中还能看到自己的router-id;
如果此时邻居之间需要选举DR,那么这个选举的过程,就是发生在“该状态”。此时选举但是选举不出来,两个路由器之间状态,就会卡在two-way(比如在广播和非广播环境下,两个DRother之 间,就会卡在two-way)
Exstart:交换初始化状态。在该状态的事情,都是为了后续的exchange(交换)过程更加的高效和靠谱。
所以会在这个阶段,双方互相发送“第一DD”报文,用于选举出‘主/从’路由器,目的就是为了确保在exchange状态发送的大量的DD报文,是按照可靠的方式发送的。
选举主/从关系的原则:比较设备之间的route-id,越大越好
选举出DR/BDR之后:从路由器发送的DD报文的序列号一定要跟随着主路由器发送DD报文的序列号的变化而变化。
并且在这个阶段,我们还会比较DD报文的"MTU字段",如果两边相同,则继续进入下个状态;如果两边不同那么邻居之间的状态,就有可能卡在这里。【默认情况下,华为设备是不检查这个参数的
;但是可以人为打开该功能】
*在DD报文中,有三个重要的标记为:
I(init)表示该DD报文是不是第一个DD报文;如果取值为1,表示为第一个DD,如果是0,表示不是第一个;
M(more)表示该DD报文是不是最后一个DD报文;如果取值为1,说明后面还有更多DD,不是最后一个;如果取值为0,说明后续已经没有更多的DD报文了,即表示当前的DD报文
是最后一个DD报文;
M/S (master/slave)表示发送这个DD报文的路由器的的身份,是“主”路由器,还是“从”路由器;
刚进入exstart状态的时候,大家发送的第一个DD报文中,都认为自己很牛,所以该标记位都是1.
经过route-id的比较之后,大的路由器发送的MS位就是1;小的路由器发送的MS位就是0;
exchange:交换状态。在该状态下就是依据上述的主从关系,进行大量的DD报文的发送,用于描述彼此的数据库条目信息。
当然我们在DD报文中包含的是自己的数据库中的每个条目的“摘要”信息,不是详细的。
当两边的DD报文全都传输完毕以后,就会进行DD报文的比较,从而找出两边的数据库的差异
loading:加载状态。基于上述数据库的比较结果,我们就知道两边数据库的差异。所以在这个阶段就开始向邻居设备发送LSR进行请求自己没有的数据库条目的详细信息。对方设备收到以后,就会回应一个 LSU,里面包含的就是链路状态的详细信息。此时,每次发送LSR和LSU,两边都会发送LSACK对上述的两个报文进行确认。
full:一旦loading状态完成,说明邻居之间的数据库就已经完全一致了。从而进入到了FULL状态,此时称之为“邻接”!
’