zl程序教程

您现在的位置是:首页 >  其它

当前栏目

浅谈OSPF

浅谈 ospf
2023-09-11 14:22:31 时间

OSPF

该协议叫做 OSPF - open shortest path first ,开放式 最短 路径 优先级协议,通过该协议计算出来的肯定是去往一个目标网络时,所使用的最短的、无环的转发路径

该协议属于 OSI 模型第三层,协议号是 89 。 所有的 OSPF 报文,都是包含在IP头部后面

该协议的报文,是通过组播的方式发送的,组播地址是 224.0.0.5 和 224.0.0.6 。

然后在路由器之间来回的发送,从而就可以让路由器互相学习彼此的路由条目。

OSPF工作原理

  1. 建立邻居表:包含的是成为邻居关系的设备,所有的OSPF报文,仅仅在邻居之间发送
  2. 同步数据库:包含的是自己的以及从邻居学习过来的“链路状态信息/通告”- LSA(advertisement)
  3. 计算路由表:包含的自己基于“数据库中的LSA”计算出来的最好的路由条目

OSPF报文类型

  1. hello,用于邻居表的建立、维护和拆除
  2. dd,database description,数据库描述报文,用于实现数据库的快速和可靠的同步
  3. lsr,link state request,链路状态请求,用于请求想要的“LSA”的
  4. lsu,link state update,链路状态更新,用于发送 LSA 报文的
  5. lsack,link state acknowledge,链路状态确认,用于实现 LSR 和 LSU 的可靠传输

OSPF报文分析之 Hello

  • OSPF报文封装

    OSPF报文是封装在IP头部后面,协议号为 89 ,目标IP是 224.0.0.5

  • OSPF头部

    1. version: 表示的是 OSPF 协议的版本,默认是2。支持的IPv4;
    2. message type : 信息类型,表示的是 OSPF 的报文类型,此时是 hello
    3. source ospf router : 表示的是发送这个 ospf 报文的路由器的 router-id
    4. packet length:表示的是后面的这个 OSPF 报文的大小/长度
    5. area id : 表示的是该报文是从哪个区域发送出来的
    6. packet checksum :表示的报文的校验和,用于检测报文在传输过程中是否出错
    7. auth type:表示的是认证类型,也就是常说的加密类型,一般都是明文或者密文,默认情况下,OSPF的认证类型是 Null(空,也就是没认证)
    8. auth data : 表示的是加密的密码
  • OSPF hello

    1. network mask : 表示的是发送这个Hello报文的出接口的掩码
    2. hello interval : 表示的是该端口发送hello报文的周期,默认是 10s
    3. options:可选项,也通常被称之为“特殊标记位”,用来表示一个路由器的能力
    4. router priority : 路由优先级,默认是 1
    5. router dead interval : 表示的是(邻居)路由器的死亡时间,默认是 40s
    6. designated router : 指定路由器,俗称 DR
    7. back designated router : 备份的指定路由器,俗称 BDR
    8. active neighbor : 活动邻居,通常称之为 neighbor-list → 邻居列表。表示的是自己认可、承认的邻居设备的 router-id

OSPF邻居建立影响因素

  • 确保设备之间的IP地址互通

    建立邻居的设备,必须是同一个网段的;

    两个接口的IP地址,必须能够互相 ping 通

  • 确保设备可以发送 hello 报文

    1. 接口必须通过 network 命令,正确宣告
    2. 确保接口不能够被配置为 OSPF 的静默接口
  • 确定设备之间发送报文的方式

    1. 要么都是组播
    2. 要么都是单播
  • 确保设备可以接收 hello报文

    1. 接口必须通过 network 命令,正确宣告
    2. 确保接口不能够被配置为 OSPF 的静默接口
    3. 该端口上如果配置了策略(ACL),不能拒绝 OSPF 报文
  • 确保设备可以比较 hello 报文

    1. router-id 不能相同
    2. area-id 必须相同
    3. 认证类型必须相同
    4. 认证密码必须相同
    5. 掩码必须相同**(特殊情况下)**
    6. hello 计时器必须相同
    7. 特殊标记位,必须相同
    8. 端口优先级,不能全为0**(特殊情况下)**
    9. dead计时器必须相同

    注意:特殊情况下,指的是“一个网段中需要 DR的情况”

