四、ospf


(一)OSPF的基本特征

   1、每隔30分钟定时发送更新,支持层次化的网络结构。
   2、在网络发生变化时自动触发更新
   3、支持VLSM
   4、只有受影响的路由更新报文才会被发送给邻居路由器,而不是整个路由表
   5、OSPF用带宽作为路径选择的决定因素,而不是像RIP和EIGRP一样用跳距离。
   6、收敛快

(二)ospf生成路由选择表的过程(工作原理):

   1、双方发送hello报文,建立邻接关系。
   2、链路状态发生改变,路由器检测到变化
   3、发送LSA。路由器生成一个针对该变化链路的状态通告(LSA),并使用多播地址将LSA传播给所有邻居路由器
   4、洪泛LSA。每台邻居路由器都将收到LSA,并用此LSA更新本路由器的链路状态数据库(LSDB)。并继续将LSA转发给邻接设备,确保所有路由器都收到LSA,并用它更新自已的LSDB。
   5、区域中所有路由器拥有相同的LSDB。
   6、所有路由器更新了LSDB后用dijkstra算法(也叫SPF算法)重新依据更新后的LSDB数据库计算最短路径树,进而选择到目的地的最佳路径,然后加入到路由选择表中。

  
 (三)OSPF路由器维护的三个表:

         邻接关系数据库:每个OSPF路由器都有一个邻居表,存储邻居路由器的信息。失去与邻居的联系后,路由器将该邻居提供的所有路径作废,并重新计算路径,然后加入到路由选择表中。
         LSDB:区域内的所有路由器拥有相同的链路状态数据库。
         路由选表:通过SPF算法算出的到目的地的最佳路径,然后加入到路由选择表

 

 (四)OSPF的报文类型

     1、hello报文
  
      用于发现邻居并与邻居建立邻接关系。
      ospf用hello分组来确保邻居间双向通信和维护邻接关系。路由器从邻居路由器那里收到的hello分组中看到自已后,便进入双向通信。
      ospf路由器用多播地址:224.0.0.5来定期发送hello分组。

      hello报文包含以下信息:

      (1)路由器id:路由器ID是一个惟一的IP地址。  优先级为: Router-id  >环回接口>物理接口地址   
                   
                   定义环回接口IP地址,则以环回接口IP作为路由器ID,多个环回接IP时,选最大的为路由器ID。配置环回接口以后,OSPF更稳定,因为它不同于物理接口中,它总处于活动状态。不会出现故障。
                   没有定义环回接口时,物理接口的最大IP地址作为路由器的ID。路由器上必须最少有一个IP接口处于活跃状态。
                   用router-id命令来手工设置路由器ID。这种方式设置将优于以上的两种方式。
                 
                     
                  
                                               
      
       (2)hello间隔和失效间隔:广播网络中,OSPF的HELL0报文计时器每隔10秒发送一次,保持时间40秒,即如果在40秒内没收到hello,则认为邻居不存在。在非广播网络中,每隔30秒发送一次,保持时间120秒

      (3)邻居:邻居字段中包含已建立双向通信关系的邻接路由器。
      
      (4)区域ID:两台路由器必位于同一个网段中,且它们的接口必须属于一个OSPF区域才能互相通信。
     
      (5)
 
      (6)

      (7)

      
   2、DBD:数据库描述报文,在发送前要先协商主从关系(master/slave),由主方发送自己建立的链路状态数据库的格式和序列号。

   3、LSR:向邻居发送OSPF的链路状态的请求

   4、LSU:向请求的邻居发送关于链路状态的更新

   5、LSACK:确认收到的链路状态更新



(五)OSPF邻接关系状态及交换过程:

     1、DOWN状态。路由器启动后处于DOWN状态。没有接收邻居的验证和发现,没有与其他路由器交换信息
     2、init:接口初始化状态,发送和接收hello报文,但双向会话还没建立。
     3、Two-way:邻居双方通过HELLO报文,建立了双向会话。
     4、exchangestart:交换LSA的初始阶段。本地路由器和邻居建立MASTE/SLAVE关系。并确定Sequence number,ROUTER-ID高的的成为MASTER.
     5、exchange:信息交换状态。交换链路状态报文(LSA报文)。本地路由器向外邻居发送LSA包,并发送LSR请求数据,请求新的LSA.
     6、loading:装载由邻居泛洪的LSA,形成完整的链路状态数据库。
     7、full:邻居双方进入稳定的邻接关系状态,即全邻接。


