19-OSPF,数据包和状态

1.Router ID
  • 运行OSPF协议前,必须选取的一个RID
  • 用来唯一标识一台OSPF路由器(不能重复)
  • RID可以手动配置,也可以自动生成
 
1)选取规则
规则
备注
 
RID选取规则顺序
1.优选手动配置
2.活动回环接口中IP地址最大的
3.活动物理接口中IP地址最大的
 
注:任何选举值都未配置是运行不了OSPF的(router id为0.0.0.0);
       比较到物理接口中活动物理接口选取不出来,会选择非活动接口;
       RID选举具有非抢占性,修改除非重启OSPF进程;
       非抢占性:当RID设置后,如果出现了优先级更高的RID,不会替换原来的,除非重启OSPF;
        推荐使用手动配置路由器的Router ID,因为可以更容器区分路由器,方便后面的排错;
 
例如:
    如下图,路由器RTA,有回环口优先,因此RouterID的值选回环口地址中最大的 172.16.1.1;
    路由器RTB中没回环口,活动接口中ip地址最大的,虽然192.168.3.1最大,但它是非活动的故不考虑,选192.168.2.1作为RID; 
0
 
2)相关命令
查看路由器的Router ID:
dis ospf bri
 
手动配置Router ID:(手动配置的RID可以任意指定,和路由器的接口地址不一样也行)
ospf 1 router-id 1.1.1.1
 
2.OSPF数据包的结构和类型
OSPF是网络层协议,封装基于IP协议,协议号为89;
也就是说ospf的数据包在跟在ip包头后面:
 
1)ospf数据包结构
OSPF数据包分为OSPF报头和OSPF数据部分:
0
OSPF报头字段是固定的,OSPF数据包的内容由报头的类型决定
数据包有5种类型;
0
 
0
 
2)OSPF数据包的类型
0
 
OSPF数据包
作用
Hello
建立并维护邻居关系
Database Description (DD)
LSDB的摘要信息(仅包含LSA头部)
Link State Request(LSR)
请求LSA
Link State Update (LSU)
发送LSA (完整的LSA信息)
Link State Acknowledge (LSA)
对LSU的确认 (OSPF的确认机制)
1】hello包    ->建立并维持邻居
路由器之间互相发送hello来建立邻居关系,并且每隔一段时间发一次hello包来维持邻居关系;
Hello数据包中有一个字段Hello Interval 用来表示发送Hello包间隔的秒数;
Hello包中的字段Router Dead Interval 表示死亡间隔,也就是在这个秒数类,如果收不到邻居的hello包表示该邻居挂了;
 
2】DB Description包    ->比对LSDB
建立邻居后,接下来要进行LSA泛洪;
例如:路由器A和路由器B要交互路由信息;
有可能区域中的某些路由状态信息A和B都知道;
因此如果A和B总是交换全部的路由信息很浪费资源;
为了排除发送已知的路由信息,A和B在发送LSA之前会先互相对比二者LSDB;
如何对比:通过发送数据库摘要包DD;
比对数据库只在建立邻居时进行,邻居建立完成后不会再法DD包;
 
DD包有两个阶段:
第一个阶段,路由器各自发一个DD包,不包含LSA头;
第二个阶段,包含LSA的头部信息
LSA头中只并不包含完整的LSA信息;
主要有:
    LS Age     ->标识LSA信息的新旧程度;
    LSA类型    ->主要有两种类型:路由器LSA和汇总LSA;为了简化路由表可以手动汇总得到汇总LSA;
    LS的ID
    序列号    ->用作数据包的标识
    校验和    ->用来校验数据包是否正确,一般的协议都有这个字段
    长度    ->数据字段占的字节数
如果想查看路由器的完整LSA可以使用命令:
    dis ospf lsdb rou
 
3】LSR、LSU、LSAck包    ->路由器交换LSA
路由器A向B发送LSR,请求B有但A没有的LSA;
因为前面经过DD包比对,不会发送A已有的LSA从而节省资源;
B收到A的LSR后,向A发送LSU,LSU包中包含了LSA;
A收到B的LSU后,发送LSAck,表示确认收到;
    TCP有自己的确认机制,但OSPF协议位于网络层,是TCP的下层,不能使用TCP的确认机制,因此需要自己的确认机制;
    确认机制使用了LSA中的序列号
    例如:B向A发送的LSU中的LSA序列号是0x80000008,A给B的LSAck包的LSA头的序列号也是0x80000008
