LSA 101
 
LSA是LSDB建立的基础。每条LSA都包含序列号,校验和以及老化时间。一台路由器始发一个LSA,之后每产生一个该LSA的拷贝就在序列号上加1,序列号从Ox8 0000001到0X7 fffffff(不用考虑8和7的大小),数值越打视为越新。LSA存放在LSDB中每5mins就会进行一次校验,以确保改LSA没有损坏。一条LSA的老化时间为1h,始发路由器发出一条LSA时会将其时间设置为0,每经过一台路由器就增加一个由InfTransDelay设定的秒数(Cisco路由器上默认为1),当LSA在LSDB中驻留时,老化时间也会逐渐增大。
 
当一条LSA在LSDB中一直没有被新的LSA实例刷新直到老化计时器超时,就会从本地的LSDB中清除,但是这个动作不会影响到别的路由器,在OSPF网络中只有始发路由器能够提前使该LSA老化,即有意识的清除该LSA,具体动作是将该LSA的老化时间设为最大然后再网络中泛洪出去。
 
LSA的刷新时间是30mins,关于刷新机制是个值得关注的问题。如果每个LSA都关联一个独自的重刷新计时器,这样会使链路带宽的利用没有效率,如果统一为一个计时器,那么每隔30mins都会产生一个流量和CPU利用率的高峰。作为折衷的的解法,引入LSA组步调机制,即每一条LSA依然保持各自的重刷新计时器,不过在超时的时候,会引入一个时延(缺省为240s)来推迟这些LSA通告泛洪的时间,并在这个时间段内将更多的LSA通告编为一组,使一个LSU可以携带更多的LSA,如果LSDB非常大,那么减小这个时延会比较好,而如果LSDB较小的话,增大这个时延会更有效率,该组步调计时器的范围从10到1800s。
 
每一个LSA都必须要得到接收的路由器确认,确认分为显式确认和隐式确认,显示确认就是用LSAck给予回应,LSAck中只含有该LSA的头部,因为这样就足够了;而隐式确认是发送包含该LSA拷贝的数据包给始发路由器,这样当邻居路由器正好要向始发路由器发送更新数据包的时候,隐式确认就显得很有用。
 
在OSPF的Hello,DBD和LSA中都有一个Option字段,即可选字段。下面重点说一下LSA其中的一些位:
 
DN位,用于基于MPLS的三层×××技术。当一条路由通过OSPF从某个客户网络学到,就会穿过使用多协议BGP的×××被通告到网络对端,接着再通过OSPF被通告回客户网络。通告回的OSPF网络会被重新分配到×××运营商网络,这样就产生环路。而DN位就是用来避免环路,当LSA 3 & 5 & 7设置了DN位后,接收路由器就不能用该LSA进行SPF计算。
 
O位,用来表明始发路由器支持Opaque LSA,即LSA 9 & 10 & 11,可用做MPLS网络应用的流量工程参数。
 
N位,设置N-bit=1,表明该LSA支持NSSA外部路由,即LSA 7,该路由器处于NSSA区域;N-bit=0则不支持,需要注意的是如果N-bit=1,那么E-bit必须为0。
 
E位,当始发路由器既有接受AS外部路由的能力,骨干区域和普通区域的路由器发的LSA的E-bit=1,而Stub区域的E-bit=0,另外可以在Hello中设置该位表明这个接口能接受和发送LSA 5。
 
P位,P位和N位在同一字段内,如果该字段选择设置P-bit,可以告诉一个NSSA中的ABR将LSA 7 转换为 LSA 5,即将P-bit位从1设置为0。
 
LSA类型
 
LSA 1:路由器LSA,Area内任何路由器都发送的LSA,用于通告本路由器所连接的链路状态及代价,只在本Area内Flooding,本Area内其它路由器收到LSA1形成的路由条目以"O”表示。简单来讲,LSA1描述自身信息,当一台OSPF路由器发出一条LSA1 ,就是在说:“我是X,我连着Y,Z等等。”
 
LSA 2:网络LSA,本Area内DR始发。LSA2通告的对象是该广播型链路所有的DRother和其他OSPF路由器(这个Area内还可能有其他类型的链路类型,比如点到点,或者另一个广播链路,他们同样需要知道这个广播链路的信息),通告的内容是该广播链路的成员和与这个链路相连的所有路由器。LSA2只在本Area内Flooding。
 
Attention:就字段分析,LSA1的重点在于链路ID和链路数据,针对不同的链路类型有不同的内容,而LSA2本身是广播型链路的产物,重点在于和DR相连的路由器ID以及该广播型链路的子网掩码。
 
路由器在SPF运算时,使用LSA1确定如何到达此LAN内的各个接口,再使用LSA2确定到此链路的掩码。这就是为什么LSA2要求被泛洪到整个Area的原因,也是LSA2最大的一个作用。
 
LSA1通告的链路类型                链路ID                                    链路数据
 
1 我连着点到点链路          邻居路由器的ID                   他和我相连的那个接口的IP地址
2 我连着传送网络              这个网络DR的地址              我和DR相连的那个接口的IP地址
3 我连着末节网络              这个网段的地址                    这个地址的子网掩码
4 我连着虚链路                  虚链路对端的路由器ID        我的虚链路接口的MIB-II ifIndex
 
这里所说的传送网络和末节网络在实际中就是指的广播型链路和点到点链路。
 
