1.为什么使用OSPF
RIP协议因为15跳的限制只能使用在网络半径比较小的网络中,而且RIP不能做到百分百的防环,而网络风暴是每个大型网络所必须解决的重要的问题。RIP是距离矢量型路由协议,周期性更新发送路由信息占用了较多的网络网络带宽。收敛速度慢等等,EIGRP虽然很优秀但却是cisco私有协议,需要完全使用cisco的设备才能正常运行,对于一般的企业都是没必要全部使用昂贵的cisco设备。所以需要另外一个能够在大型网络中使用的兼容性比较好的网络协议。 而OSPF是一个公有协议。也是和EIGRP一个等级的大型网络协议。满足了我们所需要的要求
2.简单运行原理概述
如图上,R0R1R2三个路由器是启用了ospf的路由器,并且都在Area 0中,这个网络为点到点的网络,(在多路访问网络中。OSPF在不同的二层网络中有不同的策略)。这个时候路由器都会向外发送hello数据包,路由器之间符合条件的会成为邻居(但注意这里还没有形成邻接关系,只有在交换了一些数据后才是邻接关系)。相互交换hello数据包之后,R0R1R2之间相互比较hello中的数据相互比较发现满足成为邻居的条件。就可以形成邻居。
成为邻居后,路由器们相互发送且同步LSDB.这个时候每个路由器都会建立LSDB(链路状态数据库)并且同步完了这个数据库大家都是一样的,LSDB就是相当于一个全网的拓扑地图,里面包含了很多信息。同时有很多冗余路径,这个时候路由器运行SPF算法,除去环路选择最佳路径。形成路由表放在路由器里面。
3.OSPF的三张表
从上面的基本运行过程可以看出OSPF在运行完以后是会形成三张表。这三张表形成有什么要求?有什么作用呢?如何形成呢?
3.1 邻居表
启用了OSPF的路由器都会向外发送自己的hello,接受别人的hello。而且只有下方hello数据包中红色部分为一样的才能建立邻居。通过hello发现建立维护邻居信息。邻居表用来存储邻居信息。
hello数据包格式
1.Router ID:路由器的RID |
2.HelloInterval :发送Hello报文的时间间隔。如果相邻两台路由器的Hello间隔时间不同,则不能建立邻居关系。一般是发送时间在局域网中是10s,广域网中是30s |
3.RouterDeadInterval:失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。如果相邻两台路由器的失效时间不同,则不能建立邻居关系。一般时间为hello时间的四倍。 |
4.Neighbor:我发现的邻居路由器的Router ID。 |
5.Area id:本路由器发送hello报文的这个接口的area id。 |
6.Rtr Pri:路由器优先级。如果设置为0,则该路由器接口不能成为DR/BDR。 |
7.Designated router:指定路由器的接口的IP地址。只有在MA(多路访问网络)中才会有这个信息。如果是点对点网络此部分信息为空 |
8.Backup designated router:备份指定路由器的接口的IP地址。只有在MA(多路访问网络)中才会有这个信息。如果是点对点网络,此部分为空。 |
9.认证密码 :如果启用了认证密码就会出现。 |
10.末节区域标识。 |
3.2 LSDB(链路状态数据库)
这个是路由器在成为邻居后,邻居之间相互发送LSA(链路状态信息,被包含在LSU中)来同步形成一个全网的拓扑信息。
3.2.1 什么是LSA呢?
LSA是存储链路状态信息的数据包。在思科中一共有6种。
3.2.2 在发送LSA的时候,可能在a时间时候,是LSA1,在a+1时间的时候,LSA更新了,变成了LSA2.路由器肯定是选择新的LSA来丰富自己的LSDB,那么又怎么区别LSA呢?
每个LSA上面都有一个序列号,从0x80000001开始到0x7FFFFFFF,并且从前者都后者是一个环形。0x7FFFFFFF下一个就是0x80000001。并且LSA有一个最大年龄为1H,1H后会老化,一般大型网络中LSA很少会发生变化。为了防止老化,LSA会在30min的时候会泛洪一次(对网络压力很大)。
当一个路由器接受到一个LSA后,首先判断这LSA我是不是有,如果没有直接加入。如果不需要就判断是不是和我LSDB里面一样,如果一样就直接放弃,如果不一样就和我自己的LSA相比较,哪个是新的,哪个是旧的。如果比我新,就加入我的数据库,如果比我的老,就放弃这个LSA并且把自己的LSA发送给发送这个LSA的路由器。(简化概述)
3.3 路由表
在LSDB的基础上运行SPF算法除去冗余路径并且选择路径开销最小的路而后形成的路由表。
4.RID的理解
在上面的OSPF基本运行原理的中可以发现。路由器需要在LSDB中运行SPF算法。比如说R0要去网络C时候需要经过路由器R1,R2。那么R1.R2是我们在外部标识的信息,在路由器内部是怎么标识这个路由器呢?这个就是需要用RID标识。
4.1 什么是RID呢?
RID是 route id。并且需要是在全网中唯一的一个号码。怎么才能唯一标识呢,我们可以使用路由器接口上的ip.因为ip地址是唯一的。
RID选择方法
1.优先使用手工指定的RID |
2.如果没有指定就使用环回接口中ip最高的IP |
3.环回接口也没有就是用物理地址中里面最高 |
即使作为RID的接口失效后,比如lo0上的ip是被用来表示RID。被down后,这个RID依然是lo0的ip,即使他已经被down了。
5.OSPF网络结构划分
5.1 一开始就标识了在Area 0中,为什么使用Area?
路由器数量的增多会导致LSDB非常庞大,占用大量的存储空间,并使得运行SPF算法的复杂度增加,导致CPU负担很重。并且LSA会定期泛洪,使用Area可以将泛洪限制在Area内。
在网络规模增大之后,拓扑结构发生变化的概率也增大,网络会经常处于“振荡”之中,造成网络中会有大量的OSPF协议报文在传递,降低了网络的带宽利用率。更为严重的是,即使一次小小的变化,都会导致网络中所有的路由器重新进行路由计算。
5.2 怎么划分网络结构
OSPF使用了Area这个概念,把网络在逻辑上分成不同的Area。Area分为两种类型(如下表格)。用编号标识,实际上是32位,但是一般简写为十进制,区域的定位基于接口,一个路由器可能是在Area0也有可能在Area1,但是一个网段(链路)只能属于一个区域。其中ABR为区域边界路由器。负责普通区域和骨干区域的联系。ABR需要存储其接口所在的所有区域的链路状态信息。比如图中的左上角的ABRS需要负责Area 1和Area 0的链路信息。
传输区域(骨干区域)Area 0:Area 0维护全网,不同Area之间通讯需要通过Area0 转发,必须且只有一个Area 0。 | |
普通区域 Area *(除0以外):普通区域的路由器只维护本区域的链路状态信息,普通Area可以没有。普通区域之间不能有邻接关系。 |
5.3 划分区域的好处
1.一个区域一般设计为连续的网络,这样可以在区域边界路由器上进行路由汇总,以减少通告到其他区域的LSA数量,将LSA泛洪控制(3.2.2有描述)在Area内。 |
2.将本地网络拓扑变动的影响控制在一个Area里面,将网络拓扑变化带来的影响最小化。 |
6.OSPF在不同的二层网络中的变化
6.1 MA网络中的意外
在BMA网和NBMA网络中(MA网络:不通过三层设备转发可以直接到达多台其他设备的网络,BMA例如为以太网,NBMA例如为帧中继网络),任意两台路由器之间都要交换路由信息。如果网络中有n台路由器,则需要建立n(n-1)/2个邻接关系。这使得任何一台路由器的路由变化都会导致多次传递,浪费了带宽资源。
而在点到点或点到多点的网络中,则没有这个问题。
6.2 如何解决这个问题?
OSPF选举DR(Designated Router).BDR(backup designated Router)来避免大量的建立邻居。
在MA网络中,选举出DR,BDR,剩下的路由器成为DR other,所有的other只和DR,BDR之间建立邻接关系,other之间不相互建立邻接,DR,BDR之间也会建立邻接关系。所有路由器都只将链路状态信息由224.0.0.6组播地址发送给DR,BDR,只有DR,BDR监听这个地址,而DR将网络链路状态由224.0.0.5组播发送,DR,BDR,other都监听这个地址。这样就减少了BMA网和NBMA网络上各路由器之间邻接关系的数量,同时减少网络流量,节约了带宽资源。
正常情况下只有DR同步数据,BDR只是接受数据,但是不同步数据。如果DR失效,那么BDR立即成为DR。由于不需要重新选举,并且邻接关系之前已建立,所以这个过程是非常短暂的。当然这时还需要再重新选举出一个新的BDR,虽然需要较长的时间,但并不会影响路由的计算。
6.3 如何选举DR,BDR
DR和BDR是由同一网段中所有的路由器根据路由器优先级、Router ID通过Hello报文选举出来的,只有优先级大于0的路由器才具有选举资格。
1.比较接口的优先级:拥有最高OSPF优先级的接口会成为DR。 |
2.当接口的优先级一样:比较RID,最高的成为DR,次高的成为BDR。 |
备注:1.DR的选举是非抢占的,如果选举完了,即使出现更高优先级的接口也不会成为DR。 2.在一个MA网络中,必须有DR,不一定有BDR。 3.DR的选举基于接口:DR是某个网段中的概念,是针对路由器的接口而言的。某台路由器在一个接口上可能是DR,在另一个接口上有可能是BDR,或者是DR Other。 |
7.OSPF报文机制
OSPF会在相互发送链路状态信息,hello数据包等等的时候是依托IP协议发送报文。IP协议是一种不可靠的传输方式,所以是需要RTP保证传输的可靠性。所以2,3,4报文发送后需要5LSack报文进行确定,hello报文是周期性的所有不用担心。
OSPF一共有5种报文
五种报文=OSPF packet 报头+报文具体信息
1.hello报文 |
2.DBD(数据库描述)报文 |
3.LSR(链路状态请求)报文 |
4.LSU(链路状态更新)报文 |
5.LSack(确认)报文 |
OSPF整体数据包构成
IP报头 |
OSPF packet 报头 |
报文具体信息 |
8.OSPF成为邻接的过程
在之前简单的讲述了OSPF之间是怎么相互交换信息的,比如怎么样成为邻居,什么时候同步链路状态信息,那么具体是怎么样运行的呢?
启用OSPF的路由器之间相互到达最终状态经过7个状态。
1.down state:两个路由器的接口之间没有任何交流。假设是A,B两个路由器。都没有接受到对方的hello。 |
2.init state:一方知道另外一方的信息。A发送hello出去,B知道A的信息,A还没有接受到B的回复hello,不知道B的信息。 |
3.two way:双方都知道对方的信息。B回发了hello给A,此时这个hello报文里面包含了邻居字段,也就是B知道A是自己的直连邻居。A接受到了hello报文。 如果是BMA,NBMA网络。 在此状态下会完成DR的选举,并且会持续一个hello 失效时间(具体时常定义在hello报文分析中),在dead time时间内进行DR的选举,以防止某些路由器启动慢等等原因。保证公平性。 |
4.exstart state :接口之间相互协商主从关系来,一般是RID高的接口为主。并且产生一个序列号,这个序列号是用来描述DBD报文的更新信息的。比如我发送的时候DBD序列号是1,后来对方回复了序列号就是2。以此类推。 |
5.exchange state:由主路由器接口首先发送DBD给从路由器接口。从路由器然后发送DBD给主路由器。相互交换DBD信息。 |
6.loding state:数据库概要信息发送完后,路由器相互比较找出对方有的链路状态信息而自己是没有的。并且发送LSR包请求相对应的信息。对方接受到LSR发送LSU报文给需要这个信息的路由器。为保证传输的可靠,LSR,LSU是需要LSack确认的。等到相互确认更新完成后。此状态结束。 |
7.full state:最终状态。同步完成。 |
9.OSPF的度量值
OSPF使用“代价(Cost)”作为路由的度量值(Metric),路径的度量值越低,说明该路径越好,具有最低度量值的路径将装入路由表。代价是根据接口所配置的带宽来计算的,带宽越高,代价越低。参考带宽默认为100M,计算公式为10^8/带宽值,注意这里的带宽单位是bit/s。所有100M为1,10M为100,OSPF能识别的最大带宽为100M,所有1G带宽的线路依然为1。可以通过手工定义接口的代价或者更改参考值来完成更改。
10.OSPF总结
OSPF基本可以做到基本无环路,而且是公有协议,任何一个厂家都可以使用,结合合理的网络设计可以达到很好的效果,收敛的速度快。
——————————————————————————————————————————
知识来自于itercast.com 讲师nasu_su。谢谢苏老师
文章内容部分来自于 H3C某网页(我也不知道那是什么网页)。维基中文。和其他