OSPf的交换过程:

OSPF区域中的路由器A启动后处理DOWN状态,没有与其他路由器交换信息。
A路由器用多播地址发送HELLO报文,所有与其直连的OSPF路由器都将收到A路由器发的HELLO报文。收到HELLO报文的路由器将路由器A加入到邻居关系数据库,并向路由器A发一个单播应答报文。A路由器收到应答报文后,将其中的路由器ID对应的路由器都加入到邻居数据库中,此时双方建立了双向通信。
如果链路类型为广播网络,则需要再选举出DR和BDR。选举出DR后,DR与LAN链路上的其他路由器都建立双向邻接关系。
建立双向会话后,本地路由器和邻居确定 Sequence number,并确定MASTER。然后开始传送LSA报文,并发送LSR请求LSA更新报文。邻居收到LSA后更新自已的LSDB,并洪泛LSA给区域内的其他路由器,最后全区域内路由器形成统一的LSDB数据库。邻居双方进入稳定状态。

OSPF链路状态序列号:

  链路状态记录中的序列号字段长32位。其中最左边的一位被置为1。因此第一个合法的序号为0x80000001。序列号用于检测旧的LSA记录,序号越大,LSA越新。
  为确保数据库的准确性,OSPF每隔30分钟对每条LSA记录刷新一次,每刷新一次序列号加1. 收到新的LSA后,LSA将重置计时器,又重新计算时间。如果一小时内,未被刷新,LSA将从数据库中删除。
有时序列号需要循环回最初的值,在这种情况下,LSA提前作废,(最大寿命定时器立即被设置 为1 )并被删除。然后,LSA重新使用序列号0X800001.



(四)OSPF的网络类型

    1、 广播多路访问型(Broadcast multiAccess):   广播网内会选举一个DR和BDR。DR/BDR采用组播224.0.0.5进行报文传输。而除DR/BDR外的OSPF包采用组播地址224.0.0.6进行报文传输。如:Ethernet、Token Ring、FDDI。

    2、 非广播多路访问型(None Broadcast multiAccess,简称:NBMA):不具备广播的能力,邻居要人工指定。这样的网络上也要选举DR和BDR。ospf包采用unicast方式传播,即单播方式。如:Frame Reley、X.25、SMDS。

    3、 点到点型(Point to Point)。点到点网络上的有效邻居总是可以形成邻接关系的。如:专线T1线路配置PPP,HDLC协议的串行线路。采用目标地址为224.0.0.5多播地址将所有hello分组发对端ospf路由器。不选举DR。

    4、 点到多点型(Point to MultiPoint):其实是NBMA的一个特例。可以看成是点到点链路的集合。

DR与BDR:

   网段内优先级最高的路由器作为DR,次优先级的为BDR
   接口优先级默认为1,优先级相同时,路由器ID最大的路由器作为DR,次大的为BDR。
   优先级为0的路由器不能成为DR和BDR
   优先级更高的路由器新加入到网络时,并不会抢占DR与BDR。仅当DR和BDR出故障时才重新先DR与BDR
   DR出故障时,BDR升级为DR,并选举新的BDR。
   广播网和NBMA网中必须选举DR和BDR。其他常规路由器必须与DR和BDR建立邻接关系。网段上的路由器只将链路状态信息发给DR和BDR,而不是与所有其他路由器交换链路状态信息。DR收到常规路由器发送过来的链路状态信息后,将其转发给网段内的其他所有与其有邻接关系的常规路由器。


(五)OSPF的区域


      链路状态路由选择协议通常将网络划分成区域以减少SPF算法的计算量。如果区域内的路由器少,LSA数量会少,区域内的LSDB数据库也会小,SPF算法的计算就小。需要的时间就短。
      OSPF区域内的路由器保存该区域中的所有链路和路由信息,但只保存有关其他区域中路由和链路的摘要信息
      路由器或链路出现故障时,相应的信息只被扩散到当前区域中的路由器。区域外的路由器不会收到这种信息。
      所有区域都必须直接与区域0(骨干区域)相连,不同常规区域的路由器不互连。区域间的数据传输必须经过骨干区域0.
      每个区域的路由器控制好数量,以这种层次方法布署OSPF,自治系统可以扩展到很大。