OSPF邻居状态详解

  • init

    初始化状态。

    当收到了对方设备发送过来的hello报文,并且参数协商成功。此时就会将该设备的router-id 放入到自己的邻居表中,状态设置为 init

    如果邻居卡在了该状态,说明:设备之间存在单向链路故障

  • attempt

    尝试状态

    该状态呢,仅仅出现在NBMA 网络环境下,两边通过单播建立邻居的时候。

    每一个peer命令配置最后,都可以在邻居表中看到一个 处于 attempt 状态的邻居。

  • two-way

    双向通信状态。

    当在对方发送过来的 hello 报文中的,发现自己的 router-id (active neighbor),此时邻居的状态就会立刻从init 过渡到 two-way 状态。

    如果该网段中,同时存在多个 OSPF 路由器,那么就要在该状态(two-way)状态,进行DR/BDR的选举。

    但是,这个选举过程中,通常会在该状态持续 40s 的时间,目的就是为了在这个时间内尽量的收集更多的同网段设备发送的 ospf hello报文,这样一来呢,竞选出来的 dr/bdr 更加的客观。

    但是如此一来,就会导致 OSPF 邻居建立的时间就会变长

    如果邻居卡在了该状态,说明:设备之间想选DR,但是死活选不出来。因为优先级全0

  • exstart

    交换初始化状态(exchange start)

    该状态下,两边互相交换的是第一个 DD 报文,但是此时该 DD报文中,啥简要信息都没包含。因为此时发送第一个 DD 报文的主要目的是,是为了确定两个设备之间的主从关系,为了实现后续的 DD 报文的可靠传输。一旦邻居设备之间的主从关系确定以后:从设备发送的DD报文的序列号,一定要和主设备发送的DD报文的序列号一致。

    主设备和从设备的竞选原则:

       仅仅比较设备之间的 router-id ,越大越好。
    
      并且,在该状态下,有的时候,设备之间是需要检查 DD 报文中的 MTU 字段的。
    
      如果两边的 MTU 取值不同,则邻居状态就会卡在 exstart,不会继续下去了。
    
      但是,在华为设备上,默认情况下,关闭了“MTU检查机制”。
    
      但是,在思科设备上,默认是开启了“DD报文中的MTU检查机制的”。
    
      如果邻居卡在了该状态,说明:两边的MTU取值不相同
    
  • exchange

    交换状态

    该状态下,设备之间交换的就是大量的 DD 报文了。该报文中包含的是每个OSPF路由器的数据库中的 LSA 条目的简要信息。当两边的数据库题目的简要信息全都发送完毕了,就开始对比两边的数据库之间的差异了。知道了两边的数据库的不同之后,邻居设备之间就开始向对方请求自己没有的那些数据库条目信息 — LSA 。

    在上述的 DD报文中,我们可以明确的区分出 DD 报文是由主设备发送的,还是从设备发送的,可以明确的判断出当前两边的 DD 报文是否传输完毕了。因为在DD报文中

    包含了下面的3个重要的字段信息:

    • master/slave : 该字段如果取值1,说明是master(主设备);如果取值0,则是从设备

    • more:该字段表示后面还有更多的 dd 报文;如果取值1,说明后续还有;如果取值0,

      则说明后续没有更多DD报文,即当前这个DD报文是最后1个DD报文

    • init:该字段表示是不是第一个DD报文;如果取值1,说明是第一个DD报文;如果

      取值0,则说明不是第一个DD报文

  • loading

    加载状态

    该状态下,就是通过不断的发送 LSR 报文和 LSU 报文,实现两边的数据库同步。并且整个过程中,应该确保是安全和稳定的,所以每次发送 LSR 和LSU ,都会伴随着 LSAck的发送。

  • Full

    完全邻接状态

    该状态下,两边的数据库条目(LSA)就完全一致了。

  • down

    挂掉了

    该状态下,表示没有在规定的 dead 时间内,收到对方的任何的 ospf 报文

  • 关于LSA的讨论

    1. 区域56中,有没有4类LSA?没有
    2. R2上,有几个4类LSA?2个
    3. 区域19的R9上,有没有R6产生的5类LSA?
    4. 区域19的R9上,有没有R6产生的5类LSA表示的路由?没有的
    5. 区域12的R1上,关于 192.168.56.0/24 这个路由是通过几类LSA表示的? 3类
    6. 在R1上有几个关于 192.168.56.0/24 的3类LSA ? 2个
    7. 在R12上有几个关于 192.168.56.0/24 的3类LSA ? 3个 0区域中R5发送的、12区域自己发送的、12区域另外一个ABR-R2发送的1个