LSA的序列号也用来表示LSA的版本信息:
    例如:A删掉了一条路由,A会立即向B发送一条LSU,并且其中包含的LSA的序列号的值会在原来的基础上加1,表示这是该路由器最新的LSA
LSR在邻居建立时发送,当邻居建立完成后,只有在路由有变动时会发送LSU和LSA进行触发更新;
 
3.OSPF状态机制
1)ospf的八种状态
0
 
状态
备注
失效状态 Down
没有收到Hello包
初始状态 Init
收到了Hello包,但是邻居列表不存在我
双向通信状态 2-Way
收到了Hell包,且邻居列表存在我
交换初始状态 Exstart
决定交互信息时的路由器主从关系
交互状态 Exchange
向邻居发送DD数据包
加载状态 Loading
LSR和LSU和LSA报文交互阶段
完全邻接状态 Full
LSDB同步完成,形成邻接关系
 
 
2)建立邻居关系时状态的变化
hello包的最后一个字段为邻居列表,用来表示该路由器活动的邻居;
如果没有邻居,该字段为空;
如果路由器A刚开启ospf,A会发一个hello包,此时邻居列表为空
    (A:大家好,我是A,我一个都不认识)
B收到了A发送的hello包,但hello包中的邻居列表中没有自己
    此时B认为A对它来说是init状态
然后B也会发hello包,hello包的邻居列表字段中包含A
    (B:大家好,我是B,我有一个邻居A)
A收到了B的hello包,且在B的hello包中看到了自己;
    此时A认为B和它是two-way状态
 
例如:
    如下图,R1的状态变化:down->two-way
    R2的状态变化:down->init->twoway
0
 
3)建立邻接关系时的状态变化
1】Exstart状态
建立邻居关系完成后,路由器会进入Exstart状态;
在Exstart状态下,首先要决定路由器之间的主从关系;
如何决定主从关系:
    通过发送hello包建立邻居关系后,路由器A和路由器B之间会发送DB Description包来比较LSDB;
    DB Description包有两个阶段,第一个阶段的DD包不包含LSA,第二个阶段的DD包有LSA头部;
    其中第一个阶段的DD包就是用来决定主从关系的;
    DD包中有个字段DB Description,有4为二进制,每一位的值标识了特定的含义;
    DD包前面带有一个OSPF Header包,Header包中包含一个字段Router-ID;
    
    路由器A和B建立邻居关系后,发送DD包,比较二者的Router-ID;
    Router-ID高的位主(masrer),低的为从(slave);
    DD包中有个字段为序列号 DD Sequence;
    比较完成后,主路由器将决定两个路由器共同的DD Sequence;
        也就是主路由器和从路由器发DD包时都使用主路由器的序列号;
        只有主路由器能改变序列号;
        主路由器每发一个DD包,序列号加1;
 
2】Exchange状态
第一个DD包决定了主从关系后,发送第二个阶段的DD包,用来比较路由器的LSDB;
此时路由器的状态为Exchange;    
 
3】其它状态
路由器发送DD包比较LSDB完成后,进入Loading状态;
在Loading状态下,路由器之间互相发送LSR和LSU和LSAck包,来互相交换路由状态信息LSA;
当交互完成后,即进入稳定状态Full,形成邻接关系
 
4】建立邻接关系过程的图示
0
Exstart:序列号x,I=1表示是第一个发送的DD包,M=1表示后面还有DD包,
MS=1表示我是主(初始都是主)
通过比较Router ID值大的一方为主,向主发送的DD报文中序列号会变成主的序列号,同时这才是真正的DD报文
 
0
 
注:确认主从的作用是为了LSDB同步可靠
       同一区域内的路由器中LSDB必须是一致的(邻居表和路由表肯定不一样)
     
 
 
 
 
posted @ 2021-01-12 16:49  L丶银甲闪闪  阅读(325)  评论(0编辑  收藏  举报