OSPF的LSA报文解析(更新中)

LSA头部

1、链路状态老化时间:这个标识该LSA存在时间,当时间超过1800s的时候路由器会发出LSR报文重新请求。

2、可选项:ospf里面的一些特性选项,先忽略

3、链路状态类型:标识该LSA的类型

4、链路状态ID:在type1LSA中填入的是路由ID,type2LSA中填入的是发出该LSA的IP地址,type3LSA中填入的是想要传播的路由条目的相关网络号

5、通告路由器:通告该LSA的路由ID

6、链路状态序列号:代表该LSA更新的次数,每次LSA的老化时间到期后就会进行更新,然后该序列号就会加1

7、链路状态校验和:起校验作用

8、长度:代表该块内容的长度

type 1 LSA

V位:代表该路由器是虚链路的其中一端

E位:代表该路由器是ASBR

B位:代表该路由器是ABR

链路数量:代表通告该LSA的路由器上参与OSPF运算的链路的数量

链路ID:这项填入的内容根据这张表

链路数据:这项填入的内容根据上面的表

链路类型:表示通告该路由器上参与OSPF运算的链路的类型,类型有transit,stub,其中transit代表该链路连接的是一个广播网络,stub代表该链路连接的是一个末梢网络,如下连一个局域网,或是一个环回口也将被视为末梢网络

TOS的数量:不用管

度量值:这个代表着代表着去到通告该LSA的路由器的度量值,该度量值是使用参考带宽1*10^8除以接口带宽得来的,如果该type1LSA没有经过任何路由器的转发,那么它的度量值都是1,如果有经过转发还要加上转发的度量值

type1LSA:

我们知道一个路由器可能处在不同的区域当中,比如一个接口在区域1,另一个接口在区域2。路由器在区域内部分享自己的type1LSA的时候,从每个接口上发出的都是一样的。因为type1LSA仅仅说明了该路由器上面的链路数量,链路类型,以及度量值,并没有因为区域的不同而产生不同变化的信息包含在type1LSA中。

我们来看一个type1 LSA报文的截图

我们把这个报文分成两个部分去看待,第一部分是固定包头,其中链路状态ID代表着宣告该LSA的路由ID,第二部分是描述宣告该LSA的路由器上参与OSPF运算的链路的具体信息,一些关键的信息wireshark已经帮我们筛选出来了,第一个就是链路类型,可以看到宣告该LSA的路由器上面参数与OSPF运算的链路有三条,它们的链路类型分别是一条运输网络和两条末梢网络,说明该路由器有一条链路是连接到广播网络,同时还有两个末梢网络,我们具体看末梢网络的部分,发现有一个末梢网络的链路ID是一个具体的IP地址,而且它的链路数据是255.255.255.255,这可以说明这个末梢网络是一个环回接口, 而另一个则末梢网络的链路ID则是一个网段,链路数据是255.255.255.0,从这里我们可以得知这条末梢网络是下联一个局域网,或者说是下联一个网段。type1LSA是lsdb一个十分重要的组成部分,它帮助路由器还原一个区域内部的拓扑,但是如果要还原一个区域内部的路由还需要type2 LSA,这里我们先放着,但是我们经过一个type1LSA报文的分析也能知道,一条type1LSA就能将一个路由器上有多少条参与OSPF运算的链路,链路的类型是什么,度量值是多少,宣告该LSA的路由器的路由ID是多少这些信息告诉我们。其实如果要将type1LSA抽象成一个物品的话,可以将它比作一个从一个完整拓扑上扣下来的一块小拼图,拆下来的时候它与其他路由器相连的链路也保留了下来,我给大家画一下大概是怎样的:

 其中被拆下来的残留的链路就是type1LSA中的相关的链路信息,只有集齐了所有的type1LSA才能还原处一个区域的完整拓扑。但是大家拿到拼图的时候肯定是一连懵逼的,因为如果硬拼的话肯定也是一头雾水,所以就需要type2LSA的帮助

