LSA 101
 
LSA是LSDB建立的基础。每条LSA都包含序列号,校验和以及老化时间。一台路由器始发一个LSA,之后每产生一个该LSA的拷贝就在序列号上加1,序列号从0x80000001到0x7fffffff(不用考虑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拷贝的数据包给始发路由器,当邻居路由器收到该LSA,又刚好要向始发路由器发送自己的LSU的时候,隐式确认就显得很方便。
 
在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,N-bit=0则不支持。需要注意的是如果N-bit=1,那么E-bit必须为0。
 
E位,设置E-bit=0,表明该LSA始发于Stub区域路由器,如果是NSSA区域该位也设为0,其他类型区域始发的LSA都设置E-bit=1,另外可以在Hello中设置该位表明这个接口能接受和发送LSA 5,形成邻居时会检查该字段看对端接口是否属于相同类型的区域。
 
P位,P位和N位在同一字段内,如果该字段选择设置P-bit,可以告诉一个NSSA中的ABR将LSA 7 转换为 LSA 5,即将P-bit位从1设置为0。
 
 
LSA类型 
 
LSA 1:Router LSA,始发于Area内的任何路由器。
 
LSA 1列出了路由器的链路和接口,链路的出站Cost以及接口状态。LSA 1只在本Area内Flooding,本Area内其它路由器收到LSA1形成的路由条目以“O” 表示。简单来讲,LSA1描述自身的直连信息。
 
LSA 2:Network LSA,本Area内DR始发。
 
LSA2通告的对象:
 
该LAN 内所有的DRother和Area内的其他路由器(一个Area里面可能还有其他链路,比如点到点,或者另一个LAN,他们作为Area成员需要知道该LAN 的信息)。
 
LSA 2通告的内容:
 
该LAN 内所有和DR形成Full 邻接关系的路由器的Router-id 以及DR本身的Router-id,再就是该LAN的网络掩码(LAN中的各接口掩码肯定是一样的,否则无法形成OSPF邻居)。LSA2只在本Area内Flooding。
 
Attention:就字段分析,LSA1的重点在于链路ID和链路数据,针对不同的链路类型有不同的内容,而LSA2本身是广播型链路的产物,重点在于和DR相连的路由器ID以及该广播型链路的网络掩码。
 
路由器在SPF运算时,使用LSA1确定如何到达此LAN内的各个接口,使用LSA2确定此LAN的网络掩码。这就是LSA2要求被泛洪到整个Area的原因,也是LSA2最大的一个作用。
 
LSA1通告的链路类型                链路ID                                    链路数据
 
1 我连着点到点链路          邻居路由器的ID                   与其直连所用的本端接口IP地址
2 我连着传送网络              这个网络DR的地址              我和DR相连的那个接口的IP地址
3 我连着末节网络              这个网段的地址                    这个网段的子网掩码
4 我连着一条虚链路          虚链路对端的路由器ID        我的虚链路接口的MIB-II ifIndex
 
这里所说的传送网络在实际中就是广播型链路,而末节网络可能是所连的点到点链路,一个环回口代表的网段,或者一个实际连接的主机子网段。而MIB-II ifindex 就是虚链路所依托的实际链路的入口IP地址,虚链路的建立是在两台ABR之间选择一条Cost最低的路径。
 
Eg:  (Lo0:1.1.1.1)R1-.1----12.1.1.0----.2-R2(Lo0:2,2.2.2)

R1会向R2通告一个LSA1,其中包含3条自己有关的链路:

1.A Stub Network , Link ID = 1.1.1.1 & Link Data = 255.255.255.255
  
  R1认为学到一个末节网络(实际是通过Lo0模拟的主机地址)

2.Another Router(Point-to-Point),Link ID = 2.2.2.2 & Link Data = 12.1.1.1

  R1认为自己通过点到点链路连着另一个Router,它的ID是2.2.2.2,R1通过12.1.1.1这个接口和它相连。

3.A Stub Network , Link ID = 12.1.1.0 & Link Data = 255.255.255.0

  R1认为自己学到一个末节网络(实际是一条点到点的链路)
 
LSA 3:Network Summary LSA,ABR始发。
 
LSA 3通告的是ABR相连Area的链路信息,具体来讲就是将自己Area内的链路告诉Area 0,也将其他Area(包括Area 0)的信息传到自己的Area。其通告的链路是所有链路中Cost最小的,在路由表中以“O IA” 表示。如果LSA3通告的是一条缺省路由,那么链路状态ID和网络掩码字段中都将设为0.0.0.0。
 
Attention:如果在OSPF中执行了Area间汇总,那么LSA 3中通告的就是汇总路由而不是明细的,其实这里就应该说成是“路由”而不是“链路”,因为LSA 3本身通告的就是各网络如何可达,接收路由器并不明了该Area的拓扑结构,只是以DV的思想,将LSA 3中通告的链路加上自己到ABR(即ADV Router)的开销就放进路由表了。
 
LSA 4:ASBR Summary LSA,ABR始发。
 
LSA 4通告了ASBR的具体位置,是一条到达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都只能在单Area内泛洪。具体来看,LSA4就是在Area 0内泛洪让ABR都知道ASBR在哪;而LSA3这里要注意,比如Area 1的ABR将Area 1的路由信息通告进Area 0,该LSA3仅在Area 0内泛洪,Area 2会收到这个LSA3,但不是将其直接发送到Area 2,而是新生成一个LSA3,因为不仅要加上自己到那个ABR的链路开销,而且ADV Router也要改为自己,新的LSA3会进入到Area 2并泛洪开来,所以还是遵守了LSA 3的泛洪原则。从一个侧面也可以看出,OSPF进行Area间路由是典型的距离矢量的行为。
 
LSA 5:AS External LSA,ASBR始发。
 
LSA 5通告了与ASBR直连的其它AS的路由信息,不同于BGP中AS的概念,这里指IGP区域。LSA 5被Flooding 至除Stub,Total Stub,,NSSA以外的所有Area,是唯一的一个不与任何Area相关联的LSA通告。
 
LSA 5形成的路由条目以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 External LSA,由NSSA区域的ASBR始发。
 
该LSA内容和LSA5基本一样(只有转发地址字段不同),关键是LSA7只在始发该LSA的NSSA区域内Flooding,并在ABR转换成LSA5,LSA 7形成的路由条目以N1或N2表示。
 
事实上LSA7和LSA5内容一样,只不过泛洪区域有限制所以要标记一下,而且是可以相互转换的。在NSSA区域中,ASBR将外部路由信息封装进LSA ,设置其P-Bit 位为1,使其在NSSA区域里泛洪。在ABR那里会将P-Bit 位改为0,由LSA 7转换为LSA 5,再传到OSPF其他的Area。同样的,如果有别的Area通告进来的外部路由要注入到这个NSSA区域中,在该NSSA区域的ABR那里会将LSA 5转换为LSA 7。
 
 
OSPF区域
 
OSPF 特殊区域类型有四种:Stub ,Total Stub ,NSSA 和 Total NSSA 。其本质都是“LSA精简的Area ”。当一个Area 被定义为Stub区域时,该Area 内的路由器所发送的hello数据包都会将E-Bit位设为0,而普通区域的应该是1,所以区域内的所有路由器都敲入area 1 stub 这样的命令才能正常形成邻接关系。
 
LSA的精简决定了Stub区域在接收LSA时会有所取舍,但对本Area信息的向外通告不会有任何影响,因此别的Area对Stub区域的信息是完全了解的。像是要成为Total Stub区域只需要在ABR上加上关键字no-summary,因为阻止的是ABR向Stub区域内发送LSA3。
 
Stub区域中不通告AS外部路由,也无法实现重发布,但是有OSPF Area内和Area间的完整信息,并通过一条默认路由O*IA 保持和AS外部的联系,该默认路由通过LSA 3学到。Stub 区域设计是出于对该区域路由器性能及路由条目需求的考虑而进行的LSA精简,但不可避免的引起信息不对称,进而出现次优选路。
 
Total Stub 比 Stub “末节”得更为彻底,连OSPF Area间的路由也不要,只有本Area 的信息。ABR将默认路由注入Total Stub 区域,不仅外部路由要通过它走,Area间的路由也要通过它走,同时ABR会阻止LSA3 & 5 & 7 在Total Stub 区域内泛洪 -- 除了通告默认路由的那一条LSA3。
 
普通区域的Router 进行Area 间的选路原则为:
 
路由总Cost = 本Router到ABR的Cost + ABR到目的网络的开销    Cost最小的路由放进路由表
 
而设置为Total Stub 的区域的Router 选路原则为:
 
路由总Cost = 本Router到达ABR的Cost         Cost最小的路由放进路由表
 
 
NSSA是当Stub区域中存在ASBR时形成的区域,本身Stub不能有AS外部路由,也不能进行重发布,但无奈自己成为了OSPF和其它IGP通信的边界,变得 Not So Stubby ,于是形成NSSA 区域,在NSSA区域内注入的外部路由以LSA 7传递,并在ABR处还原为LSA 5。
 
简单来讲:  NSSA = Stub + ASBR      Total NSSA = Total Stub + ASBR 
 
在Stub ,Total Stub ,NSSA 和Total NSSA 中只有NSSA不会自动注入默认路由,不过可以用命令实现: area 1 nssa default-information-originate ,这样即使是其他Area注入的外部路由也可达,基本上就是can go anywhere。
 
如果NSSA区域的ABR同时也是一个ASBR,会将外部路由以LSA 7 的形式注入到NSSA区域当中,那么针对这种特殊情况可以用命令 area 1 nssa no-redistribution 来阻止外部路由的注入。
 
外部路由在NSSA中以LSA 7存在,在ABR那里会转换为LSA 5向Area 0通告,我们可以用命令 summary-address prefix mask not-advertise 针对具体的条目控制LSA转换的过程,如果不用关键字 not-advertise 这条命令是用来外部路由汇总的,在ASBR上进行。