LSA 3:网络汇总LSA,ABR始发,LSA3通告了与ABR相连网络的所有链路状态,通过骨干区域Area0(Transmit Area)发送到其它Area,LSA3宣告的链路代价是所有链路中代价最小的条目,在路由表中以“O IA”表示。如果LSA3通告的是一条缺省路由,那么链路状态ID和网络掩码字段中都将设为0.0.0.0。
 
Attention:如果在OSPF中执行了域间汇总,那么LSA 3中通告的就是汇总后的条目而不是明细路由,也就是说汇总是针对LSA做改变的。
 
LSA 4:ASBR汇总LSA,ABR始发,LSA4通告了ASBR的具体位置及可达性,所有为一条主机路由。
 
事实上LSA3和LSA4都由ABR始发,所以报文格式是相同的,只不过有几处字段内容不一样,在“链路状态ID”这个字段中,LSA3通告的是网络或子网的IP地址,而LSA4通告的是ASBR的路由器ID;而“网络掩码字段”对LSA4没什么意义,设置为0.0.0.0。
 
一台Router成为ABR的前提是必须有运行OSPF进程的接口与Area 0直连,否则不会产生LSA 3 和LSA 4,也就无法完成ABR的任务,解决办法一般是通过虚链路。
 
Attention:LSA3和LSA4都只能在单区域内传播。具体来看,LSA4就是在Area 0内泛洪让ABR都知道ASBR在哪;而LSA3这里要注意,比如Area 1的ABR将Area 1的路由信息通告进Area 0,该LSA3仅在Area 0内泛洪,Area 2会收到这个LSA3,但不是将其直接发送到Area 2,而是根据内容自己新生成一个LSA3,这样ADV Router就发生了变化,新的LSA3会进入到Area 2并泛洪开来,这样就保证LSA3泛洪区域的原则。从一个侧面也可以看出,OSPF进行Area间路由是典型的距离矢量的行为。
 
LSA 5:AS外部LSA,ASBR始发,LSA5通告了与ASBR直连的其它AS,不同于BGP中AS的概念,这里只运行其它IGP的区域,LSA5被Flooding至除Stub,Total Stub, NSSA以外的所有区域,是唯一的一个不与任何Area相关联的LSA通告。
 
该LSA形成的路由条目以E1或E2表示(默认为E2),可以通过命令改为E1类型 redistribute igp subnets metric-type 1 。
 
E2 Cost = ASBR到AS外目的网络的Cost
 
E1 Cost = 本地到ASBR的Cost + ASBR到AS外目的网络的Cost
 
Attention:当OSPF路由器获得一条LSA 5,在装进路由表之前会检查“转发地址”是否可以通过Area内或Area间路由可达,若不可达,不会装进路由表。
 
LSA 7:NSSA外部LSA,连接到NSSA区域的ASBR始发,该LSA内容和LSA5基本一样(只有转发地址字段不同),关键是LSA7只在始发该LSA的NSSA区域内Flooding,并在ABR转换成LSA5,该LSA形成的路由条目以N1或N2表示。
 
事实上,LSA7和LSA5内容是一样的,只不过由于泛洪区域的限制所以要进行必要的标记。在NSSA区域中,ASBR将外部路由信息封装进LSA7,并设置其 P-Bit 位为1,使其在NSSA区域里泛洪,然后在ABR那里将 P-Bit 位改为0,即将LSA 7转换为LSA 5,再传到OSPF其他的Area。
 
OSPF区域
 
OSPF特别的区域类型有四种:Stub ,Total Stub ,NSSA 和 Total NSSA 。其本质都是末节区域。当一个Area被定义为Stub区域时,该区域内的路由器所发送的hello数据包都会将E-Bit位设为0,而普通区域的应该是1,所以区域内的所有路由器都敲入 area 1 stub 这样的命令才能正常形成邻接关系。
 
Stub区域中不通告AS外部路由,也无法实现重发布,只有OSPF自己的信息,并通过一条O*IA的默认路由保持和AS外部的联系,该默认路由通过LSA3学到。
 
Total Stub 比 Stub "末节"得更为彻底,连OSPF Area间的路由也不要,只有本Area 的信息,注入的默认路由不仅外部路由要通过它走,Area间的路由也要通过它走,而ABR就成为这个Area的网关。Total Stub 的ABR会阻止LSA3 & 5 & 7 向Total Stub 区域内洪泛 -- 除了通告默认路由的那一条LSA3。
 
NSSA是当Stub区域中存在ASBR时形成的区域,本身Stub不涉及AS外的路由,也不能进行重发布,但无奈自己成为了OSPF和其它IGP通信的边界,所以就变得 Not So Stubby ,于是形成NSSA 区域,在本区域内注入的外界信息以LSA7传递,并在ABR处还原为LSA5。
 
简单来讲:  NSSA = Stub + ASBR      Total NSSA = Total Stub + ASBR 
 
在Stub ,Total Stub ,NSSA 和Total NSSA 中 只有NSSA没有默认路由注入,要实现注入可以用命令: area 1 nssa default-information-originate ,这样通过其他Area的ASBR传递进来的AS外部路由就可以学习到了。同时NSSA区域也可以防止AS外部路由注入,用命令 area 1 nssa no-redistribution 实现。
 
Stub 区域设计是出于对该区域路由器性能及路由条目需求的考虑而进行的LSA精简,但不可避免的引起信息不对称,进而出现次优选路。
 
普通区域的Router 进行Area 间的选路原则为:
 
路由总Cost = 本Router到ABR的Cost + ABR到目的网络的开销    最小Cost的路由放进路由表
 
而设置为Total Stub 的区域的Router选路原则为:
 
路由总Cost = 本Router到达ABR的Cost    最小Cost的放进路由表