首页 > 代码库 > OSPF详解之三:OSPF LSA详解
OSPF详解之三:OSPF LSA详解
OSPF LSA详解
OSPF V2版本中常用的主要有6类LSA,分别是Router-LSA、Network-LSA、Network-summary-LSA、ASBR-summary-LSA、AS-External-LSA、NSSA-LSA,接下来我将一步一步为大家解析。
Type 1:Router-LSA
每个设备都会产生,描述了设备的链路状态和开销,在所属的区域内传播。
谈到1类LSA,大家必然会想到它的链路类型,链路类型分为4类:P2P、Stub、Transit、Vritual link。
Link Type | Link ID | Link Data |
P2P | 邻居的RID | 自己的IP |
Stub | 网络号 | 掩码 |
Transit | DR的接口地址 | 自己的IP |
Vritual link | 邻居的RID | 自己的IP |
通过上述表格大家是否能明白什么意思?
通过MA网络抓包可以看到
这是我随机截的一个1类LSA的包,10.1.12.2为互联IP地址,2.2.2.2/3.3.3.3为loopback口地址,可以看到loopback的链路类型为Stub类型,为最末端,也无法再继续添加任何接口。互联接口的链路类型为Transit类型,由于此时的网络类型为Broadcast。
当我把R1和R2的网络类型更改为P2P之后,可以看到如下现象;更改网络类型命令:在接口下ospf network-type p2p来实现
可以发现互联链路类型为P2P,10.1.12.2的link-id为对端的RID,此接口已变为Stub链路类型。
测试Virtual Link链路类型:
模拟方法如下:
拓扑:
虚链路配置方法如下:
R1:
在area模式下配置:vlink-peer R2的router-id
R2:
在area模式下配置:vlink-peer R1的router-id
R1和R2之间建立Virtual-Link,建立完成后在R1-R2之间的链路抓包如下:
可以发现R1-R2之间的链路类型为Virtual Link。
注:虚链路在现实环境中用到的很少,只能说在我的职业生涯中还没碰到过,不过Vlink是一个解决区域隔离的有效方法。
总结:每种链路类型在什么情况下会出现?
P2P:非MA link上会有P2P link state。(OSPF网络类型:P2P P2MP)
Stub:仅当有stub link,如没有邻居的ethernet ,or secondary address 网络,loopback 接口网络or P2P link上的网络号都是以stub形式出现。
Transit:MA网络中每台路由器都会产生transit类型的LSA1。
Virtual Link:在建立了虚链路的情况下会产生Virtual link的LSA1。
Type 2:Network-LSA
由DR(Designated Router)产生,描述本网段的链路状态,在所属的区域内传播。
根据报文来查看,很多段1类LSA里也存在,就像LS Age、LS ID、AR 、LS seq等等。那我就根据这些段简单的聊聊吧。
LS age:LSA的老化时间,范围是0~3600s,一个路由器在始发一个LSA时,会把LS Age设置为0,经过一台路由器,LSA的老化时间就会增加一个infTransDelay设定的时间,默认为1s。
当一条LSA通告的老化时间达到最大生存时间时,LSA将被重新泛洪扩散,并且随后会从LSDB中清除该条LSA。当一台路由器需要从所有路由的数据库中清除一条LSA时,它会提前把这条LSA的老化时间设置为最大生存时间并重庆泛洪扩散这个LSA。在这里,只有始发这条LSA的路由器才可以提前使这条LSA老化。
问:在什么情况下,OSPF会在LSDB中存在大量未老化的LSA?
答:当设备剩余内存降低时,SOCK会优先上送队列优先级较高的报文,当剩余内存很低时,除了Hello报文之外的其他协议报文均不上送,造成LSA无法得到更新,Age值达到3600s之后,OSPF无法计算出路由,并且由于ACK报文也不上送,造成LSDB无法老化。#摘自Hedex文档
至于Link state ID、Link-state Advertisement Type、Advertising Router、LS seq、LS Checksum、Length等信息,相信大家可以看懂,只要对OSPF LSA有点了解,这些也就是字面意思。
下面给大家分析一下option字段:
DN位:全称Downbit,主要出现在MPLS VPN环境中。
O位:O比特被定义使用在OSPF的option字段中,用来说明路由器是否有能力发送和接收opaque LSA。
当我们部署MPLS TE且使用OSPF作为TE的时候,OSPF就需要扩展以便支持MPLS TE,这时候就可以看到Obit位的置位了,而且只能够在这种环境下的DBD报文中看到相应的option的obit置位,而其他报文中的option里obit仍然为0。
NP位:其中N/P位为1位,N位及P位分别只出现在HELLO及LSA报文中:
在Hello报文中:N bit指示该路由器为NSSA区域路由器,当N bit被置1时E bit就必须被清零。
在LSA报文中:P bit仅在7类LSA中出现。
MC位:该位描述是否组播扩展OSPF。
E位:当始发路由器具有接受AS外部LSA的能力时,该位将被设置。
在所有的AS外部LSA和所有始发于骨干区域以及非末梢区域的LSA中,该位将设置为1。而在所有始发于末梢区域的LSA当中,该位设置为0。另外,可以在Hello数据包中使用该位来表明一个接口具有接收和发送类型5的LSA的能力。E位配置错误的邻居路由器将不能形成邻接关系,这个限制可以确保—个区域的所有路由器都同样地具有支持末梢区域的能力。
Type 3:Network-summary-LSA
由ABR产生,描述区域内某个网段的路由,并通告给发布或接收此LSA的非Totally STUB或NSSA区域。
完全末梢区域是不存在3类LSA的,NSSA区域没有5类和3类LSA,多了7类LSA。
如果在OSPF中执行了Area间汇总,那么LSA3中通告的就是汇总路由而不是明细的,其实这里就应该说成时“路由”而不是“链路”,因为LSA3本身通告的就是各网络如何可达,接受路由器并不明了该Area的拓扑结构,只是以DV的思想,将LSA3中通告的链路加上自己到ABR的开销就放进路由表了。
通过实验来查看3类LSA,拓扑如下:
我们在ABR上的Area 1里面做汇总,命令如下:abr-summary 3.1.0.0 255.255.0.0
你查看路由可以发现在R2上看到的是两条明细路由分别为3.1.1.0/24和3.1.2.0/24,在R1上查看到的是一条汇总路由3.1.0.0/16。这是由于在ABR上面做了汇总,可以通过命令display ospf lsdb summary查看3类LSA的明细。如下:
通过查看,可以发现这条3类LSA的始发路由器为R2,并不是原路由器R3了。当做了路由汇总之后,这条汇总路由的通告路由器便是做汇总的这个ABR。
Type 4:ASBR-summary-LSA
由ABR产生,描述到ASBR的路由,通告给除ASBR所在区域的其他相关区域。
LSA3和LSA4都由ABR始发,报文格式是相同的,只不过有几处字段内容不一样。在“链路状态ID”这个字段中,LSA3通告的是网络或子网的IP地址,而LSA4通告的是ASBR的路由器ID;而“网络掩码字段”对LSA4没什么意义,设置为0.0.0.0。
一台Router成为ABR的前提是必须有运行OSPF进程的接口与Area 0直连,否则不会产生LSA3和LSA4,也就无法完成ABR的任务,解决办法一般是通过虚链路。
LSA3和LSA4都只能在单Area内泛洪。具体来看,LSA4就是在Area0内泛洪让ABR都知道ASBR在哪;而LSA3这里要注意,比如Area1和ABR将Area1的路由信息通告进Area0,成为一个LSA3,因为不仅要加上自己到那个ABR的链路开销,而且ADV Router也要改为自己,新的LSA3会进入到Area2并泛洪开来,所以还是遵守了LSA3的泛洪原则。从一个侧面也可以看出,OSPF进行Area间路由是典型的距离矢量的行为。
如上拓扑,我在R3上新建loopback 3和loopback 4引入,这样R3便成为了ASBR。
我们在R1上查看4类LSA的详细信息:
通过可以看到LS id为R3(ASBR)的router-id,通告路由器为R2(ABR)的router-id。当然有4类LSA存在的话,必然有5类LSA或7类LSA。因为4类LSA是通告到ASBR的路由,从其他区域到ASBR的路由。
Type 5:AS-External-LSA
由ASBR产生,描述到AS外部的路由,通告到所有的区域(除了STUB区域和NSSA区域)。
LSA5通告了ASBR直连的其他AS的路由信息,不同于BGP中AS的概念,这里指IGP区域。LSA5被Flooding至除Stub、Totally Stub、NSSA以外的所有Area,是唯一的一个不与任何Area相关连的LSA通告。
LSA5形成的路由条目以Type1或Type2表示,通过命令改为Type1类型。在ospf进程下,配置命令import direct|static|rip|ospf|isis|bgp type 1 即可改为Type 1 方式计算Cost。
Type1 Cost=本地到ASBR的Cost+ASBR到AS外部目的网络的Cost
Type2 Cost=ASBR到AS外部目的网络的Cost
当OSPF路由器获得一条LSA5,在装进路由表之前会检查“转发地址(Forwarding Address)”是否可以通过Area内或Area间路由到达,若不可达,不会装进路由表。
Type 7:NSSA-LSA
由ASBR产生,描述到AS外部的路由,仅在NSSA区域内传播。
谈到7类LSA,必然会牵扯出NSSA区域。到底何为NSSA区域呢?
OSPF规定STUB区域是不能引入外部路由的,这样可以避免大量外部路由对STUB区域路由器带宽和存储资源的消耗。对于既需要引入外部路由又要避免外部路由带来的资源消耗的场景,STUB区域就不再满足需求了。因此产生了NSSA区域。
OSPF NSSA区域(Not-So-Stubby Area)是OSPF新增的一类特殊的区域类型。
NSSA区域和STUB区域有许多相似的地方。两者的差别在于,NSSA区域能够将自治域外部路由引入并传播到整个OSPF自治域中,同时又不会学习来自OSPF网络其它区域的外部路由。
还记得在上一章谈邻接关系的时候谈到DD报文,DD报文里有一个字段NP-bit就关系到NSSA区域,当NP-bit置位时,表示此区域为NSSA区域。
而7类LSA是为了支持NSSA区域而新增的一种LSA类型,用于描述引入的外部路由信息,Type7 LSA由NSSA区域的自治域边界路由器(ASBR)产生,其扩散范围仅限于ASBR所在的NSSA区域。NSSA区域的区域边界路由器(ABR)收到Type7 LSA时,会有选择地将其转化为Type5 LSA,以便将外部路由信息通告到OSPF网络的其它区域。
为了将NSSA区域引入的外部路由发布到其它区域,需要把Type7 LSA转化为Type5 LSA以便在整个OSPF网络中通告。在Type7 LSA中有一个P-bit(Propagate bit),用于告知转化路由器该条Type7 LSA是否需要转化,只有P-bit置位并且FA(Forwarding Address)不为0的Type7 LSA才能转化为Type5 LSA;若不置位,将不会转化为5类LSA。缺省情况下,转换路由器的是NSSA区域中Router ID最大的区域边界路由器(ABR)。区域边界路由器产生的Type7 LSA不会置位P-bit。
在NSSA区域中,我们可能同时存在多个ABR,当出现多个ABR后,都计算彼此之间的路由,可能会产生环路,所以为了防止环路的产生,定义边界路由器之间不计算对方发布的缺省路由。
Forwarding Address
关于FA,它有为0或非0两种情况,我从下面实验来帮大家认识FA。
场景:此环境为MA环境,R1和R2之间属于OSPF Area0,R3不属于OSPF。在R2上建立指向3.3.3.3/24的静态路由,并引入OSPF中。
而此时R2属于ASBR,我们在R2上查看display ospf lsdb ase可以发现,R2为3.3.3.3的通告路由,FA地址为10.1.1.3。
同样在R1上看3.3.3.3 5类LSA的内容也是如此。当存在FA时,此时路由器不会再去找ASBR,而是会根据FA地址来转发到3.3.3.3。在R1上trecert即可发现。
通过追踪3.3.3.3的ping包可以发现,数据包根本不会到达ASBR,根据FA地址,就直接丢过去了。
总结:当FA为非0时,OSPF区域内路由器不会再去寻找ASBR,直接根据FA地址转发。
那何时FA为0呢?现在我们做一点小小的更改。
将OSPF网络类型更改为P2P模式,在接口模式下配置ospf network-type p2p即可。
此时在R2上查看5类LSA内容,发现FA此时为0
当FA为0时,它的数据包该如何转发呢?由于R2为ASBR,为了查看效果我们在R1上tracert 3.3.3.3测试。
此时你会发现,R1到3.3.3.3走了两跳,先到达R2 ASBR,再到达R3。
结论:当FA为0时,OSPF区域内路由首先找到ASBR,再从ASBR到目的地址。这样你就会发现产生了次有路径,所以FA还能解决次优路径。
接下来为大家总结一下,FA何时为0何时为非0。
如果外部路由的下一跳地址满足,在asbr上。
1、下一跳地址所对应的网络发布到ospf内
2、下一跳所在的link没有slient
3、下一跳地址所在的link的网络类型不是P2P或P2MP
满足上述条件,LSA5 Forwarding Address是非0.0.0.0,等于下一跳地址;
如果不满足,则LSA5 Forwarding Address是0.0.0.0 。
当然FA在7类LSA中也存在,但是在7类LSA中FA始终为非0。
原因:在NSSA区域,会产生多个ABR,这样如果FA为0时,容易产生次优路径或环路。从下面FA的作用的场景中可以看出。
刚才也说过,FA能避免次优路径,这提到了FA的作用,FA有两大作用:
1、避免次优路径
2、避免环路
同样以场景来为大家解释:
1、避免次优路径
根据上面拓扑来分析:
当FA地址为非0时,在R4上查看FA=10.1.12.1,数据包路径:R4->R2->R1
当FA地址为0时,数据包路径:R4->R3->R1(次优路径)
分析:这样就产生了次优路径,为啥会走R3呢?那是因为在NSSA区域中若出现多个ABR,由router-id大的那个ABR做转发,这是为了避免环路的发生。如果LSA5不携带FA地址或7/5转换时把FA地址抑制掉,R3上进行7/5转换后,生成的LSA5中的FA为0,R4收到这条LSA5时,寻找到ASBR最短路径,通过计算下一跳为R3,这样次优路径就产生了。
2、避免环路
就将上面环境做一下小小的更改
R2和R3之间直连一根线,在Area 1内,删除了R1-R2之间的互联。并且将R2的router-id改的比R3大。
此时,我们来分析一下:
当FA为非0时,数据包路径:R4->R3->R1
当FA为0时,数据包路径:R4->R2->R3->R4(环路产生)
分析:当FA为非0时,数据包当然会根据FA来转发,最终到R1。但FA为0时,此时R4需要找到ASBR,由于把R2的router-id改大了,此时R2为ASBR。这样R4->R2。当然对于R3来说,此时R3在NSSA区域会收到一条关于1.1.1.1/24的7类LSA,而在R2上进行7/5转换之后,5类LSA会在非STUB、NSSA区域内泛洪,这样R3也会收到一条关于1.1.1.1/24的5类LSA。收到两条相同的LSA,此时R3会进行cost比较,由于R4传来的5类LSA开销更小,所以R3到达1.1.1.1/24的下一跳为R4,这样就产生了路由环路。
这里可能会纠结一个问题:就是R3为什么会选择R4,而不会根据接口G0/0/2到达ASBR-R2?
R2产生的LSA5只能在Area 0泛洪,不能再NSSA区域泛洪。那对于R3来说,它通过R2在Area0和Area 1内产生的LSA1得知R3是ASBR,从Cost上来说应该选择直连链路到达R2,但是因为R3是在Area 0得到的LSA 5,所以只会使用本区域的LSA1计算到达ASBR的路由,也是最终R2去往外部路由的下一跳是R4的原因。
我们在操作的时候,可以通过nssa suppress-forwarding-address将FA地址抑制。记得在Area下配置哦。
那以上这几种LSA是如何放环的呢?
Type1 LSA/Type2 LSA
区域内LSA1/LSA2,根据LSA1/LSA2而画出的区域内的graph可通过dijkstra算法构建出SPF树。SPF tree是从执行计算的当前节点,即root node到所有其他节点的最短路径成本树,建树的过程就消除了环路。
Type3 LSA
Type 3是在区域间传递网络路由信息的,特定区域结构(非0 Area围着Area 0)及区域边界处的水平分割规则限制从一个区域出来的LSA3不会流回到源区域,避免LSA3路由所致的环路。
Type4 LSA
放环的方式和LSA3一致;区别于LSA3的地方在于LSA3传达的是到目标网段的路径信息;而LSA4传达的是到目标路由器的路径cost信息
Type5 LSA
依赖于LSA3和LSA4来防止环路和选择最优路径。
LSA5在OSPF Domain内Flooding时,没有区域边界的限制,所以LSA类型3的放环规则对LSA5不适用。但LSA5能否进入路由表并导致环路,得依赖于类型3或类型4。
LSA5有Forwarding-Address字域,非0.0.0.0值参看对应的LSA3的选路信息;0.0.0.0值则根据LSA4来选路。只要LSA3和LSA4不致环路出现,LSA5就不致环路出现。
本文出自 “网工小白” 博客,请务必保留此出处http://xiaojiejt.blog.51cto.com/12536455/1941362
OSPF详解之三:OSPF LSA详解