OSPF包含两层区域:

    1、骨干区域(也叫中转区域):区域号为0。 骨干区域将其他类型的OSPF区域连接起来。

      (1)骨干区域必须是连续的。并要求其他区域必须与骨干区域相加连。当一个区域的路由信息对外传播时,必须先传到骨干区域,再由骨干区域转播。通常骨干区域中没有终端用户。

       (2)当一个区域没有与骨干区域相连时,需要虚拟链路与骨干区域建立逻辑链路点。该虚拟链路必须建立在两个区域边界路由器之间。并且其中一个必须属于骨干区域

      (3)当骨干区域不连续时,可用虚拟链路把两个不相连的骨干区域连接。虚拟链路的两端必须是两个不相连的骨干区域的边界路由器。并且这两个路由器还必须属于同一个区域的端口。


2、常规区域

   主要用于连接用户和资源的OSPF区域。常规区域通常是根据职能和地理位置划分的。常规区域不允许另一个区域使用其连接将数据流传输到其他区域。来自其他区域的所有数据流都必须经过骨干区域转发。
   常规区域又分为:末节区域,绝绝末节区域,NSSA区域

     (1)末节区域(STUB):也叫残域:末节区域不接受来自AS外部的路由信息。只接受AS(自主系统)内部的路由信息。当要访问外部AS时,路由器使用默认路由。末节区域中不能包含ASBR。
                    缩小区域中的LSDB;LSA5数据无法传进末节区域;末节区域使用默认路由到达AS外部网络。如路由表中没有目标外部网络的路由信息,则将分组转给通告默认路由的ABR路由器,再由ABR转发。
                    末节区域中的所有路由器都必须配置末节区域命令才能使区域成为末节区域。

 
     (2)绝对末节区域:(stub no-summary):是CISCO特有的功能。不接受来自区域外的路由信息,更不接受来自自主系统外的路由信息。即LSA 3,4,5 数据包无法传进绝对末节区域。
                         绝对末节区域不能包含ABSR;绝对末节区域内的路由器使用默认路由把数据包发往区域外;每台路由器都将区域内最近的ABR作为前往区域外的网关。每台路由器都必须配为绝对末节路由器才能成为绝对末节区域。

     
     (3)NSSA(非完全末绝区域):是对OSPF RFC的补充。这种区域定义了一种特殊的LSA: LSA7。 NSSA具有末节区域和绝对末节区域的优点。但可以包含ASBR。
                               NSSA区域的ABSR路由器收到自主系统外的路由信息时,即把收到的路由信息创建成LSA7类数据包,传往整个NSSA区域内。再由NSSA区域的ABR路由器把这些LSA7类路由数据转换成LSA5类数据包,传到骨干区域中。
            

(六)OSPF的路由器类型

1、内部路由器:所有接口都位于同一个区域中的路由器。同一区域中所有内部路由器的LSDB都相同。

2、骨干路由器:至少有一个接口与区域0相连。位于主干区域边界的路由器和主干区域内的路由器都是主干路由器

3、区域边界路由器(ABR):连接多个区域的路由器。为其连接的每个区域都维护一个LSDB。将常规区域连接到骨干区域。分隔LSA扩散,是区域汇总的主要地方。常作为区域的默认路由。建议一个ABR只连接两个区域,即主干和常规区域。最多不要超过三个。一个区域也可以有多个ABR路由器。

4、自主系统边界路由器:(ASBR)至少有一个接口与外部网络(即另一个自主系统,而不是另一个OSPF区域)相连,主要用于与自治系统外部交换路由信息。

   同一台路由器可以属于多种类型。


(七)OSPF数据包的种类

1、 1类:LSA1:路由器链路信息数据包:每台路由器都会产生router LSA,描述了本路由器直连的链路和接口的状态和开销。只在本区域内传播。  show ip ospf database router命令查看。

2、 2类:LSA2:网络链路信息数据包:由DR和BDR产生。用来描述该网段内所有与DR相连的路由器的状态信息。只在包含此DR的区域内扩散广播。LSA 2 的链路状态ID为DR的IP接口地址。show ip ospf database network命令查看。

