OSPF协议详解分析.docx
《OSPF协议详解分析.docx》由会员分享,可在线阅读,更多相关《OSPF协议详解分析.docx(25页珍藏版)》请在冰豆网上搜索。
OSPF协议详解分析
OSPF学习笔记
OSPF协议号是89,也就是说在ip包的protocol中是89,用ip包来传送
数据包格式:
在OSPF路由协议的数据包中,其数据包头长为24个字节,包含如下8个字段:
*Versionnumber-定义所采用的OSPF路由协议的版本。
*Type-定义OSPF数据包类型。
OSPF数据包共有五种:
*Hello-用于建立和维护相邻的两个OSPF路由器的关系,该数据包是周期性地发送的。
*DatabaseDescription-用于描述整个数据库,该数据包仅在OSPF初始化时发送。
*Linkstaterequest-用于向相邻的OSPF路由器请求部分或全部的数据,这种数据包是在当路由器发现其数据已经过期时才发送的。
*Linkstateupdate-这是对linkstate请求数据包的响应,即通常所说的LSA数据包。
*Linkstateacknowledgment-是对LSA数据包的响应。
*Packetlength-定义整个数据包的长度。
*RouterID-用于描述数据包的源地址,以IP地址来表示,32bit
*AreaID-用于区分OSPF数据包属于的区域号,所有的OSPF数据包都属于一个特定
的OSPF区域。
*Checksum-校验位,用于标记数据包在传递时有无误码。
*Authenticationtype-定义OSPF验证类型。
*Authentication-包含OSPF验证信息,长为8个字节。
FDDI或快速以太网的Cost为1,2M串行链路的Cost为48,10M以太网的Cost为10等。
所有路由器会通过一种被称为刷新(Flooding)的方法来交换链路状态数据。
Flooding是指路由器将其LSA数据包传送给所有与其相邻的OSPF路由器,相邻路由器根据其接收到的链路状态信息更新自己的数据库,并将该链路状态信息转送给与其相邻的路由器,直至稳定的一个过程。
当路由器有了一个完整的链路状态数据库时,它就准备好要创建它的路由表以便能够转发数据流。
CISCO路由器上缺省的开销度量是基于网络介质的带宽。
要计算到达目的地的最低开销,链路状态型路由选择协议(比如OSPF)采用Dijkstra算法,OSPF路由表中最多保存6条等开销路由条目以进行负载均衡,可以通过"maximum-paths"进行配置。
如果链路上出现fapping翻转,就会使路由器不停的计算一个新的路由表,就可能导致路由器不能收敛。
路由器要重新计算客观存它的路由表之前先等一段落时间,缺省值为5秒。
在CISCO配置命令中"timersspfspf-delayspy-holdtime"可以对两次连续SPF计算之间的最短时间(缺省值10秒)进配置。
路由器初始化时Hello包是用224.0.0.5广播给域内所有OSPF路由器,选出DR后在用224.0.0.6和DR,BDR建立邻接。
DR用224.0.0.5广播给DRotherLSABDR也是
DRother用224.0.0.6广播LSA给DR和BDR
DR是在一个以太网段内选举出来的,如果一个路由器有多个以太网段那么将会有多个DR选举;DR的选择是通过OSPF的Hello数据包来完成的,在OSPF路由协议初始化的过程中,会通过Hello数据包在一个广播性网段上选出一个ID最大的路由器作为指定路由器DR(如果设置优先级的话那么首先看优先级,优先级为0不参加选举)并且选出ID次大的路由器作为备份指定路由器BDR,BDR在DR发生故障后能自动替代DR的所有工作然后重新选择BDR。
当一个网段上的DR和BDR选择产生后,该网段上的其余所有路由器都只与DR及BDR建立
相邻关系。
见下图
DR的选举过程:
这里可以以选举村长为例
选举的时候用Hello包中的DR字节来标识,开始的时候都是标识的自己,一旦选举出一个DR来那么即使后来再有优先级更高的进来也不重新选举(因为一旦重新选举那么所有的邻接关系都要重新建立)
OSPF启动的过程:
down
init
发送Hello(224.0.0.5)DR字段为全零(因为还没有选出DR),
单通状态,我能收到对端的Hello报文,但对方没有收到我的报
文,怎么知道对端有没有收到我的报文呢,通过NeighborsSeen
看
2way
2个OSPF路由器从Hello中发现互相的routerid(本地路由器最大
ip,一般是loopback)建立邻接
在这个阶段已经知道谁是DR了
exstart
预启动状态,OSPF路由器建立主从关系(看谁的routerid大)然后
协商一个序列号(因为ip是不可靠的传输采用确认+超时重传
就可以)准备传送,头两个DD报文为空,不包含LSA的数据
Router1:
DDseq=x,I=1,M=1,MS=1
I是第一个报文
M是more表示还有后续报文
MS是表示Router1是Master
Router2:
DDseq=y,I=1,M=1,MS=1
I是第一个报文
M是more表示还有后续报文
MS是表示Router2是Master
究竟谁是master呢,就会选一个routerid大的作为
master
谁当了master序列号就用谁生成的那个数,在这里应该
是Router2的y
exchange
和DR开始交换数据,master先发送lsdb报文,此报文只是一个
index(如同一本书的目录)不包含实际的路由数据,slave也发
送报文,看谁的序列号高,序列高的数据新,相邻路由器可以根
据数据库描述数据包的序列号与自身数据库的数据作比较,若发
现接收到的数据比数据库内的数据序列号大,则相邻路由器会针
对序列号较大的数据发出请求,并用请求得到的数据来更新其链
路状态数据库。
Router1先发送DD报文序列号用master的并且MS字段为0
RouteR2回应报文把序列号加1表示已经收到了刚才的DD报文并
且也包含自己的DD报文,下一个Router1的DD报文还用y+1
来表示因为slave无权把序列号加1。
如果DD报文中的M=0
那么表示DD报文发送结束
loading
装入状态,如果新加入的路由器的从DD报文中看出那个是自己
需要的路由数据,则发送lsr报文,请求发送数据,对端发送LSU
报文,此报文包含所需的全部数据。
full
收到LSU报文后发送确认,完成充满状态。
Hello包TTL值是1,在以太网中每10秒发送一次,而且不穿过路由器,通常OSPF协议报文的TTL都是1(虚连接除外)linkstatus包flood整个area(麦子说flood是由区域内所有路由器接力完成)一个DD报文可以含有很多个LSA的头部信息从init――――loading是路由器第一次交换信息的时候才出现,到了full以后如果在有路由变化那么就只发送LSU
邻居状态机(灰色为可以长期存在的状态,白颜色为短暂状态)2-way为2个DRother之间可以有这种状态
OSPF五种协议报文:
LSA类型
type1又被称为路由器链路信息数据包(RouterLink),所有的OSPF路由器都会产生这种数据包,用于描述路由器上联接到某一个区域的链路或是某一端口的状态信息。
路由器链路信息数据包只会在某一个特定的区域内广播,而不会广播至其它的区域。
在类型1的链路数据包中,OSPF路由器通过对数据包中某些特定数据位的设定,告诉其余的路由器自身是一个区域边界路由器或是一个AS边界路由器。
并且,类型1的链路状态数据包在描述其所联接的链路时,会根据各链路所联接的网络类型对各链路打上链路标识,LinkID。
表一列出了常见的链路类型及链路标识。
1
用于描述点对点的网络
识
相邻路由器的路由器标
2
用于描述至一个广播性网络的链路
DR的端口地址
3
用于描述至非穿透网络,即stub网络的链路
stub网络的网络号码
4
用于描述虚拟链路
识
相邻路由器的路由器标
链路类型3(1对0或者Stub网络)的链路状态描述――linkid10.0.0.0/网段/data:
255.0.0.0/掩码type:
StubNet(3)/类型/metric:
50/度量/
链路类型1(点对点)的链路状态描述,首先要描述一下接口的路由信息:
linkid:
20.0.0.0/网段/data:
255.0.0.0/掩码/
type:
StubNet(3)/类型/此处还是3,因为ppp类型分成2部分,首先把它想象成一个1:
0也就是类型3的网络这么做是为了描述接口的路由,20.0.0.0,第二步在描述对端连接的那台路由器
metric:
5/度量值/
对对端路由器的描述:
linkid:
2.2.2.2/对端RouterID/
data:
20.0.0.2/对端路由器的接口地址/
type:
Router
(1)/类型/metric:
5
对帧中继(点对多点)链路状态的描述:
首先也是先描述接口网段的路由
linkid:
40.0.0.1/网段/描述的是自己的接口地址,不是网段
data:
255.255.255.255/掩码/type:
StubNet(3)/类型/此处还是描述成1对0的网段metric:
5/度量值/
linkid:
3.3.3.3/对端routerF的id/因为是连接多点的,所以有多段描述data:
40.0.0.1/与routerF相连的接口地址/type:
Router
(1)/类型/metric:
5/度量值/
linkid:
4.4.4.4/对端routerE的id/
data:
40.0.0.1/与routerE相连的接口地址/此处描述的是routerA的接口地址,并不是RouterE的接口地址,没关系因为点对多点连接的接口地址都在一个子网内
type:
Router
(1)/类型/metric:
5/度量值/
对广播型网络链路状态的描述:
不描述接口网段的路由了
linkid:
30.0.0.3/网络中DR的接口地址/data:
30.0.0.1/本接口的地址/type:
TransNet
(2)/类型/metric:
50/花费/每个路由器只生成这些信息,缺少的信息有DR补齐,这样会节省很多的描述信息,如果不是的话假如这里有100台路由器那么得生成100段描述信息。
DR会单独生成一条(也就是说不管DRother有多少条)LSA(type2)描述掩码和这个网段中有那些路由器/DR(6.6.6.6)生成的LSA/Netmask:
255.255.255.0Attached30.0.0.1routerAttached30.0.0.2routerAttached30.0.0.3router
以上的这些描述信息还要加上LSA的头(head)type:
Router/LSA的类型/此处的Router表示是LSA类型1lsid:
1.1.1.1/LSA的标识/advrtr:
1.1.1.1/生成该LSA的路由器/表示这条LSA是谁生成的lsage:
4/本条LSA的老化时间/每隔1秒这个数字会涨1len:
108/LSA的长度/seq#:
80000001/LSA序列号/linkcount:
7/本LSA中包含的连接个数/
此时RouterA路由器完成自己周边链路状态的描述
flood完lsdb后就要用spf生成路由表了,见下图:
(以RouterA为例)
首先每个路由器都已自己为根计算路由,以Routera为例它把每一个LSA打开,分析每一段,碰到StubNet这种类型的LSA就知道这是描述的一条网段路由,于是就直接加到路由表中比如上图中的10.0.0.0和20.0.0.0就直接加到路由表中不过这两条是本路由器直接相连的网段所以意义不大,那么看第三段,这段描述的是一个点对点的类型,路由器看到这段就会先停止计算,它会去找RouterB生成的LSA(因为这段描述的到routerb的点对点连接)因为每个LSA都有routerid(advid)路由器就会以2.2.2.2为关键字检索就会找到routerb的LSA,找到以后在打开看它有什么信息,routerb中有一个直连网段50.0.0.0,这个网段对于routera是未知的,所以就加入路由表中下一跳就指向20.0.0.2(因为此LSA是Routerb告诉我的)Metric值相加50+5=55,这样这条路由就完全加入到路由表中了。
如果RouterB的LSA中还连着一个RouterW,那么路由器还继续去找RouterW的LSA找到后在继续算Routerw的路由(因为是RouterB连接的RouterW下一跳还是RouterB,Metric在相加)。
RouterA通过递归和回朔算完所有的LSA的路由,所有的路由都是从每个routerLSA的StubNet这种网络中得出路由的,因为StubNet才是描述接口网段的路由,才是我们最终需要的路由信息,那么Type:
Router只是描述的是下一跳地址。
每台路由器都有义务描述自己周边的链路状态(包括自己直连的路由器)见上图
每台路由器把周边的链路状态都发送到整个area,这样,所有的路由器都存有一张同样的lsdb信息,在由这个库算出来spf路由。
当一台路由器的连接的某一个网段发生故障,那么就会产生一个LSA在flood到整个区域,所有的路由器都要在计算一边spf路由,因为路由器不知道这条LSA会影响那个路由,所以要重新把所有的lsdb重新计算一遍,耗时并且占cpu。
type2由DR发送,指定路由器产生用于描述所处的网段的链路数据包—networklink,该数据包里包含在该网段上所有的路由器,包括指定路由器本身的状态信息指定路由器DR只有在与至少一个路由器建立相邻关系后才会产生网络链路信息数据包,在该数据包中含有对所有已经与DR建立相邻关系的路由器的描述,包括DR路由器本身。
类型2的链路信息只会在包含DR所处的广播性网络的区域中广播,不会广播至其余的OSPF路由区域。
type34类型3和类型4的链路状态广播在OSPF路由协议中又称为总结链路信息数据包(SummaryLink),该链路状态广播是由区域边界路由器或AS边界路由器产生的。
SummaryLink描述的是到某一个区域外部的路由信息,这一个目的地地址必须是同一个AS中。
SummaryLink也只会在某一个特定的区域内广播。
类型3与类型4两种总结性链路信息的区别在于,类型3是由区域边界路由器产生的,用于描述到同一个AS中不同区域之间的链路状态;而类型4是由AS边界路由器产生的,用于描述不同AS的链路状态信息。
Type3类型的特点是每一条type3的LSA都对应一条路由
值得一提的是,只有类型3的SummaryLink才能广播进一个残域,因为在一个残域中不允许存在AS边界路由器。
残域的区域边界路由器产生一条默认的SummaryLink对域内广播,从而在其余路由器上产生一条默认路由信息。
采用SummaryLink可以减小残域中路由器的链路状态数据库的大小,进而减少对路由器资源的利用,提高路由器的运算速度。
abr会把各端口所属的各个区域的LSAtype1阻断,如:
type:
Router
(1)的LSA
那上图中area3如何知道area0中的路由呢,abr会把area0中所有的路由信息,比如有100条路由,会以100条type3类型的LSA发送到area3中并且下一跳是abr本身。
这样可以减少LSA的容量,如果area0中有一条路由down了,那么在area3中直接可以把这条路由删掉就可以了,不用像以前那样重新计算
在区域间的路由器上不再描述链路状态而是采用dv算法
type5类型5的链路状态广播称为AS外部链路状态信息数据包。
类型5的链路数据包是由AS边界路由器产生的,用于描述到AS外的目的地的路由信息,该数据包会在AS中除残域以外的所有区域中广播。
一般来说,这种链路状态信息描述的是到AS外部某一特定网络的路由信息,在这种情况下,类型5的链路状态数据包的链路标识采用的是目的地网络的IP地址;在某些情况下,AS边界路由器可以对AS内部广播默认路由信息,在这时,类型5的链路广播数据包的链路标识采用的是默认网络号码0.0.0.0。
External外部路由又分成了External1和2两种情况
1:
把外部进来的路由传进来cost在area中要叠加的(一般情况)
2:
进来的时候cost是多少那么就一直是多少,不管经过多少路由器(负载均衡时用)
type4类型只是描述如何到达asbr,见上图网段写的是asbr的routerid,下一跳指向abr为什么不把它当成type3那样处理呢?
直接生成type3的路由信息因为是避免自环,因为外部路由是不可靠的,所以第五类的路由的优先级不一样,这些路由在路由表中标识出ase,优先级很低
各LSA都有有它自己的老化计时器,承载在LS寿命域内。
缺省值为30分钟
LSA的分类
区域的类型:
1:
backbone骨干域
每一个区域都有着该区域独立的网络拓扑数据库及网络拓扑图。
对于每一个区域,其网络拓扑结构在区域外是不可见的,同样,在每一个区域中的路由器对其域外的其余网络结构也不了解。
这意味着OSPF路由域中的网络链路状态数据广播被区域的边界挡住了,这样做有利于减少网络中链路状态数据包在全网范围内的广播,也是OSPF将其路由域或一个AS划分成很多个区域的重要原因。
骨干域传播域间路由
在OSPF路由协议中存在一个骨干区域(Backbone),该区域包括属于这个区域的网络及相应的路由器,骨干区域必须是连续的,同时也要求其余区域必须与骨干区域直接相连。
骨干区域一般为区域0,其主要工作是在其余区域间传递路由信息。
所有的区域,包括骨干区域之间的网络结构情况是互不可见的,当一个区域的路由信息对外广播时,其路由信息是先传递至区域0(骨干区域),再由区域0将该路由信息向其余区域作广播(见上图)
如果骨干网不连续要设置虚链路解决(见下图)
2:
stub末端域
在OSPF路由协议的链路状态数据库中,可以包括AS外部链路状态信息,这些信息会通过flooding传递到AS内的所有OSPF路由器上,如果配置成末端域就不接收这类信息,不接收type5类型的路由信息,怎么访问外部网络呢?
由abr产生一条默认路由,因为abr知道所有的路由信息,stub路由把不知道的包都给abr就可以了外部的type5进来由abr直接变成一条缺省路由了
针对末端域还有两点需要注意:
一是末端域中不允许存在虚拟链路;二是末端域中不允许存在AS边界路由器。
Hello包中有stub字段
3:
Totallystub完全末端
只接收type1和2,type3也不接收,接收abr的一条默认路由,要配置stub区域要把域中所有的路由器都配置成stub所有的域间的路由信息都要经过area0来传递
对于普通的路由器原始发出的LSA都是type1类型的,到了abr之后传到area0中就变成type3了,如果abr同时又是个asbr外面连的是rip它就会产成一个type5传到任何域也是type5分成E1和E2stub不接收type5abr来判断下面是stub就会产成一条缺省路由在abr中配置成完全末端(配nosummary)就会产成一条缺省路由了,其他路由器还是配成stub域就可以了
OSPF的接口和路由器的分类
为什么说OSPF是没有自环的:
VirualLink虚拟连接
应该所有的area都要和backbone相连(为了防止环路)不和主干相连的area传递路由信息也要经过area0来穿过阻挡它和主干相连的域
在下图所示的例子中,区域1与区域0并无物理相连链路,我们可以在路由器A及路由器B之间建立虚拟链路,这样,将区域2作为一个穿透网络(Transit-network),路由器B作为接入点,区域1就与区域0建立了逻辑联接。
汇总路由:
把内部域的路由汇聚发到主干域,这样当内部路由flapping的时候不影响外面
在nbma网络中的OSPF:
NBMA网络是指那些能够支持多台(两台以上)路由器但不具有广播能力的网络。
帧中继、ATM和X.25都是NBMA网络的例子
如果serial口是配置的物理端口,也就是说没有配置子接口,默认是nbma模式,不支持广播,因为广播或多播地址是无法映射到2层的dlci号的。
可以用showipOSPFints0看接口的networktype是nbma的
如果3台路由器R1R2R3
R3是帧中继交换机,则R3必须成为DR,用静态neighbor指定和R2,R1建立邻接,因为R1和R2的信息通过R3发送,可讲R2和R1优先级设成0,不进行DR的选举。
在NBMA拓朴结构上缺省OSPFHello间隔和down机间隔为30秒和120秒下表是在各类拓朴结构上缺省OSPFHello间隔和down机间隔
OSPF环境
Hello间隔
Down机判定间隔
广播
10秒
40秒
点对点
10秒
40秒
NBMA30秒120秒
OSPF在NBMA拓朴结构中以两种正式模式之一运作:
l非广播多路访问l点对多点
在NBMA拓朴结构中配置路由器时,通常采用子接口可以通过下面的命令来创建子接口:
iterfaceserialnumber.subinterface-number{multipiont|point-to-point}
在大型网络中,采用点对多点模式可以减少完全连通所必需的PVC数量点对多点有以下属性不需要全互连的网络不需要静态邻居配置使用一个IP子网复制LSA数据包
在NBMA拓朴结构上的OSPF小结NBMA全互连邻居必须属于同一子网号人工配置选举DR/BDRRFC广播全互连邻居必须属于同一子网号自动选举DR/BDRCisco点对多点部分互边或星型邻居必须属于同一子网号自动,没有DR/BDRRFC点对多点非广播部分互边或星型邻居必须属于同一子网号手工配置没有
DR/BDRCisco
点对