OSPF特点
OSPF协议具有如下特点:
适应范围 —— OSPF 支持各种规模的网络,最多可支持几百台路由器。
快速收敛 —— 如果网络的拓扑结构发生变化,OSPF 立即发送更新报文,使这一变化在自治系统中同步。
无自环 —— 由于 OSPF 通过收集到的链路状态用最短路径树算法计算路由,故从算法本身保证了不会生成自环路由。
子网掩码 —— 由于 OSPF 在描述路由时携带网段的掩码信息,所以OSPF协议不受自然掩码的限制,对VLSM 提供很好的支持。
区域划分 —— OSPF 协议允许自治系统的网络被划分成区域来管理,区域间传送的路由信息被进一步抽象,从而减少了占用网络的带宽。
等值路由 —— OSPF 支持到同一目的地址的多条等值路由,即到达同一个目的地有多个下一跳,这些等值路由会被同时发现和使用。
路由分级 —— OSPF 使用 4 类不同的路由,按优先顺序来说分别是:区域内路由、区域间路由、第一类外部路由、第二类外部路由。
支持验证 —— 它支持基于接口的报文验证以保证路由计算的安全性。
组播发送 —— OSPF在有组播发送能力的链路层上以组播地址发送协议报文,即达到了广播的作用,又最大程度的减少了对其他网络设备的干扰。
根据链路层协议类型,OSPF将网络分为四种类型:
(1) 广播类型:链路层协议是Ethernet、FDDI、Token Ring,以组播的方式发送协议报文,选举DR BDR。
(2) 非广播多路访问Non Broadcast MultiAccess(NBMA)类型:链路层协议是帧中继、ATM、HDLC或X.25时。手工指定邻居,选举DR/BDR,DR/BDR要求和DROTHER完全互连。
(3) 点到多点Point-to-Multipoint(p2mp)类型:没有一种链路层协议会被缺省的认为是Point-to-Multipoint类型。点到多点必然是由其他网络类型强制更改的,常见的做法是将非全连通的NBMA改为点到多点的网络。多播hello包自动发现邻居,不要求DR/BDR的选举。
(4) 点到点Point-to-point(p2p)类型:链路层协议是PPP或LAPB。无需选举DR BDR,当只有两个路由器的接口要形成邻接关系的时候才使用。
1.1 OSPF报文头Version # OSPF版本号,当前版本2。
Type OSPF报文类型,包括Hello、DD、LSR、LSU和LSAck等五种报文。
Router ID 报文起源的Router ID。
Area ID 一个32位的数,标识报文属于哪个区域,所有OSPF报文只属于单个区域,且只有一跳。当报文在虚链接上承载时,会打上骨干区域0.0.0.0的标签。
Checksum 包的整个内容的校验,从OSPF报文头部开始,但是除了64位的认证字段。
AuType 认证类型包括四种:0(无需认证),1(明文认证),2(密文认证)和其他类型(IANA保留)。当不需要认证时,只是通过Checksun检验数据的完整性;当使用明文认证时,64位的认证字段被设置成64位的明文密码;当使用密文认证时,对于每一个OSPF报文,共享密钥都会产生一个“消息位”加在OSPF报文的后面,由于在网络上从来不以明文的方式发送密钥,所以提高了网络安全性。
1.2 OSPF五种协议报文OSPF的报文类型一共有五种:
HELLO报文(Hello Packet):
最常用的一种报文,周期性的发送给本路由器的邻居,使用的组播地址224.0.0.5。DR和BDR发送和接收报文使用的组播地址是224.0.0.6。HELLO报文内容包括一些定时器的数值,DR,BDR,以及自己已知的邻居。根据RFC2328的规定,要保持网络邻居间的hello时间间隔一致。需要注意的是,hello时钟的值与路由收敛速度、网络负荷大小成反比。缺省情况下,p2p、broadcast类型接口发送Hello报文的时间间隔的值为10秒;p2mp、nbma类型接口发送Hello报文的时间间隔的值为30秒。
DD报文(Database Description Packet):
路由信息(连接状态传送报文)只在形成邻接关系的路由器间传递。首先,它们之间互发DD(database description)报文,告之对方自己所拥有的路由信息,内容包括LSDB中每一条LSA的摘要(摘要是指LSA的HEAD,通过该HEAD可以唯一标识一条LSA)。这样做是为了减少路由器之间传递信息的量,因为LSA的HEAD只占一条LSA的整个数据量的一小部分,根据HEAD,对端路由器就可以判断出是否已经有了这条LSA。DD报文有两种,一种是空DD报文,用来确定Master/Slave关系(避免DD报文的无序发送),确定Master/Slave关系后,才发送有路由信息的DD报文,收到有路由信息的DD报文后,比较自己的数据库,发现对方的数据库中有自己需要的数据,则向对方发送LSR(Link State Request)报文,请求对方给自己发送数据。
LSR报文(Link State Request Packet):
两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地的LSDB所缺少的或是对端更新的LSA,这时需要发送LSR报文向对方请求所需的LSA。内容包括所需要的LSA的摘要。
LSU报文(Link State Update Packet):
用来向对端路由器发送所需要的LSA,内容是多条LSA(全部内容)的集合。
LSAck 报文(Link State Acknowledgment Packet)
由于没有使用可靠的TCP协议,但是OSPF包又要求可靠的传输,所以就有了LSAck包。它用来对接收到的LSU报文进行确认。内容是需要确认的LSA的HEAD(一个报文可对多个LSA进行确认)。
DD报文、LSR报文、LSU报文发出后,在没有得到应有的对方相应的LSR、LSU、LSAck报文时,会重发。(例外:对DD报文若收到后发现没有必要产生连接状态请求报文,则不发连接状态请求报文。)同步后数据改变,则只向形成Adjacency关系的路由器发LSU报文。
OSPF状态机
Down:
邻居状态机的初始状态,是指在过去的Dead-Interval时间内没有收到对方的Hello报文。
Attempt:
只适用于NBMA类型的接口,处于本状态时,定期向那些手工配置的邻居发送HELLO报文。
Init:
本状态表示已经收到了邻居的HELLO报文,但是该报文中列出的邻居中没有包含我的Router ID(对方并没有收到我发的HELLO报文)。
2-Way:
本状态表示双方互相收到了对端发送的HELLO报文,建立了邻居关系。在广播和NBMA类型的网络中,两个接口状态是DROther的路由器之间将停留在此状态。其他情况状态机将继续转入高级状态。
ExStart:
在此状态下,路由器和它的邻居之间通过互相交换DD报文(该报文并不包含实际的内容,只包含一些标志位)来决定发送时的主/从关系。建立主/从关系主要是为了保证在后续的DD报文交换中能够有序的发送。
Exchange:
路由器将本地的LSDB用DD报文来描述,并发给邻居。
Loading:
路由器发送LSR报文向邻居请求对方的LSA。
Full:
在此状态下,邻居路由器的LSDB中所有的LSA本路由器全都有了。即,本路由器和邻居建立了邻接(adjacency)状态。
注:
l 灰色的状态是指稳定的状态,其他状态则是在转换过程中瞬间(一般不会超过几分钟)存在的状态。
l 本路由器和状态可能与对端路由器的状态不相同。例如本路由器的邻居状态是Full,对端的邻居状态可能是Loading。
LSA头部首先,我们分析一下LSA报文头:
所有LSA头部都有20个字节,它包含了足够的信息来唯一标识一条LSA(LS type,Link State ID,and Advertising Router )。LSA多实例在同一时候可以存在于路由域中,它被用来决定哪一个实例是最新的。LSA头部还包括LS老化、LS序列号和LS校验和等字段。
LS age,用来标识LS产生的时间。生成LSA 的路由器将LS时域初始化为0,在洪泛过程中,每经过一个路由器,要按InfTransDelay的量增加,这个量表示传输LSA到下一个跳所需要的时间。当该时间达到所设定的MaxAge参数时,要撤消该LSA。
Options,用来描述支持的路由域,主要包括DC、EA、N/P、MC、E、T等选项。DC指的是始发路由器支持Demand Circuits (按需拨号等);EA指的是始发路由器支持External Attributes LSAs (现在未推广);N/P只用在Hello中N=1,说明支持NSSA,P只用在NSSA中,通知ABR把type7的LSA翻译成type5的LSA;MC只在MOSPF中用到;E表示可以接受外部路由(不是stub区),在一个area中的所有router此位必须一致,(Hello中体现) 否则邻接关系无法建立;T表示始发路由器支持TOS。
LS type,链路类型。每种类型的LSA都有唯一的通告格式。
Link State ID,这个字段标识被描述的网络环境的一部分,Link State ID的内容取决于LSA的类型,即不同类型的LSA其Link State ID也是不同的。比如,当LSA的类型是Type 1时, Link State ID 是始发路由器的Router ID;当LSA的类型是Type 2时, Link State ID 是DR在该网段上接口的IP地址;当LSA的类型是Type 3时, Link State ID 是被通告的网络/子网的IP地址;当LSA的类型是Type 4时, Link State ID 是被通告ASBR的Router ID;当LSA的类型是Type 5时, Link State ID 是目的地的IP地址。
Advertising Router,指始发此LSA的路由器的Router ID。比如在Network-LSAs中,这个字段就是DR在该网段上接口的IP地址。
LS sequence number,用于识别LSA 包是否是一个最新包。路由器每生成一个新的LSA 时,将该序列号加1。
LS checksum用来检查LSA的完整性,包括除了LS age之外的LSA头部的内容。
Length,LSA的长度,用bytes表示。LSA的头部包括20字节。
LSA头中的链路类型、链路状态ID和通告路由器的Router ID是一个LSA的唯一标识。一个LSA将有多个实例,不同的实例通过LS的序列号、LS的校验和及LS的Age 字段来描述。因此,必须要决定其实例是否是最近的,这要通过检查LS的序列号、LS的校验和及LS的Age 字段内容。
LSA分类LSA分类:
OSPF是基于链路状态算法的路由协议,所有对路由信息的描述都是封装在LSA中发送出去。LSA根据不同的用途分为不同的种类,主要有如下类型的 LSA:
Router LSA(Type = 1):
是最基本的LSA类型,所有运行OSPF的路由器都会生成这种LSA。主要描述本路由器运行OSPF的接口的连接状况,花费等信息。对于ABR,它会为每个区域生成一条Router LSA。这种类型的LSA传递的范围是它所属的整个区域。
Netwrok LSA(Type = 2):
本类型的LSA由DR生成。对于广播和NBMA类型的网络,为了减少该网段中路由器之间交换报文的次数而提出了DR的概念。一个网段中有了DR之后不仅发送报文的方式有所改变,链路状态的描述也发生了变化。在DROther 和BDR的Router LSA中只描述到DR的连接,而DR则通过Network LSA来描述本网段中所有已经同其建立了邻接关系的路由器。(分别列出它们Router ID)。同样, 这种类型的LSA传递的范围是它所属的整个区域。
Network Summary LSA(Type = 3):
本类型的LSA由ABR生成。当ABR完成它所属一个区域中的区域内路由计算之后,查询路由表,将本区域内的每一条OSPF路由封装成 Network Summary LSA 发送到区域外。 LSA中描述了某条路由的目的地址、掩码、花费值等信息。这种类型的LSA传递的范围是ABR中除了该LSA生成区域之外的其他区域。
ASBR Summary LSA(Type = 4):
本类型的LSA同样是由ABR生成。内容主要是描述到达本区域内部的ASBR的路由。 这种LSA与Type3类型的LSA内容基本一样,只是Type4的LSA描述的目的地址是ASBR,是主机路由,所以掩码为0.0.0.0。这种类型的LSA传递的范围与Type3的LSA相同。
AS External LSA(Type = 5):
本类型的LSA由ASBR生成。主要描述了到自治系统外部路由的信息,LSA中包含某条路由的目的地址、掩码、花费值等信息。本类型的LSA是唯一一种与区域无关的LSA类型,它并不与某一个特定的区域相关。 这种类型的LSA传递的范围整个自治系统(STUB区域除外)。
Multicast OSPF LSA(Type =6):
使用在OSPF多播应用程序里。
Not-So-Stubby Area(Type =7):
使用在Not-So-Stubby area(NSSA)里。
External-Attributes-LSA(Type =8):
特殊的LSA,还没有实现。当BGP信息需要在OSPF上承载时,需要用到此LSA。
opaque LSA(Type =9~11):
用于MPLS流量工程,有关此LSA的详细应用请参考MPLS流量工程培训教材或RFC2370文档。
1.3 LSA进一步阐述如上图所示,我们进一步阐述各种类型的LSA。
两个自治系统,分别是AS100和AS200,其中Area0是骨干区域,Area2和Area3是非骨干区域,Area4是NSSA区域,Area3经过中间区域Area2与骨干区域通信。AS100内部运行OSPF协议,AS200内部运行RIPv2协议。自治系统之间通过BGP连接。
1.4 Router LSA(Type 1)上图显示了Type 1 LSA报文格式,不包括LSA报文头:
Router-LSAs是Type 1 LSAs,区域中的每台路由器产生一条Router-LSAs,特定区域内该路由器的所有链路都要描述在一个LSA里面,这种类型的LSA描述了到这个区域的路由器链路的状态和花费,所有到这个区域的路由器的链路必须用唯一的Router-LSAs描述出来。
在router-LSAs里,Link State ID字段被设置成路由器的OSPF Router ID。Router-LSAs 仅仅被泛洪到特定的区域,不再传播到其他区域。
VEB:用于确定路由器的链路类型。V比特, V指virtual,路由器是虚链路的端点;E比特, E指external ,当设置此位时,表示这台路由器是自治系统边界路由器;B比特,指border,当设置此位时,表示这台路由器是区域边界路由器。
# links,一台Router可以同时携带若干个链路信息,每个链路包括链路ID、链路数据、链路类型、#TOS、费用度量、TOS、TOS度量值等信息,用于描述路由器某接口的链路信息。
Link ID,标识路由器连接对象,这个值取决于链路状态类型。当链路类型是Type 1,则为邻居路由器的ID;当链路类型type 2,则为DR接口的IP地址;当链路类型type 3,则为IP网络/子网号;当链路类型type 4,则为邻居路由器的ID。
Link Data,这个值同样取决于链路类型字段。
Type,链路类型的简短描述,包括通过Point-to-point链路连接到另一台Router,连接到一个transit网络,连接到一个stub网络和Virtual link。
# TOS,链路服务类型号。在RFC2328中,该TOS已不再使用。
Metric,链路费用度量。
TOS,和TOS metric,IP的服务类型与服务度量值。
1.5 Router LSA of RT4上图显示了RT4的Type 1类型的LSA。
因为是Type 1类型的LSA,根据OSPF协议规定,Ls id就是产生此LSA的Router ID,即4.4.4.4。Advrtr:4.4.4.4表明这条LSA的始发者是4.4.4.4路由器。Link ID:3.3.3.3是说RT4连接的对象,发送的数据是40.1.1.1,两者之间连接类型是Virtual虚连接。
1.6 Network LSA (Type 2)上图显示了Type 2 LSA报文格式,不包括LSA头部:
Network-LSAs是Type2类型的LSA。在广播和NBMA类型的网络中,这种类型的LSA由DR路由器产生,描述了到这个网络的所有路由器,包括DR自己。Type 2类型的LSA将通告该路由器上某一多点访问网络和所连接的路由器信息,该LSA也只能在本区域内扩散。链路状态ID标识DR到这个区域或网络的接口IP地址,费用度量不再需要,因为路由器直接连接到网络上,费用必为0。
Network Mask,标识该多点访问网络的网络掩码。
Attached Router,标识连接到该网络并且与DR成紧邻关系的Router ID,包括DR本身的Router ID。
1.7 RT6 LSA上图显示了RT6的Type 2类型的LSA。
因为是Type 2类型的LSA,根据OSPF协议规定,Ls id就是DR在该网段上接口的IP地址,即60.1.1.2。Advrtr表明这条LSA的始发者是6.6.6.6这台路由器。Attached Router表明与DR有紧邻关系的路由器是2.2.2.2,当然包括它自己6.6.6.6。
1.8 Summary LSA (Type 3,4)上图显示了Type 3,4类型的 LSA报文格式,不包括LSA头部:
Summary-LSAs指的是Type 3和Type 4类型的LSA,两者都由区域边界路由器生成,实现区域间目标链路的描述,它们只能在同一个区域内泛洪。Type 3类型的LSA用来描述ABR到该目标网络的费用,供其它区域的路由器计算到该网络的费用。Type 4类型的LSA以一个自治系统边界路由器ASBR为其目标,而链路状态ID就是该ASBR的OSPF路由器ID,以描述ABR到ASBR之间的费用,它主要用于计算最佳的外部路由。链路状态ID是这两种类型的LSA之间的唯一区别。
对于Stub区域,Type 3类型的LSA也被用来描述一条默认路由。
当描述一条默认路由时,summary-LSA的Link State ID 总被设置成目标网络和掩码是0.0.0.0。
Metric,路由花费值。
1.9 Type 3 of RT2上图显示了RT2的Type 3类型的LSA。
因为是Type 3类型的LSA,根据OSPF协议规定,当LSA的类型是Type 3时, Ls ID 就是被通告的网络或子网的IP地址,在这里就是40.1.1.0网段地址。该网段的掩码是255.255.255.0,花费值是1562。这条LSA最初是由4.4.4.4通告的。
1.10 Type 4 of RT5上图显示了RT5的Type 4类型的LSA。
因为是Type 4类型的LSA,根据OSPF协议规定,当LSA的类型是Type 4时, Ls ID 就是被通告ASBR的Router ID,在这里ASBR的Router ID是1.1.1.1。而这条LSA最初是由4.4.4.4路由器通告的,到这个ASBR的花费值是3125。
如果某个区域内有ASBR,则这个区域的ABR在向其他区域生成路由信息时必须单独为这个ASBR生成一条Type 4类型的LSA,内容主要包括这个ASBR的Router ID和到他所需的花费值。
1.11 External LSA (Type 5)上图显示了Type 5类型的 LSA报文格式,不包括LSA头部:
AS-external LSA是Type 5类型的LSA,由ASBR产生,它被用于说明自治系统以外的网络或路由,在整个自治系统(除stub区域)内不加改变地泛洪,与路由器的链路状态数据库相独立地保存。
链路状态ID域为目标网络的IP网络号,网络掩码为目的网络的掩码。在As-external LSA中可以通告一条缺省路由,这时,链路状态ID为0.0.0.0,网络掩码也为0.0.0.0。E位用于指示外部路由是1型(E = 0)还是2型( E = 1),1型外部路由的度量值与内部OSPF路由域的度量具有相同的度量单位,2型外部路由的度量值大于内部OSPF路由域的度量。
Forwarding address,转发地址是指到达该外部目标网络的下一跳地址,一般是ASBR路由器,此时转发地址为0.0.0.0,表示将报文转发给产生该LSA的ASBR,但如果运行BGP协议得到外部路由的ASBR与另一自治系统的ASBR间的网络是一个多点访问网络,则转发地址应设置为该网络地址,这样可省略ASBR这个中间一跳。在该LSA中,由产生该LSA的ASBR路由器负责对该外部路由做上标志tag,以便在ASBR间传送另外的附加信息。
1.12 External Type 1如果E比特位是0,也就是Type 1类型的外部Metric,意味着被表示成与链路状态相同的花费值(用接口花费值表示)。
此时,R2接口Cost值比R1的小,因此到达外部网络N1的路径下一跳选择R2是最优的。
1.13 External Type 2Metric被指定为Type 2的外部Metric,意味着这条路径花费比其他任何一个都要大。
如图所示,从R3到达目标网络N1有两条路径,其中下一跳为R2的路径已被标识为External Type 2,路径花费值比任何一个都要大,因此选择下一条为R1的路径。
1.14 Type 5 Details上图显示了RT2的Type 5类型的LSA。
因为是Type 5类型的LSA,根据OSPF协议规定,当LSA的类型是Type 5时, Ls ID 就是目的地的IP地址,在这里就是80.0.0.0网段地址。这条LSA由1.1.1.1路由器通告的,在通告的同时也包括掩码、花费以及转发地址这样一些参数值。
1.15 NSSA (Type 7)除了下面描述的,Type 7-LSA和type-5 LSA是相同的:
(5) 在LSA头部,Type字段是7。
(6) Type-7 LSA只在NSSA区域产生并泛洪,不能泛洪到骨干区域和其他区域,与stub区域一样,NSSA区域不能接收产生Type 5类型的报文。
(7) 在NSSA区域边界路由器,type-7 LSA被转换成type-5 LSA后泛洪到骨干区域。
(8) Type 7 LSA有一个P(propagate )位,用来标记区域边界路由把Type-7 LSA转换成Type-5 LSA。
1.16 Type 7 Details上图显示了RT2的Type 7类型的LSA。
在这个组网中,Area4是NSSA区域。RT2在Area4的边界,为了访问外部网络,RT2产生了一条Type 7类型的LSA,这条LSA主要包括这条LSA的产生者(2.2.2.2),目标网段(0.0.0.0),掩码(0.0.0.0),花费(1)以及转发地址(0.0.0.0)。
1.17 初始状态的LSA当一个路由器的接口上启动了OSPF,那么就会生成一个且只生成一个LSA---Router LSA。
随着邻居关系向邻接关系的过渡,这些ROUTER LSA会根据从对方学到的LSA信息,发生一些变化,比如生成NETWORK LSA或其他类型的 LSA。
1.18 LSA交换之后接下来是?邻接关系形成之后,开始进行路由计算,具体的计算过程参见我们将要介绍的第四部分。
为什么需要划分区域:
随着网络规模日益扩大,网络中的路由器数量不断增加。当一个巨型网络中的路由器都运行OSPF路由协议时,就会遇到如下问题:
? 每台路由器都保留着整个网络中其他所有路由器生成的LSA,这些LSA的集合组成LSDB,路由器数量的增多会导致LSDB非常庞大,这会占用大量的存储空间。
? LSDB的庞大会增加运行SPF算法的复杂度,导致CPU负担很重。
? 由于LSDB很大,两台路由器之间达到LSDB同步会需要很长时间。
? 网络规模增大之后,拓扑结构发生变化的概率也增大,网络会经常处于“动荡”之中,为了同步这种变化,网络中会有大量的OSPF协议报文在传递,降低了网络的带宽利用率。更糟糕的是:每一次变化都会导致网络中所有的路由器重新进行路由计算。
解决上述问题的关键主要有两点:减少LSA的数量;屏蔽网络变化波及的范围。
OSPF 协议通过将自治系统划分成不同的区域(Area)来解决上述问题。区域是在逻辑上将路由器划分为不同的组。区域的边界是路由器,这样会有一些路由器属于不同的区域,(这样的路由器称作区域边界路由器——ABR),而一个网段只能属于一个区域。
划分成区域之后,给OSPF协议的处理带来了很大的变化。
? 每一个网段必须属于一个区域,或者说每个运行OSPF协议的接口必须指名属于某一个特定的区域,区域用区域号(Area ID)来标识。区域号是一个从0开始的32位整数。
不同的区域之间通过ABR来传递路由信息。
划分区域后的好处:
? 由于划分区域后ABR是根据本区域内的路由生成LSA,则可以根据IP地址的规律先将这些路由进行聚合后再生成LSA,这样做可以大大减少自治系统中LSA的数量。
? 划分区域之后,网络拓扑的变化首先在区域内进行同步,如果该变化影响到聚合之后的路由,则才会由ABR将该变化通知到其他区域。大部分的拓扑结构变化都会被屏蔽在区域之内了。
OSPF网络被划分成多个区域之后,路由计算的方法也发生了变化:
? 只有同一个区域内的路由器之间会保持LSDB的同步,网络拓扑结构的变化首先在区域内更新。
? 区域之间的路由计算是通过ABR来完成的。ABR首先完成一个区域内的路由计算,然后查询路由表,为每一条OSPF路由生成一条Type3类型的LSA,内容主要包括该条路由的目的地址、掩码、花费等信息。然后将这些LSA发送到另一个区域中。
? 在另一个区域中的路由器根据每一条Type3的LSA生成一条路由,由于这些路由信息都是由ABR发布的,所以这些路由的下一跳都指向该ABR。
第2章 silent-interface (OSPF) 2.1 命令功能silent-interface命令用来抑制接口收发OSPF报文。
undo silent-interface命令用来恢复缺省配置。
缺省情况下,允许接口收发OSPF报文。
2.2 命令格式silent-interface { all | interface-type interface-number }
undo silent-interface { all | interface-type interface-number }
2.3 参数说明