3、 3类:LSA3:汇总LSA。也叫总结链路信息数据包:由ABR区域边界路由器产生。ABR完成它所属区域内的路由计算后,生成本区域的网络路由信息。并将本区域内的每一条OSPF路由封装成LSA 3发送到区域外。即把本区域的网络路由信息通告给同一自治系统内的其他区域。默认OSPF不进行自动汇总,必须手工汇总。

4、 4类:LSA4:ASBR summary LSA:同样由ABR生成。即描述了到达和ABR一个区域的ASBR路由器的路由。即怎么到达本区域的自主系统边界路由器。目标地址就是ASBR路由器的地址。

5、 5类:LSA5:外部链路状态数据包:由ASBR生成。被传播到整个自治系统内。描述了前往自治系统外的网络的路由信息。即把目的地为自治系统外的路由信息传到自治系统内来。

6、 6类: LSA6:用于OSPF多播应用中

7、 7类:LSA7:用于NSSA中:来自非完全STUB区域(NSSA)内ASBR路由器始发的LSA通告。即NSSA区域内包含的ASBR发出的LSA通告。它只在NSSA区域内传播,而不是整个自治系统。这是与LSA 5的区别。

8、 8类:LSA8:用于互联OSPF的BGP中。

9、 9、10、11类: 这些用于升级到OSPF中。


(八)路由表及路由标记

    1、所有路由器都计算前往本区域中的每个目标的最佳路径,并将计算出最短路径加入到路由选择表,这是LSA1和LSA2
    2、所有路由器都计算出前往自治系统内其他区域的最佳路径,这些路径是区域间路由。由ABR通告LSA3和LSA4。
    3、除末节路由器外,所有路由器都计算前往外部AS系统中目标网络的最佳路径。用LSA5通告。

 路由标记

    O             区域内路由
    O  IA         区域间路由
    ON1 ON2       NSSA区域通告的LSA7类路由
    O E1 O E2     都是外部路由。E1表示外部成本+内部成本; E2表示只用外部成本,不包含在本AS中传输的成本。
                  E2是默认的。用在单ASBR将外部路由通告到AS中
                  E1:用在多台ASBR将同一条外部路由通告到同一个AS中时,以避免次优路由选择。

根据: O  >O IA >O E1 >O E2的优先级顺序转发

如果此时还存在等COST,则作负载均衡转发。默认是4条路径负载均衡。maximum paths 6可以把路径改成最多的6条负载均衡路径。
(九)配置


1、基本配置:

(config)#router ospf 进程号                                         //指定使用OSPF协议,进程号范置 1-65535。同一区域内的进程号可以一样也可以不一样。进程号在是一个路由器启用的一个进程,只在本路由器有效。

(config-router)#network {ip_address} {widcard-mask}  area  {区域号}  //指定路由器上的哪些接口参与OSPF进程,并指出该网络的OSPF区域号。

      //widcard-mask:指的是反掩码。 1 和 0 反转的子网掩码,即用255.255.255.255减去原掩码得出反掩码,又称为通配符,0位 表示必须匹配,1位表示不必匹配。

(config-router)#router-id {ip_address}           //手工指定router-id

(config)#clear ip ospf process                 //重启进程。如果router-id已经产生,要用此命令清除,且必须重启OSPF进程才生效。

(config-router)#passive-interface {interface}    //停止向外发送和接收hello消息,即中断邻接关系。
(config-router)#passive-nterface default       //所有接口都停止发送和接收hello消息。
(config-router)#no passive-nterface {interface}   //打开被关掉的被动接口。当需要关掉的被动接口较多时,就可以先用上一条命令关掉所有的接口然后再打开少数几个不需关掉的被动接口。

2、设置接口优先级

(config)#interface fast0/1

(config-if)#ip ospf priority 优先级               //设置接口优先级,优先级高的是DR。

3、设置接口的成本

   (config-if)#badwidth {value}      //更改接口的带带。默认ospf是用带宽来计算接口的ospf度量值。一般为:cost=100M/带宽
   (config-ruter)#auto-cost reference-bandwidth  {ref-bw}    //对于大于等于100M的接口,cost的默认值都为1,此命令指定接口的速率,取值范围: 1--4294967,以M(兆)为单位。
   (config-if)#ip ospf cost {value}  //设置接口的成本,成本越低,链路越好。    