type2LSA:

在type2LSA中链路状态ID代表该广播网络中DR接口的IP地址

网络掩码:代表着该网段的掩码

相连的路由器的Route ID:就是通告该LSA的路由器接口的OSPF邻居的路由器ID

我们前面说到type2LSA是帮助恢复区域内拓扑的帮手,那么它是如何帮忙的,我们知道我们现在学习的网络普通是交换机路由器根据TCP/IP协议族组建的网络。如果我们拿到type1LSA的拓扑拼图,如果是我肯定会先从路由器的末梢网络下手,先确定一下该网络的末梢网络的分布然后再确定广播网络或者说传输网络是什么样的,在这里我再解释一下什么是广播网络或者说传输网络,一个路由器的接口如果不是与其他参与OSPF运算路由器连接的话,那么该路由器接口的链路类型就是末梢网络,如果是的话那么就是广播网络,或者说传输网络。其实拓扑的一个区域的拓扑还原的难点就在于广播网络的还原,因为路由器是连接在广播网络上,所以一个参与OSPF运算的路由器并不知道它连接了多少台同样参与OSPF运算的路由器,因为一个路由器可以与一个交换机相连,然后其他路由器再与这个交换机相连,这就形成了多台交换机两两相连的局面,这同样也是为什么OSPF网络要进行DR和BDR选举的原因。

我们现在想象一下如果我们只有type1LSA那么我们将如何还原一个区域内部的网络拓扑,第一步先根据type1LSA确定各台路由器上的末梢网络,然后再确定广播网络,现在看一下type1LSA留给我们哪些关于广播网络的信息(不考虑点对点链路):

1、宣告该LSA的接口连接的广播网络上的DR接口的IP地址

2、宣告该LSA的接口的IP地址

那么如果要还原拓扑,我们必须挨个搜索lsdb中type1LSA中的链路类型为transit的信息,也就是这条信息

 如果某个路由器的type1LSA中关于transit的链路信息的DR IP地址(链路ID)和另一个路由器的tyepe1LSA中关于transit的链路信息的DR IP地址(链路ID)相同,那么就可以说明这两台路由器的链路是互相连接在同一个广播网络的,但是如果一个广播网络中存在多台路由器,那么可以想象到其信息的查找和匹配将会是多么的繁琐,所以就引入了type2LSA,它记录了一个广播网络中DR接口的IP地址,通告该type2LSA的路由ID,以及该路由器OSPF邻居的路由ID,该广播网络的掩码,而且如果每个路由器都产生这样具有多个重复信息的type2LSA未免没什么必要,所以type2LSA只有广播网络中的DR产生。于是我们就可以这样还原广播网络:

1、找到DR产生的type2LSA,然后确定DR在该广播网络上的接口IP,以及DR在该广播网络上的OSPF邻居,

2、根据邻居的路由ID去lsdb中找到它们的type1LSA,然后查看各个路由器的type1LSA中到底是那条链路连接到该广播网络

3、最后再通告DR产生的type2LSA确定该广播网络的掩码,于是一个网络就被还原出来了

如果没有type2LSA的话广播网络的还原将多么麻烦?

我们知道广播网络最大的特点就是多点接入,以及两两互访,那么如果仅仅依靠type1LSA去还原广播网络,那么信息比对的次数将会是(路由器个数-1)的阶层,比如有4台路由器的type1LSA,那么信息比对的此时就是(4-1)的阶层,也就是3+2+1=6次,如果是5台路由器,那么比对的次数就变成10次了,如果是6台路由器就是15次,而且这还是每台路由器都仅有一条链路且接入的是同一个广播网络的情况,如果一台路由器上有多条接入广播的网络的链路的话,那其比对次数和算法将会是十分复杂的,而且每次比对都先要查询某个type1LSA上有几条接入到广播网络的链路,然后还要去不断地比对其他type1LSA上的链路信息,连我说的人都嫌麻烦了更不要说实现了。

