OSPF协议OSPF(OpenShortestPathFirst开放式最短路径优先)[1]是一个内部网关协议(InteriorGatewayProtocol,简称IGP),用于在单一自治系统(autonomoussystem,AS)内决策路由。与RIP相比,OSPF是链路状态路由协议,而RIP是距离矢量路由协议。OSPF的协议管理距离(AD)是110。一、OSPF起源IETF为了满足建造越来越大基于IP网络的需要,形成了一个工作组,专门用于开发开放式的、链路状态路由协议,以便用在大型、异构的IP网络中。新的路由协议已经取得一些成功的一系列私人的、和生产商相关的、最短路径优先(SPF)路由协议为基础,在市场上广泛使用。包括OSPF在内,所有的SPF路由协议基于一个数学算法—Dijkstra算法。这个算法能使路由选择基于链路-状态,而不是距离向量。OSPF由IETF在20世纪80年代末期开发,OSPF是SPF类路由协议中的开放式版本。最初的OSPF规范体现在RFC1131中。这个第1版(OSPF版本1)很快被进行了重大改进的版本所代替,这个新版本体现在RFC1247文档中。RFC1247OSPF称为OSPF版本2是为了明确指出其在稳定性和功能性方面的实质性改进。这个OSPF版本有许多更新文档,每一个更新都是对开放标准的精心改进。接下来的一些规范出现在RFC1583、2178和2328中。OSPF版本2的最新版体现在RFC2328中。最新版只会和由RFC2138、1583和1247所规范的版本进行互操作。链路是路由器接口的另一种说法,因此OSPF也称为接口状态路由协议。OSPF通过路由器之间通告网络接口的状态来建立链路状态数据库,生成最短路径树,每个OSPF路由器使用这些最短路径构造路由表。OSPF路由协议是一种典型的链路状态(Link-state)的路由协议,一般用于同一个路由域内。在这里,路由域是指一个自治系统(AutonomousSystem),即AS,它是指一组通过统一的路由政策或路由协议互相交换路由信息的网络。在这个AS中,所有的OSPF路由器都维护一个相同的描述这个AS结构的数据库,该数据库中存放的是路由域中相应链路的状态信息,OSPF路由器正是通过这个数据库计算出其OSPF路由表的。作为一种链路状态的路由协议,OSPF将链路状态广播数据LSA(LinkStateAdvertisement)传送给在某一区域内的所有路由器,这一点与距离矢量路由协议不同。运行距离矢量路由协议的路由器是将部分或全部的路由表传递给与其相邻的路由器。二、OSPF的hello协议1.Hello协议的目的:1.用于发现邻居2.在成为邻居之前,必须对Hello包里的一些参数进行协商3.Hello包在邻居之间扮演着keepalive的角色4.允许邻居之间的双向通信5.用于在NBMA(NonbroadcastMulti-access)网络上选举DR和BDR2.HelloPacket包含以下信息:1.源路由器的RID2.源路由器的AreaID3.源路由器接口的掩码4.源路由器接口的认证类型和认证信息5.源路由器接口的Hello包发送的时间间隔6.源路由器接口的无效时间间隔7.优先级8.DR/BDR接口IP地址9.五个标记位(flagbit)10.源路由器的所有邻居的RID三、OSPF的网络类型OSPF定义的5种网络类型:1.点到点网络(point-to-point),由cisco提出的网络类型,自动发现邻居,不选举DR/BDR,hello时间10s。2.广播型网络(broadcast),由cisco提出的网络类型,自动发现邻居,选举DR/BDR,hello时间10s。3.非广播型(NBMA)网络(non-broadcast),由RFC提出的网络类型,手工配置邻居,选举DR/BDR,hello时间30s。4.点到多点网络(point-to-multipoint),由RFC提出,自动发现邻居,不选举DR/BDR,hello时间30s。5.点到多点非广播,由cisco提出的网络类型,自动发现邻居,选举DR/BDR,hello时间10s。1.1.点到点网络,比如T1线路,是连接单独的一对路由器的网络,点到点网络上的有效邻居总是可以形成邻接关系的,在这种网络上,OSPF包的目标地址使用的是224.0.0.5,这个组播地址称为AllSPFRouters.2.1.广播型网络,比如以太网,TokenRing和FDDI,这样的网络上会选举一个DR和BDR,DR/BDR的发送的OSPF包的目标地址为224.0.0.5,运载这些OSPF包的帧的目标MAC地址为0100.5E00.0005;而除了DR/BDR以外发送的OSPF包的目标地址为224.0.0.6,这个地址叫AllDRouters.3.1.NBMA网络,比如X.25,FrameRelay,和ATM,不具备广播的能力,因此邻居要人工来指定,在这样的网络上要选举DR和BDR,OSPF包采用unicast的方式4.1.点到多点网络是NBMA网络的一个特殊配置,可以看成是点到点链路的集合.在这样的网络上不选举DR和BDR.5.1.虚链接:OSPF包是以unicast的方式发送所有的网络也可以归纳成2种网络类型:1.传输网络(TransitNetwork)2.末梢网络(StubNetwork)四、OSPF的DR及BDR在DR和BDR出现之前,每一台路由器和他的所有邻居成为完全网状的OSPF邻接关系,这样5台路由器之间将需要形成10个邻接关系,同时将产生25条LSA.而且在多址网络中,还存在自己发出的LSA从邻居的邻居发回来,导致网络上产生很多LSA的拷贝,所以基于这种考虑,产生了DR和BDR.DR将完成如下工作1.描述这个多址网络和该网络上剩下的其他相关路由器.2.管理这个多址网络上的flooding过程.3.同时为了冗余性,还会选取一个BDR,作为双备份之用.DRBDR选取规则:DRBDR选取是以接口状态机的方式触发的.1.路由器的每个多路访问(multi-access)接口都有个路由器优先级(RouterPriority),8位长的一个整数,范围是0到255,Cisco路由器默认的优先级是1优先级为0的话将不能选举为DR/BDR.优先级可以通过命令ipospfpriority进行修改.2.Hello包里包含了优先级的字段,还包括了可能成为DR/BDR的相关接口的IP地址.3.当接口在多路访问网络上初次启动的时候,它把DR/BDR地址设置为0.0.0.0,同时设置等待计时器(waittimer)的值等于路由器无效间隔(RouterDeadInterval).DRBDR选取过程:1.路由器X在和邻居建立双向(2-Way)通信之后,检查邻居的Hello包中Priority,DR和BDR字段,列出所有可以参与DR/BDR选举的邻居(priority不为0).2.如果有一台或多台这样的路由器宣告自己为BDR(也就是说,在其Hello包中将自己列为BDR,而不是DR),选择其中拥有最高路由器优先级的成为BDR;如果相同,选择拥有最大路由器标识的。如果没有路由器宣告自己为BDR,选择列表中路由器拥有最高优先级的成为BDR,(同样排除宣告自己为DR的路由器),如果相同,再根据路由器标识。3.按如下计算网络上的DR。如果有一台或多台路由器宣告自己为DR(也就是说,在其Hello包中将自己列为DR),选择其中拥有最高路由器优先级的成为DR;如果相同,选择拥有最大路由器标识的。如果没有路由器宣告自己为DR,将新选举出的BDR设定为DR。4.如果路由器X新近成为DR或BDR,或者不再成为DR或BDR,重复步骤2和3,然后结束选举。这样做是为了确保路由器不会同时宣告自己为DR和BDR。5.要注意的是,当网络中已经选举了DR/BDR后,又出现了1台新的优先级更高的路由器,DR/BDR是不会重新选举的。6.DR/BDR选举完成后,DRother只和DR/BDR形成邻接关系.所有的路由器将组播Hello包到AllSPFRouters地址224.0.0.5以便它们能跟踪其他邻居的信息,即DR将泛洪updatepacket到224.0.0.5;DRother只组播updatepacket到AllDRouter地址224.0.0.6,只有DR/BDR监听这个地址.简洁的说:DR的筛选过程1.优先级为0的不参与选举;2.优先级高的路由器为DR;3.优先级相同时,以routerID大为DR;routerID以回环接口中最大ip为准;若无回环接口,以真实接口最大ip为准。4.缺省条件下,优先级为1。五、OSPF邻居关系邻接关系建立的4个阶段:1.邻居发现阶段2.双向通信阶段:Hello报文都列出了对方的RID,则BC完成.3.数据库同步阶段:主从协商;DD交换;LSA请求;LSA传播;LSA应答。4.完全邻接阶段:fulladjacency邻居关系的建立和维持都是靠Hello包完成的,在一般的网络类型中,Hello包周期性的以HelloInterval秒发送,有1个例外:在NBMA网络中,路由器每经过一个PollInterval周期发送Hello包给状态为down的邻居(其他类型的网络是不会把Hello包发送给状态为down的路由器的).Cisco路由器上PollInterval默认60sHelloPacket以组播的方式发送给224.0.0.5,在NBMA类型,点到多点和虚链路类型网络,以单播发送给邻居路由器。邻居可以通过手工配置或者Inverse-ARP发现.OSPF路由器在完全邻接之前,所经过的几个状态:1.Down:此状态还没有与其他路由器交换信息。首先从其ospf接口向外发送hello分组,还并不知道DR(若为广播网络)和任何其他路由器。发送hello分组使用组播地址224.0.0.5。2.Attempt:只适于NBMA网络,在NBMA网络中邻居是手动指定的,在该状态下,路由器将使用HelloInterval取代PollInterval来发送Hello包.3.Init:表明在DeadInterval里收到了Hello包,但是2-Way通信仍然没有建立起来.4.two-way:双向会话建立,而RID彼此出现在对方的邻居列表中。(若为广播网络:例如:以太网。在这个时候应该选举DR,BDR。)5.ExStart:信息交换初始状态,在这个状态下,本地路由器和邻居将建立Master/Slave关系,并确定DDSequenceNumber,路由器ID大的的成为Master.6.Exchange:信息交换状态,本地路由器和邻居交换一个或多个DBD分组(也叫DDP)。DBD包含有关LSDB中LSA条目的摘要信息)。7.Loading:信息加载状态:收到DBD后,将收到的信息同LSDB中的信息进行比较。如果DBD中有更新的链路状态条目,则向对方发送一个LSR,用于请求新的LSA。8.Full:完全邻接状态,邻接间的链路状态数据库同步完成,通过邻居链路状态请求列表为空且邻居状态为Loading判断。六、OSPF泛洪Flooding采用2种报文LSUType4---链路状态更新报文LSAType5---链路状态确认报文(补充下){HelloType1---Hello协议报文DD(DataDescription)Type2----链路数据描述报文LSRType3----链路状态请求报文}在P-P网络,路由器是以组播方式将更新报文发送到组播地址224.0.0.5.在P-MP和虚链路网络,路由器以单播方式将更新报文发送至邻接邻居的接口地址.在广播型网络,DRother路由器只能和DR&BDR形成邻接关系,所以更新报文将发送到224.0.0.6,相应的DR以224.0.0.5泛洪LSA并且BDR只接收LSA,不会确认和泛洪这些更新,除非DR失效在NBMA型网络,LSA以单播方式发送到DR和BDR,并且DR以单播方式发送这些更新.LSA通过LS类型、LS标识和宣告路由器来识