4、NBMA(非广播多路访问)的配置
   
     当网络不是以太网之类的广播网,是如帧中继\x.25\ATM网络类型时,则需要配置为非广播多路访问。

    当需要设定为NBMA类型时,需要用命令手工指定,以下命令指定模式。

    CISCO把NBMA网络又分为:NBMA模式(标准模式);点到多点模式(标准模式); 广播模式(CISCO私有模式); 点到点模式(CISCO私有模式); 点到多点不广播模式(CISCO私有模式)。
   
    (config-if)#ip ospf network {broadcast|non-broadcast|point-to-mulitipoint|point-to-point|point-to-multipoint non-broadcast}  //配置NBMA网络模式
   
(1)NBMA模式(non-broadcast)
 
    注意一点:NBMA网络分为以上五种模式。其中包含一种模式为NBMA模式,参数为 non-broadcast,这是标准模式。所以不要把NBMA网络和NBMA模式搞混了。    
   
    NBMA采用部分互联拓扑方式时,需要手工指定DR和BDR,以确保DR与所有路由器互连,以实现邻接关系;需要在DR和BDR上配置neibhbor命令手工指定邻居
    NBMA采用全互联拓扑方式时,除非用优先级静态的配置DR和BDR,则需要在所有路由器上配置neighbor命令。

  (config-if)#ip ospf network non-broadcast      //选择NBMA网络的模式为NBMA模式。
 (config-router)#neigbhbor {ip_address} [priority {number}]  [poll-interval {sec}] [cost {number}] database-filter all   //设置邻居

    priority:指定邻接路由器的优先级. 0意味着邻接路由器不能成为DR或BDR。
    cost:指定到邻居的成本。取值范围  1-65535。如此处未指定则以命令   ip ospf cost配置的接口成本为准
    poll-interval:指多长时间向邻居发hello信息
    database-filter all:滤掉前往ospf邻居的LSA.

 (2)点到多点模式
     点到多点模式下,OSPF将非广播网络中的所有路由器到路由器都视为点到点链路。
     不选举DR和BDR,不需要静态指定邻居,用OSPF多播HELLO发现邻居
     采用部分互联或星型拓扑结构。

   (config-if)# ip ospf network point-to-multipoint   

 
以上是标准的NAMA模式,cisco还有自定义的三种模式

  (3)广播模式
      
      不要静态列出邻居,用多播HELLO分组发现邻居,需选举DR
      需全互联拓扑结构,或手工指定DR

(4) 点到点模式

     不选举DR和BDR
     每条点对点连接就是一个子网
     通常只用于点到点接口

(5)点到多点非广播模式

     不选举DR和BDR
       是点到多点模式的一种扩展。当虚电路(VC)上没有启动多播和广播时,路由器无法用多播hello分组动态地发现邻居路由器路由器。在这种情况下就不能用点到多点模式。只能用这种点到多点非广播模式,手工指定邻居,无须选举DR。

(config-if)# ip ospf network point-to-multipoint  non-broadcast 

5、汇总

   路由汇总将多条路由汇总成一条路由通告。
   如不进行路由汇总,每条具链路的LSA都会传播到OSPF主干区中,导致不必要的开销。只有汇总后的路由传播到主干区。
   汇总的两种方式:

       (1)区域间路由汇总:在ABR上进行,针对每个区域内的路由,要实现有效的区域间路由汇总,区域内的网络号应该是连续的。

             (config-router)# area  {area-id}  rang {ipaddress} {mask} 
              
                  area-id:  是要汇总的路由区域
                  ipaddress和 mask:是汇总后的Ip和掩码

          
       (2)外部路由汇总:汇总自治系统以外的路由。即专门针至通过重分发被导入到ospf自治系统中的外部路由。在ASBR上进行。
            
             (config-router)# summary-address {ipaddress mask } | prefix mask} [not-advertise] [tag {tag}]
           
                ipaddress mask:汇总后的ip
                not-advertise:不通告与前缀-子网掩码 相匹配的路由
                tag:对汇总路由进行标记。作为重分发时的match值,即可对某些tag值的汇总路由进行重分发。