如果将上面的过程抽象出来的话我想应该是这样的:

还是拿拼图做比喻,如果没有type2LSA那么拓扑的还原就好比大家随便拿拼图去比对,看看是否能够对的上,如果对的上就拼在一起。在加入了type2LSA之后,拼图就好像是说明书直接告诉你哪些是拼在一起的,你直接将拼图组合的范围进行了十分准确的缩小。最后只要将小范围的拼图进行组合即可。

type3LSA

 如果一个网络只有一个区域,那么每个路由器上都要维护非常多的type1和type2LSA,那么这对一个网络来说肯定是十分不友好的,因为大量的性能损耗在路由协议上。所以人们将网络拓扑人为地分为不同的区域,然后各个区域仅仅维护自己的type1LSA和type2LSA,这样就在一定程度上减少了路由器的性能损耗,只不过在区域与区域之间的区域路由器要维护多个区域的路由信息,但是这样做也是十分划算的。但是仅仅定义了区域还不行,如果区域与区域之间连接成环形也是我们讨厌的,因为我们已经多次体会过在网络中出现环形的危害,所以认为规定有一个主干区域,其他的区域都是非主干区域。然后这样约定路由器接口可以将自己所处的区域内路由传递给主干区域去学习,而不能将从其他区域学习到的区域外路由传递给主干去学习,但是主干无论是区域内路由还是区域外路由都可以给非主干学习,下面举个例子说明一下什么是区域内路由和区域外路由:

比如这个拓扑,中的粉色区域是主干区域,主干区域的两边都是非主干区域,左边的非主干区域号是1,也就是区域1,右边的非主干区域号是2 ,也就是区域2,中间是主干区域,也就是区域0。

区域1只能将区域1内的路由给区域0去学习,也就是说区域1的路由器只能将区域1的路由给主干区域学习,对于区域1的路由器来说,区域1内的路由就是区域内路由,而对于区域2的路由器来说,区域1的路由就是区域外路由。

然而为什么要这么做呢?一切的一切都是防止路由学习的准确性,保证主干区域都是学习到的都是别人传递过来的一手的最新的路由,而不是经由别人之手,而且不知道转发了多少次的n手路由。因为主干区域十分的重要,所有非主干区域之间的通信都必须要经过主干区域,所以保证主干区域的正确性是十分重要的。

说了这么多那么区域间该怎么互相学习路由呢?

ABR也就是区域边界路由器,它位于不同区域的中间,既是一个区域的成员,也是另一个区域的成员,它通过整理lsdb并生成去往其所在区域内部的路由并将这些路由以type3LSA的形式注入到非骨干区域。这就是区域间路由的学习方式.

下面是type3LSA的报文

在type3LSA中链路状态ID填入的内容是对应路由条目的网络号

1、网络掩码:路由条目的网络掩码

2、度量值:路由条目的度量值,这个值经过一个路由器之后就需要加上参考带宽/接口带宽的度量值

3、TOS:不管他

4、TOS度量值:不管他

所以区域间路由的学习就有点像RIP了,不过RIP的路由信息是每经过一个路由器之后就将度量值无脑加1,而没有考虑接口的带宽,但是OSPF在这里进行度量值的增加的时候,所增加的值是

参考带宽/接口速率。

ABR将type3LSA注入其他区域之后,type3LSA在其他区域进行转发学习,同时type3LSA在转发的过程中还进行度量值的累加,而且度量值还是以接口带宽为基础计算得来的,这样学习到的路由条目就更加的合理科学。

路由器到底是如何根据type3LSA生成路由条目的?

