引言
之前讲过的是OSPF简单特性,理解起来很简单,但是OSPF协议深层很全面,可以说,如果懂了OSPF协议,相当于链路状态协议也能一通百通了。下面是一些重点注意事项和知识点。
1.在大型网络中,OSPF的SPF计算中的Cost值要保证其计算一致性,防止百兆与千兆带宽的计算结果对比。
2.挂靠在区域0和区域X之间的路由器是ABR,其中里面有两个表(含有区域0和区域X的路由信息),因此可以进行路由互导(将区域0的路由器给予区域X,ABR可产生3类LSA)区域间路由也可以汇总,减少区域间路由传递数量。
其中ABR分为真ABR和假ABR
真ABR:邻居关系FULL;假ABR:邻居关系没有到达FULL且只是把接口宣告进了Area 0
注:LSA仅能在FULL下传播,TWO-WAY是交互hello,FULL下可交互所有报文
3.在MA网络中,DR仅有一个,BDR可以没有,其余R为DR other。选举比较OSPF接口优先级,接口优先级默认为1。接口优先级高则为DR否则比较RID,大的优先。DR other会维持在TWO-way,DR与BDR建立FULL。传递LSA给DR和BDR
注:DR的选举是基于MA网络,它是接口的概念,而不是基于区域。
4.DD报文会在发送时携带一个序列号SN,当接受的路由器收到后会回复一个相同的序列号表示已经收到了。
5.LSU中包含完整LSA而DD报文和LSR都是携带LSA的报头。LSACK也可做确认表示收到了LSA
6.OSPF中,hello报文包含的东西很多,hello之间还要进行协调。hello报文中包含:version number :版本号(hello版本号需要一致);Router ID:路由器ID(不能冲突);Hello与dead时间(要一致,4倍时间关系);认证,(认证要相同)
一,OSPF特点总结
OSPF工作原理属于IGP,是链路状态协议,端口号89,华为的OSPF的默认管理距离为10(域间管理)外部管理距离为150。思科则为110。采用SPF算法,可以快速响应网络变化并进行信息的同步。支持负载分担,触发式更新
二,OSPF的状态
运行OSPF时,除了骨干区域外,还有常规区域,STUB区域,NSSA区域,他们都为非骨干区域。
Hello报文中有一个字段option。其中有两个参数N和E。
N位:只在Hello数招包中使用(即在hello包里代表N位)代表nssa区城。N=1表明路由器支持7类LSA。N=0表明该路由将不接收和发送NSSA LSA
E位:当始发路由器具有接收OSPF区域外部LSA AS external LSA)能力时,该置位位。
当处于常规区域的时候,N会变为0,E为1;当为Stub区域时,E为0,N为0;若为NSSA区域时,E为0,N为1.不同的类型区域发送的hello报文时option不一样。因此交互的时候,区域要一致,不能混用。(后面会提到NSSA和STUB)
建立完TWO-Way以后,完成了DR和Bdr的选举,开始通过DD报文进行主从的选择,通过Master控制Slave。其中需要考虑MTU一致性检测,一旦开启MTU,会停在Exstart状态。
为什么要选举主从?因为OSPF基于IP协议工作的,它无可靠的传输能力,需要DD报文选举主从达到一种有序性,可靠性的发送。
OSPF一共有8种状态
Down:路由刚被宣进到接口,还无任何报文的发送与接收。
attempt:它工作在NBMA网络中,NBMA网络不支持组播报文发送,仅支持单播,这就需要进行目的接口在NBMA网络中运行OSPF的环境下更改peer,指定hello的发送。
init:单方面通,我通过邻居的路由器获取到了Hello报文,但是在我的neightbor字段中没有我的路由器ID,意味着我发送的报文不知道它能否接受到,但我能收到它的报文。
Exstart:DD报文确定master,master包含路由器ID,谁的RID大,谁就是master,DD报文有三个字段状态:flags(每个报文都有),flag变为1(当我是master时)flag变成0x7(发出报文告诉所有路由器我是master),当发现老大,其余成为slave,并映射master序列号。
Exchange:master主动向对方发送带有LSA的DD报文,随后进行确认,完成所有DD报文交互。
loading:LSR,LSU,LSack交互。
full:完成LSDB数据库同步
为了防止LSA泛红发送导致广播风暴,因此通过比较LSA的新旧来选择LSA,如果没有,LSA则请求并接受,若有新的LSA到来则比较序列号,大的序列号优先。新的会接受后并进行同步。如果我的LSA更好则会进行反向同步(把我的LSA给你)LSA一样则丢弃,避免环路。序列号最小为0X80000001最大为0x7FFFFFFF
三,OSPF的LSA
ospf有11种LSA,其中8—11种不常用,剩下需要知道
一类LSA:Router LSA(路由器LSA)
二类LSA:Network LSA(网络LSA)
三类LSA:Summary LSA(汇总LSA)
四类LSA:Summary LSA(汇总LSA)
五类LSA:Autonomous System external LSA(自治系统外部LSA)
六类LSA:multicast OSPF LSA(组播LSA)
七类LSA:defined for not-so-stubby Areas Lsa(非末节区域LSA)
3.1 关于OSPF链路分类
我宣告的接口以链路来实现。一类是骨干链路,一类是stub链路
其中骨干链路分为:
TransNet——选择了DR和BDR
P-to-P——点到点链路
Virtual——虚链路
P-to-P——点到点链路:它需要两个链路来描述,如果R1-R2连接中仅使用serial线也就是PtoP链路仅在骨干链路中描述的话无法了解整个网络路由情况。因此需要Stub-Link一起计算。
(PtoP是拓扑的连接信息,而Stub-Link用来做路由计算)
但是TransNet不行,他仅有本机自身连接网络的接口的地址和DR的接口地址。针对整个网络而言,1类网络太垃圾,不能描述整个MA网络的信息,需要其他的LSA配合。
3.2 Link state ID和Adv Router
Link state ID(它是LSA的名字),Adv Router(始发者路由器ID)
1类LSA的Link state ID和Adv Router均为始发者路由器ID
2类LSA的Link state ID为DR接口的IP地址,Adv Router为DR的路由器ID
3类LSA的Link state ID为路由前缀,Adv Router是ABR的RID
4类LSA的Link state ID为ASBR的路由器ID,Adv Router为ABR的RID(它的内容仅有该ASBR的路径度量值)
5类LSA的内部包含了三个重要字段:Tag标记,Forwarding Address(FA地址)和Metric Type
Tag——一个数字,作用是为了可以抓取外部路由
Metric——度量值类型(以0和E来标识:当为0和E2时为二类度量值类型,表示内部度量值不会再累加;当为0和E1为一类度量值类型,表示内部度量值还会累加;后者优先级高于前者,0E2先对比外部度量值,一样的话则比较内部,小的优先。0E1比较度量值之和,0E1整体优于0E2,但是通常默认为0E2。)
FA地址——远程下一跳(5类LSA携带FA地址,但是有三个条件:1.ASBR要把连接下一跳的外网接口宣告进OSPF;2.接口的OSPF网络类型不能为PtoP;3.接口不能为被动接口)
如果我想要下一跳地址作为外网,需要FA地址,我将外网地址添加进入FA地址中,并发给其余的路由器。告诉他们想要去外网,发给这个远程下一跳。当然也要看FA是否可达,可达就可用,否则不会添加进路由表。
3.3 一类LSA
路由器运行OSPF一定产生LSA,而router LSA表示在一个区域中,无论我宣布多少个接口,都只会产生一种LSA;传递范围是该区域的所有路由器;它包含路由器的描述和宣告进区域的所有路由信息区域的接口。
3.4 二类LSA
DR会产生2类LSA,它们用来配合1类LSA一并告诉其他路由MA网络的情况。2类LSA会根据DR的本机接口的地址产生。它其中包含该MA网络中所有路由器的路由器ID和MA网络中接口的掩码。它在与DR所在一个区域的路由器都可以接收到,根据2类LSA会形成MA网络拓扑信息。但仍无法通过ABR前往其他区域。
3.5 三类LSA
我通过了1类和2类LSA的描述后计算出了整个区域的网络信息。但是区域外的信息仍然不可获知,这个时候ABR是连接多区域的设备。这时3类LSA就是做这个用的。我收集到一个区域的1,2类LSA会形成Area1的路由并汇总成3类LSA并传递给Area0。3类LSA由ABR产生。
它包含一条完整的区域间路由。
首先Area0会先找到ABR并判断是否可达(通过查询3类LSA到达时看ADV Router的路由器ID)。当Area2接收到Area1的3类LSA时,要经过ABR2,但Area1的ABR1并不是Area2的查找范围。因此,ABR2会修改ADV Router的路由器ID为自身这样告诉Area2想要访问Area1必须经过ABR2,而ABR2又是Area2可查到的。(每换一台R,它的ADV Router都会改为自身ABR的路由器ID)当跨区域传递时,4类LSA要更换为自身的路由器ID告诉该区域路由器去往ABR1的话要经过ABR2)
3.6 四,五类LSA
5类LSA包含外部路由,它由ASBR产生。ASBR既连接OSPF也连接其他协议,它将其他协议的R强行引入OSPF。因此通过5类LSA通告,但里面不携带拓扑信息。5类LSA包含外部路由。它告诉其它路由器,想要访问外部网络,拿我做远程下一跳。5类LSA不会更改路由器ID,但是如何让其他区域知道5类LSA的信息呢?
这时需要4类LSA。它会一并跟ASBR所在的同一区域的ABR产生。它包含ASBR的身份信息和位置信息。4类LSA发给其它不知道ASBR的区域。让他们知道ASBR的存在和位置信息。
四,OSPF矢量图
OSPF的矢量图分为:
节点、连接、树叶
节点:路由器节点(Router Node)、设备节点(Stub Node)
路由器节点只有在一个区域内的路由器会发现;设备节点在连接设备时会发现
连接:骨干连接、Stub连接
树叶:3类LSA区域间路由,5类LSA外部路由(5类LSA挂靠时要先知道ASBR在哪个ABR上面,之后再挂靠在ASBR上)
但以上如何形成路由条目呢?
先画出路由器节点(Transit节点),生成一个最短路径树。之后画Stub节点,将其挂靠在最短路径树上(我只关心我去哪,不关心谁到自己这里)
LSA重要字段
PtoP | 邻居路由器ID | 该网段上本地接口IP地址 |
---|---|---|
TransNet | DR接口IP | 该网段上本地接口IP地址 |
StubNet | 该Stub网段上的IP网络地址 | 该Stub网段上的网络掩码 |
virtual | 虚连接邻居的路由器ID | 去往虚链邻居的本地接口IP地址 |
五,ISPF与PRC
早期在运行OSPF时采用SPF算法,但在后续的计算中逐步采用了ISPF和PRC算法
iSPF:增量型SPF(当我的OSPF所处环境发生变化时,这时OSPF的树型结构受到影响,会重新计算树型结构图,消耗CPU极大)
PRC:部分路由计算(当我更改了路由条目后,但环境无变动,这时会进行PRC计算,消耗极小)
一个区域内的链路状态协议不太会出现环路,但是多个区域之间的通信会出现。单区域无法汇总,也不要只做一个区域(避免SPF的大量计算)
它们的优点为每30分钟一次的LSA泛洪扩散不会让SPF算法重计算。而且仅会对变化的拓扑计算而不是整体。当路由发生变化时PRC会查看并更新(如果路径和树无变化时)它对3类LSA与5类LSA会重计算
避免大量使用ISPF算法,区域内的树形结构更改,ISPF要计算;但区域外要更改,区域内树型无更改则用PRC。LSA的一类与二类执行ISPF;三类、四类执行PRC。
3类LSA所产生的优先级一定低于1类2类LSA所产生的路由。因为3类LSA无法保障端到端时无环的,仅能保障区域内是无环的。
在Area0中有Full邻居的ABR在关于3类LSA防环的时候。ABR会先通过非骨干区收到3类LSA,这些LSA不能设置成Routing bit 也不能传递给任何其他的OSPF邻居。
六,LSA在虚链路中
当我建立了虚链路时,LSA的传递怎么办呢?
内网OSPF合并——多个不连续的Area0——远离Area0非骨干区域——双OSPF进程重分发——Tunnel Source——Tunnel接口自身也要有个IP地址(不过TUNNEL麻烦,直接用虚连接)。它仅用于常规区域如:stub,totally stub NSSA和Totally NSSA均不适用。只有在树型结构中看不到对端路由器时,虚连接才会down。一般设置在Area0的边界路由器上。
比如以下区域:A0-A1-A2-A3-A4,如何通过虚连接让A4路由去往其它区域?
在两个ABR之间做虚连接可以跨区域访问,且不需要必须挂靠在A0,但它会出现环路,尤其是在区域间汇总的时候。我们支持汇总,但是虚连接后要么不要进行汇总,要么做等量的汇总。
虚连接出现环路(如下解释)
解释:当R5访问Area0的R3,就会出现以下路径
R5—R4—R2—R1—R3
但R3访问R5时
R3—R1—R2—R3。。。
出现路环路,因此如何避免区域间环路的形成呢?
很简单!将区域间路由优先级设计成低于区域间或者抑制3类LSA的传递,最好使用星形拓扑设计。
七,OSPF拓扑图
OSPF采用了树形结构算法(我只关心自己去往其它路由的路径)
树形拓扑图中含有以下内容:树根、树干、树枝、树叶
树根:路由器节点
树干:OSPF邻居与其它路由器建立的链路为树干(骨干链路)
树枝:路由器连接stub节点为树枝(这个是在我没有建立OSPF邻居,但是宣告了OSPF)
树叶:他所在区域内的其他路由可以获取,但想获取其他区域的路由器和外部路由器需要建立在路由器节点上(先把ASBR挂靠在ABR上,再把其他区域通过ASBR连入)
OSPF拓扑图有三种链路:
Stub链路、点到点、骨干链路
骨干链路:骨干链路有能力转发既不是本网段产生的,也不以本网段为目的地的路由。有至少两台路由器的广播型网段或NBMA网段就是一种骨干链路网段。
PtoP链路:其两端的地址不一致仍可通信,因为有peer neighbor—route 它将双方生成的32位主机路由通告给双方,因此会有一个配好的路由和32位主机路由。
树形结构生长规则:从树根生长起,本地路由器节点(一个树仅有一个根);只往外长,不往回长;随后长树干,然后是树枝,最后是树叶。执行树形结构计算时按照先看1类2类LSA后看3类4类5类LSA进行;树干有多个时,优先生长最短的树干,如果没有可以找到的则在候选列表中找(找里面最长的)如果一样就全部选中。
以上也分为两个阶段:
一阶段:计算Transit节点,忽略stub节点生成一个最短路径树。
二阶段:只计算stub节点,将stub网段挂到最短路径树上区,先从自身始发的1类LSA根据开销查找。
八,OSPF网络类型
当一个接口宣入到OSPF,就会产生一种网络类型。决定我们是否选择DR/BDR的是由OSPF决定的,而且由OSPF中的网络类型决定。比如:以太网链路,采用OSPF由广播类型(默认的)你要选择DR/BDR;用serial链路采用OSPF,由点到点类型决定不选择DR/BDR。
OSPF网络类型有6种:loopback,broadcost,NBMA,ptop,PtoMP和PtoM NBMA(华为仅有四种,少了loopback和PtoM NBMA)。
其中以上前四种都有接口自动配制好类型,后两种无任何接口默认对应,宣告后不会看到。
(1)loopback:它仅能对应环回口,它应用很窄,常在做连通性测试和辅助更高级的协议中使用。几乎没有通过环回口连接路由邻居,不涉及邻居建立和传输问题,其他类型接口无法使用它。不过OSPF会认为环回口为一个末节节点,你无论配多少个掩码,通告路由时都以32位主机形式通告。
(2)Broadcast:它建邻居允许发送组播报文(224.0.0.5)也就是可自动建邻居。邻接关系数量无限制(Hello时间,dead时间为1:4)传送路由时,在该网络中,无论R如何传递,cost仅累加一次,无论R如何传递,下一跳都将保持信源接口地址。
注:在大部分广域网或VPN环境中,常采用DMVPN或DSVPN,它是Hub&Spoke星型结构,它会选出一个DR而无BDR,这时上述传路由特点不复存在(spoke—hub—spoke这样的结构,它的cost值不会累加,下一跳为中转者路由器地址)。
(3)NBMA:应用少,但是它的用法和BroadCast几乎完全一致,仅两点区别:
1.不支持组播发送,必须指定相应的IP地址,然后发送单播Hello(但华为要双方都建立Peer邻居,随后才能互相建立联系)。
2.建立时间慢,是BroadCast的3倍时长。
注:NBMA和Broadcast可以兼容,网络类型兼容参考于是否要DR/BDR来判断是否可以建立邻居(要注意Hello时间一致)。
(4)点到点:(用的多)允许组播hello发送,建立邻接关系仅能有一个且无DR/BDR。
(5)点到多点:支持组播,且无邻接关系数量限制,无DR/BDR。传递路由时会有自身接口IP地址对应的/32位主机路由形式通告;点到多点的cost值会累加,下一跳位hub接口地址。
(6)点到多点NBMA:它仅不支持发送组播Hello,其余和点到多点相同。
九,OSPF协议的NSSA和Stub
OSPF有两个区域——骨干区域和非骨干区域
首先从广义的角度讲,包括STUB,TOTALLY STUB,NSSA在内OSPF AREA都是为了通过减少不同种类的LSA扩散而达到节约内存资源的目的。
非骨干区域中有3个类型(默认为常规区域),可以把它们设置成Stub和NSSA,那为什么不用常规区域呢?
答:一般情况下,非骨干区域去往外网或者其它网段时候仅有一条路径(一台ABR)为了优化其数据库和路由表则可以通过NSSA和Stub修改。当外网访问时候,ABR会阻止从外到内的流量的进入,也就是4,5类LSA,取而代之的是向区域内部传送指向自身路径的3类LSA,当内部设备访问外部网络时,通过给ABR发送数据以完成访问。
NSSA次末节区域:非骨干区域才能设置(非Area0区域)该区域所有的路由器都要为NSSA
Stub末节节点:非骨干区域才能设置(非Area0区域)该区域所有的路由器都要为Stub
Nssa和Stub区别:
虽然它们都会过滤4,5类LSA,但是Nssa不会下放默认路径,原因为Nssa中有出口会导致冲突(ABR和ASBR都会有下方默认路径)
在思科设备中:如果想NSSA的ABR下放默认,敲命令就好,有无默认路由无所谓;但在NSSA的ASBR上下方默认,不止命令还要保障有默认路由
在华为设备中:华为的NSSA中ABR会主动下放默认路由,ASBR也要下放,因此要处理cost等问题
因此不建议NSSA有多个ABR
NSSA好在出口位置允许在内部,但Stub不允许在。如果你想减少LSDB等信息,不需要用ASBR设立,你可以将它升级成Totally NSSA(仅需要ABR部署)
ABR会过滤从外到内的3,4,5,类LSA,除了外部路由,区域间也过滤,过滤后ABR会主动下放默认3类LSA以此完成区域间访问(Totally Nssa也是这样)
Stub区域禁止5,7类LSA
在Hello中有个Option字段其中有E和N
E1代表该区域允许5类LSA,N0代表非NSSA区
在Stub区域中,R交互Hello时,E和N都为0,如果没有统一的设置为Stub,就会出现问题。Two-way都无法完成。E有0也代表不能产生5类LSA的ASBR。因此边界不能设置为Stub区域。Stub中也不能有Virtual Link
不规则区域中,比如:Area0——Area1——Area0导致Area0之间无法通信。Area0——Area1——Area2导致Area0和Area1收不到Area2因此采用OSPF设定的Virtual link它仅属于Area0区域的延伸且是点到点。但它是临时解决方案,因为会导致有环路。(一般网络合并的时候会出现虚连接的使用)
如果Stub区域中有两个ABR其实没必要用Stub了,设置Stub就是为了用默认路由代替明细路由,但有两个ABR了,有路可选择,很显然就是用明细路由(也可以做,但是不好)
Stub可以说升级,不仅去往外网,也可去往其他区域,Totally Stub(完全末节节点)它解决了Stub优化问题。Stub拿到了ABR的3类LSA完成了外网和区域间路由的联系。但其它普通的Stub仅到外网用默认访问网段还是明细路由。将ABR设置为Totally stub它会过滤3,4,5类LSA。Stub内部仅有1,2类,对外区域由3类默认ABR做到。(注:我仅限制从外到内的LSA)
NSSA区域中的Hello的Option E0和N1,NSSA中的ASBR无论什么情况,只要做到了重分发,它都会拿他宣告进OSPF的环回口或物理接口地址做FA地址,并通告7类LSA。
7类LSA区域内传递,但其它区域如何获得呢?
7类LSA无法跨区域传送,因此在ASBR中找到ABR当作转换器,它必须是NSSA区域中的ABR(真伪ABR都可)它负责将7类转化为5类LSA形式发送给其他区域(谁的RID大谁就做转换器;其中7—5类LSA转化是等价的)但ADV router会改变区域口和其它区域收到的5类LSA,他们会认为是转换器(ADV router改为自己)发的,但其实不是。因此7类LSA要带FA地址,告诉它们想访问外网的话,下一跳跳给我。因此易产生次优路径和环路。
何时把非骨干区域设成Stub或者NSSA?一个前提:区域内的路由器老龄化性能一般,区域内只有一台ABR从内到外的选路基本无空间,这时可升级为Stub和NSSA用3类LSA取代路由,以此减少消耗。
找到的这个图很不错
后续
OSPF在此就结束了,知识点很多,毕竟是链路状态协议的经典代表,这些知识点后续的实验中会用到。但是最重要的是,实际面对问题的时候,使用OSPF前要考虑到OSPF的特性是否可以解决客户问题,配置过程中是否会出现特殊情况等。