6、默认路由

  把默认路由通告给常规区域:

     (config-router)# default-information originate [always] [metric {metric-value}] [metric-type {type-value}] [route-map {map-name}]

      metric:缺省为1。 如果区域中有多条默认路由,则可以更改Metric,选择较佳默认路由
      metric-type:通告路由的类型。缺省成本为2,即E2类型的路由,可设置为E1类型。
      route-map:     

     当发出默认路由通告的路由器已经有一条默认路由时:

       (config-router)# default-information originate     //把默认路由通告给常规区域
 
    发出默认路由通告的路由器不管是否有默认路由时:

     (config-router)# default-information originate always   //把默认路由通告给常规区域

   末节区域和绝对末节区域,无区配置,ABR路由器会自动生成一个默认路由传给末节和绝对末节区域内。
   NSSA区域:默认情况下,与之相连的ABR不会产生默认路由。要强制ABR生成默认路由需用以下命令:

        (config-router)# area {area-id}  nssa default-information-orginate   

  
7、末节区域

    末节区域不接受来自AS外部的路由信息。

     (config-router)# area {area-id} stub    //注意,每个stub区域内的路由器都必须配置此命令才行。

8、绝对末节区域

     是CISCO特有的功能。
    (cofig-router)# area  {area-id} stub [no-summary]   //只需要在绝对末节区域的ABR路由器上才使用 no-summary关键字,其他路由器只需用 stub即可。
    (config-router)# area  {area-id} default-cost {cost}    //配置ABR通告绝对末节区域中的其他路由器的默认路由的成本,默认值为1。只在绝对末节区域的ABR上配置。

9、NSSA

  (config-router)#area {area-id}  nssa    //把区域声明成NSSA区域,NSSA区域中的所有路由器都必须配置
  (config-router)#area {area-id} nssa default-information  originte  //配置NSSA默认路由。只在ABR路由器上配置
  (config-router)# area {area-id} nassa no-summary   //不把汇总路由信息传进NSSA区域。只在ABR上配置

10、虚链路

   OSPF虚链路的两种情况:

  (1)骨干区域(0区域)被分成几个不相连的部分时,即骨干区域不相连。链路出现故障可能产生这种情况

  (2)骨干区域与某常规区域不相连时。链路出现故障,或临时连接时可能产生这种情况
  (3)末节区域、绝对末节区域必须与骨干区域直连,不能配虚链路与骨干区域相连。并且其他常规区域也不能跨末节区域和绝对末节区域与骨干区域作虚链路连接。

骨干区域必须是一个整体;而常规区域必须与骨干区域相连

  配置:

   area {area-id}  virtual-link  {router-id} 

   area-id:经过的中转区域的ID号,即区域号
   router-id:对端远程路由器的ROUTER-ID号

11、配置hello时间和保持时间

在接口模式下:
(config)#interface 接口编号
(config-if)#ip ospf hello-interval 时间    //hello时间
(config-if)#ip ospf dead-interval 时间     //保持时间
两台路由器相连的接口都要修改,保持时间默认会是hello的时间4倍


11、OSPF验证

为了安全的原因,在相同OSPF区域的路由器上启用身份验证的功能,只有经过身份验证的同一区域的路由器才能互相通告路由信息。
OSPF的纯文本验证:
简单的纯文本验证允许一个区只配置一个密码(Password)同一个区中的路由器要想参与路由,他们必须配置相同的密码。这种方法的缺点是易受***。
使用下面的命令启动密码验证:
(config-if)#ip ospf authentication-key mypassword
(config-router)#area 0 authentication //”0”是area的ID


OSPF的MD5认证:
MD5(Message Digest Authentication)是采用加密验证,每个路由器上都必须配置密码和密码ID。路由器使用一种算法,基于OSPF报文、密码和密码ID产生一个 “Message Digest”,然后加到OSPF报文中。不像简单密码验证,MD5验证密码不在网络上传输。每个OSPF报文中还包含有一个序列号以保护网络不受***。
使用下面的命令来配置MD5验证:
(config-if)#ip ospf message-digest-key md5
(config-router)#area 0 authentication message-digest