type3LSA报文中的有一项是通告路由器,该项填入的是通告路由器的路由ID,区域边界路由器在注入type3LSA的时候,这一项填入的就是通告该type3LSA的路由器的路由ID,比如区域1的区域边界路由器A在type3LSA的通告路由器这一项填入自己的路由ID,于是区域A所有路由器收到的type3LSA上面的通告路由器这一项上面写的都是路由器A的路由ID。然后其他路由器在接收到区域边界路由器的type3LSA之后会根据自己的lsdb去计算去往边界路由器的最佳路由,于是如何去往其他区域的问题就转变为如何去往区域边界路由器的问题。

type5LSA

type5LSA是在当引入非OSPF协议路由的时候引入的LSA,下面是它的报文结构:

 其中链路状态ID填写的是引入的外部路由的网络号,通告路由器填写的引入该外部路由的路由器ID。

1、网络掩码:外部路由的掩码

2、E位:代表着度量值的计算方式,如果E位为1那么度量值的计算方式为Metirc-type2:度量值在所有路由器上都是固定的,都是引入外部路由的时候约定的cost,如果E位为0那么度量值的计算方式为Metric-type1:引入外部路由约定的cost+接收该LSA的路由器到ASBR的cost

3、度量值:在引入外部路由的时候规定的度量值

4、转发地址:表示要将去往该外部路由的流量转发到哪里,如果要指定那么就流向这个IP,如果没有就流向通告该type5LSA的路由器上,也就是ASBR上

5、外部路由标记:外部路由的标记,用于策略路由

6、TOS:不管他

7、TOS度量值:不管他

type5LSA可以在非特殊区域传播,其实就是一般的区域上面都可以。type5LSA和type3LSA十分的相似,只不过type5LSA增加了两项,一项是转发地址,还有一个是外部路由标记。

type4LSA

type4LSA是为了帮助那些不知道如何去往ASBR路由器而出现的LSA,无论是type3LSA还是type5LSA,路由器接收到这两种LSA的时候,都是依靠这两个LSA中的“通告路由器”这一项去进行计算的,它们先确定目标路由器的路由ID,然后根据lsdb进行最短生成树的计算,但是现在有一个问题,type5LSA中的“通告路由器”这一项记录是某个区域中的路由器的路由ID,这对于非该区域路由器来说简直就是一个完成不认识的人,于是type4LSA就来帮助type5LSA了,type4LSA和type3LSA的结构一致,但是链路状态ID那一项填入的内容是宣告type5LSA的路由器的路由ID,它其实和type3LSA的功能差不多,type4LSA在经过某个区域边界路由器的转发之后,该区域边界路由器就会将自己的路由ID写到报文中通告路由器那一项,然后别人收到这个type4LSA之后,就知道去往type5LSA上对应的ASBR路由器应该怎么走,其实还是将怎么去ASBR的问题转变为怎么去转发这个type4LSA的ABR的问题。现在路由器既通过type5LSA知道了外部路由的网络信息,也通过type4LSA知道了ASBR应该怎么走,那么路由器就会通过lsdb计算出去往发布type4LSA的ABR的最佳路由,这个路由就是去往外部路由的最佳路由。

为什么type5LSA不像type3LSA一样,用报文中的一项位置去记录转发该LSA记录的ABR的路由ID呢?这样不就可以不用使用type4路由了吗?

我个人觉得主要的原因是报文结构,估计背后的算法就是从头部的“通告路由器”那一项然后再结合lsdb去进行最短生成树,所以如果改变之后可能会很麻烦估计,所以宁愿多使用一个type4LSA去作获取信息的媒介。

type5LSA中的E位若设置为0,那么它是如何获取到自身到AS边界路由器的cost值并最终计算出路由表上的度量值的呢?

type5LSA中的度量值记录的并不是AS边界路由器到接收该LSA的路由器的cost,它记录的是引入该外部路由的时候认为规定的cost,也就是说无论type5LSA如何转发,这个值都是不变的,那么这个cost值从何而来?这个值来自type4LSA中记录的度量值,所以如果路由器接收到tyep5LSA中的E位为0,那么它会将type4LSA中的cost值与type5LSA中的度量值相加,最为路由表中最后的度量值。

  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mllllk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值