OSPF
目录
1. OSPF简介
OSPF是一种适用于大型复杂网络的链路状态型内部网关路由协议。作为IETF的标准,OSPF广泛部署于许多大型网络。
OSPF直接运行于IP层之上,其协议号为89,在运行层次上于TCP相同,TCP也是直接运行于IP层之上,只是协议号为6。OSPF不使用任何传输层协议(例如TCP)来保证其可靠性。OSPF自身内置有可靠性传输机制。
OSPF支持:
-
属于无类路由协议
-
支持VLSM
-
组播地址:
224.0.0.5 所有OSPF路由器地址
224.0.0.6 指定路由器DR地址和备份指定路由器BDR地址
-
Authentication:
明文认证
MD5认证
-
管理距离:110
OSPF区域:
-
分为骨干区域和非骨干区域
-
每个网络拓扑里面只允许存在一个骨干区域,所有的非骨干区域必须与骨干区域相连。
OSPF网络类型:
网络类型
|
Hello时间
|
Dead时间
|
邻居与邻接关系
|
broadcast
|
10s
|
40s
|
自动建立邻居,选举DR/BDR
|
P2P
|
10s
|
40s
|
自动建立邻居,无需选举DR/BDR
|
P2MP
|
30s
|
120s
|
手动指定邻居,无需选举DR/BDR
|
NBMA
|
30s
|
120s
|
手动指定邻居,选举DR/BDR
|
OSPF报文类型:
类型
|
描述
|
用途
|
1
|
Hello
|
用来发现邻居、选举DR/BDR,维护OSPF邻居关系
|
2
|
DBD(数据库描述)
|
用在数据库交换过程中,确立主/从关系,交换LSA包头,以及确定首个***
|
3
|
LSR(链路状态请求)
|
用在DBD交换过程中,请求本路由器已知的特定LSA
|
4
|
LSU(链路状态更新)
|
用来向已发出LSR数据包,以请求特定LSA的邻居,发送完整的LSA
|
5
|
LSack(链路状态确认)
|
用来确认本路由器已收到的LSU数据包
|
在OSPF路由计算过程中采用的是Dijkstra算法。OSPF路由器会利用此算法来计算出最短路径树(SPT)。每台OSPF路由器都会发送一种易于解读都报文——链路状态通告(LSA),向邻居路由器描述本机以及本机所连接的链路。
1.1 OSPF邻接状态
OSPF邻居路由器之间之所以建立邻接关系,是为了相互交换路由信息。OSPF邻居路由器之间会通过Hello协议(互发Hello数据包),来建立和维持临接关系。
OSPF路由器可与邻居路由器维系多种邻居状态,如下所列:
-
Down状态
-
Attempt状态(只在NBMA环境中)
-
Init状态
-
two-way状态
-
Exstart 状态
-
Exchange 状态
-
Loading 状态
-
Full状态
1.1.1 OSPF Down 状态
如图1-1所示,R1和R2都运行OSPF。邻居状态显示为Down状态,表明OSPF路由器尚未从邻居路由器收到任何OSPF协议数据包。
图1-1 OSPF Down状态
1.1.2 OSPF Attempt 状态
只有在NBMA网络环境中,才会出现Attempt状态。若一台OSPF路由器将其邻居路由器显示为Attempt状态,则表示未从邻居路由器收到任何OSPF协议数据包。此OSPF路由器会定期(按Hello数据包中Hello interval字段所指明的时间值)连续发出Hello数据包,来“联络”邻居路由器。如图1-2所示,R1发出Hello数据包,表明自己即未发现其他路由器,也不知DR何在。
图1-2 OSPF attempt状态
1.1.3 OSPF Init状态
Init状态表示有一方收到了Hello数据包。如图1-3所示,R1发出Hello数据包。收到此Hello数据包之后,由于R2在其所含邻居路由器字段中未发现自己的Router-ID,因此邻居双方会步入单向(接收)状态。
图1-3 OSPF Init状态
1.1.4 OSPF 2-way状态
当OSPF邻居双方都收到了对方发出的Hello数据包之后,就会建立起2-way状态。在2-way状态的建立过程中,会选举出了DR和BDR。如图1-4所示,R2所发Hello数据包的邻居路由器字段中包含了R1的Router-ID,收到此数据包之后,R1就知道R2已经收到了自己先前发出的Hello数据包。由于R2的Router-ID更高,因此会在此Hello数据包的指定路由器字段中填入自己的Router-ID,表明自己是DR。
图1-4 OSPF 2-way状态
1.1.5 OSPF Exstart状态
在Exstart状态下,OSPF邻居双方会发起数据库同步过程。此外,还会选举出主/从路由器。因为DBD交换所用的第一个***也会在Exstart状态下确定。如图1-5所示,R1和R2都会发出自己的第一个DBD数据包。Router-ID最高的路由器被选举为主路由器。本案例,R2的Router-ID最高,因此R2称为主路由器。
数据包中的I,M,MS状态:
-
I位:此位置1时,表示邻居双方发出的首个DBD数据包。
-
M位:此位置1时,表示DBD数据包尚未发送完毕。
-
MS位:主、从(Master and Slave)位。此位置1时,表示在DBD交换过程中,发包路由器为“主”路由器,此位置0时,则为“从”路由器。
-
DBD***:此字段包含由“主”路由器设置的唯一值(***),在数据库交换过程中使用。只有“主”路由器才能增加此字段的值(***的值)。
图1-5 OSPF Exstart 状态
1.1.6 OSPF Exchange状态
在Exchange状态下,OSPF邻居双方会互发描述本路由器所持完整链路状态数据库的DBD数据包。每个DBD数据包都必须得到确认。只允许存在一个未经确认(在途)DBD数据包。在此状态下,OSPF路由器还会发出LSR数据包,来请求新的LSA实例。图1-6所示,OSPF邻居双方在Exchange状态下的交互。由图1-6可知,R1和R2正交换各自的链路状态数据库信息。此外,还可获知R2将其发出的最后一个DBD数据包中的M位置0,表明“主”路由器已无更多DBD数据包要发。R1(“从”路由器)会发送其余的DD数据包,发完之后,也会顺带在最后一个DD数据包中将M位置0。此时便标志着OSPF邻居双方已经交换完描述各自链路状态数据库的完整信息了。
图1-6 OSPF Exchange状态
1.1.7 OSPF Loading状态
在loading状态下,OSPF邻居双方会互发LSR数据包,以请求在Exchange状态下(由对方通过DBD数据包通告)未曾接收到的LSA的最新实例。由图1-7可知,R1正处于loading状态,且已发出LSR数据包,要求R2向其发出某条LSA的最新实例。
图1-7 OSPF Loading状态
1.1.8 OSPF Full状态
此状态表示OSPF邻居双方已经交换了完整的信息。如图1-8所示,R1和R2已经交换完了各自的链路状态数据库信息,且同处于Full状态。
图1-8 OSPF Full状态
1.1.9 建立邻接关系的过程
OSPF路由器建立邻接关系的过程详细描述:
-
OSPF路由器接口UP,发送Hello数据包。如果在NBMA网络环境中将进入Attempt状态。
-
OSPF路由器接口收到Hello数据包,进入Init状态。并将该Hello数据包的发送者的Router-ID,添加到Hello数据包(自己将要从该接口发送出去的Hello数据包)的邻居列表中。
-
OSPF路由器接口收到邻居列表中含有自己Router ID的Hello数据包,进入2-way状态,形成OSPF邻居关系,并把该路由器的Router ID添加到自己的OSPF邻居表中。
-
在进入2-way状态后,广播、非广播网络类型的链路,在DR选举等待时间内进行DR选举。点对点没有这个过程。
-
在DR选举完成或跳过DR选举后,建立OSPF邻接关系,进入Exstart(准启动)状态;并选举DBD交换主从路由器,以及由路由器定义DBD***,Router ID大的为主路由器。目前是为了解决DBD自身的可靠性。
-
主从路由器选举完成后,进入Exchange(交换)状态,交换DBD信息。
-
DBD交换完成后,进入Loading状态,对链路状态数据库和收到的DBD的LSA头部进行比较,发现自己数据库中没有的LSA就发送LSR,向邻居请求该LSA;邻居收到LSR后,回应LSU;收到邻居发来的LSU,存储这些LSA到自己的链路状态数据库,并发送LSack确认。
-
LSA交换完成后,进入Full状态,所有形成邻居的OSPF路由器都拥有相同链路状态数据库。
-
定期发送Hello数据包,维护邻居关系。
1.2 OSPF 数据包
OSPF报文类型:
图1-9 OSPF 数据包格式
类型
|
描述
|
用途
|
1
|
Hello
|
用来发现邻居、选举DR/BDR,维护OSPF邻居关系
|
2
|
DBD(数据库描述)
|
用在数据库交换过程中,确立主/从关系,交换LSA包头,以及确定首个***
|
3
|
LSR(链路状态请求)
|
用在DBD交换过程中,请求本路由器已知的特定LSA
|
4
|
LSU(链路状态更新)
|
用来向已发出LSR数据包,以请求特定LSA的邻居,发送完整的LSA
|
5
|
LSack(链路状态确认)
|
用来确认本路由器已收到的LSU数据包
|
表1-1 各类 OSPF 数据包
图1-10 OSPF 数据包报文
OSPF数据包首部共有24个字节:
-
Version:OSPF的版本号,IPV4为OSPFV2,IPV6为OSPFV3
-
Type:OSPF数据包类型(Hello,DBD,LSR,LSU,LSack)
-
Packet Lenth:OSPF数据包长度
-
Router ID:发出OSPF数据包的路由器的Router-ID,一般都是OSPF路由器(接口)的IP地址。
-
Router-ID用在自治系统(OSPF路由进程域)内标识OSPF路由器的唯一性。若在路由器上创建了loopback接口,则取自IP最高的lookback接口。
-
Area ID:发出OSPF数据包的路由器接口所在的区域。OSPF区域ID的写法有两种:区域1或者区域0.0.0.1。
-
Checksum:校验和
-
AuType:OSPF的认证类型(0-无认证,1-明文认证,2-密文认证)
-
Authentication:OSPF的认证,当Type为0时不检查该字段,当Type为1时包含最长为64bit的口令,当Type为2时包含KEY-ID消息摘要和不减小的加密***
-
Packet Data:数据包中的数据
1.2.1 Hello 数据包
Hello数据包是OSPF 1 类数据包。Hello数据包的作用是:让两台OSPF路由器建立起邻居关系。在MA/NBMA网络环境中,Hello数据包选举OSPF路由器的DR/BDR。通过广播介质发送时,Hello数据包的目的IP地址为224.0.0.5;通过非广播介质发送,其目的IP地址为单播IP地址。如图1-11所示。
图1-11 OSPF Hello数据包
-
Network Mask:表示发送Hello数据包(参与OSPF进程)的路由器接口的网络掩码。仅只有广播介质(MA网络环境中)才会检查此字段值。
-
Hello Interval:表示每隔多长时间发送一次Hello数据包,单位为秒。对于两台尝试建立OSPF邻接关系的路由器来说,Hello 和 Dead 时间必须一致。其中Broadcast和P2P,此字段值为10s;其他网络环境中,此字段值为30s。
-
Options:表示(发送Hello数据包的)路由器所支持的能力。Options字段的格式如下所列:
DN
|
O
|
DC
|
EA
|
N/P
|
MC
|
E
|
T
|
-
DN位,为MPLS/v*n所用。
-
O位用于不透明LSA(opaque LSA)详见RFC2370。
-
DC位表示路由器支持按需电路特性。参考网上博文 OSPF DC按需链路技术剖析
-
EA位表示路由器支持(接收及转发)外部属性LSA。
-
N/P位表示路由器支持非完全端区域(not-so-stubby area,NSSA)。
-
MC位表示路由器具备组播OSPF能力。
-
E位,E位置位时,表示路由器具备接收外部LSA的能力。
-
T位 表示路由器支持ToS(通常为0)。
-
Router Prionrity :默认情况下,此字段值被设置为1。在选举DR/BDR时起着重要作用;OSPF路由器发送Hello数据包中路由器优先级字段值越高,越有可能成为DR。此字段值为0,则不参与DR选举。
-
Dead Intervar:默认情况下,此字段值是Hello Interval字段值的4倍。表示一段以秒为单位的时间。
-
Designated Router:表示DR路由器的IP地址。若DR不存在或尚未发现,此字段值为0.0.0.0。DR通过Hello协议选举而出。具有最高优先级的路由器(所发Hello数据包中路由器优先级字段值最高的路由器)将成为发包接口所处网络内的DR。在路由器优先级字段值相等的情况下,Router-ID值最高的路由器(所发Hello数据包中指定路由器字段值最高的路由器)将成为(发包接口所处网络内的)DR。可以说OSPF是接口敏感型的协议。
-
Backup Designated Router:标识BDR,指明BDR的接口IP地址。若无BDR,此字段值为0.0.0.0。BDR通过Hello协议选举而出。
-
Neighbor:包含通过Hello数据包获知的邻居路由器的Router-ID。
通过抓包进行分析OSPF报文,查看Hello数据包信息:如图1-12所示。
图1-12 OSPF Hello数据包报文
图1-13 OSPF LLS Data Block报文
1.2.2 DBD数据包
DBD数据包是OSPF数据包的第2种类型,常用在(OSPF邻居路由器之间的)数据库交换期间。如图1-14所示为DBD数据包的格式。
DBD数据包的作用:
-
首个DBD数据包用来建立主/从(Master and Slave)路由器。
-
选举“主”路由器亦会用此数据包来设置(确定)初始化***。
-
Router-ID值最高的路由器会成为“主”路由器,并发起数据库同步。
图1-14 OSPF DBD数据包
DBD数据包中各字段的解释:
-
Interface MTU :此字段值指明发包接口(发送DBD数据包的路由器接口)所能发出的数据包的最大长度,单位为字节。由OSPF虚链路发出的DBD数据包的接口MTU字段值必须设置为0。
-
Options:与Hello数据包所含字段相同。
-
I位:此位置1时,则表示邻居双方发出的首个DBD数据包。
-
M位:此位置1时,则表示DBD数据包尚未发送完毕。
-
MS位:主/从位。此位置1时,表示在DBD交换过程中,发包路由器为“主”路由器,此位置0时,则为“从”路由器。
-
DBD Sequence Number:此字段包含由“主”路由器设置的唯一值(***),在数据库交换过程中使用。只有“主”路由器才能增加此字段的值(***的值)。
-
LSA Headers:此字段包含若干链路状态数据库包头。
图1-15 OSPF DBD报文
图1-15 OSPF DBD报文(带有LSA包头)
1.2.3 LSR数据包
链路状态请求数据包时OSPF数据包的第3种类型,在部分路由数据库信息“遗失”或“过时”的情况下发送。LSR数据包用来重新取回“遗失”的路由数据库中的精确信息。DBD交换过程完毕后,邻居双方(主/从路由器)还会互发LSR数据包,请求对方发送DBD交换过程中通告过的LSA。如图1-16所示LSR数据包的格式。
图1-16 OSPF LSR 数据包
对链路状态请求数据包中各字段的解释:
-
LS Type:标识所请求的LSA类型。
-
LS-ID:表示特定LSA的链路状态ID。
-
Advertising Router:包含生成LSA的路由器的Router-ID。
图1-17 LSR 报文
1.2.4 LSU数据包
链路状态更新数据包是OSPF数据包第4种类型,OSPF路由器会发此类数据包来实施LSA的泛洪。单个LSU数据包内会包含多条LSA。OSPF路由器也会发送LSU数据包,来回应(邻居路由器发出的)LSU数据包。以泛洪方式发出的LSA由LSA确认数据包进行确认。只要有一条未经确认的LSA,(OSPF路由器就会)每隔重传间隔时间重传一次。如图1-18所示LSU 数据包。
图1-18 OSPF LSU 数据包
图1-19 OSPF LSU数据包
1.2.5 LSack 数据包
链路状态确认数据包是OSPF数据包的第5种类型,用来对每条LSA进行确认。OSPF路由器也会发送LSack数据包,来应答LSU数据包。可用单个LSack数据包一次性确认收到的多条LSA。LSack数据包负责LSU数据包的可靠传输。如图1-20 OSPF LSack数据包所示。
链路状态确认数据包以组播的方式发送。若(发送LSack数据包的)路由器为DR/BDR,则IP包头的组播目的IP地址为224.0.0.5(所有SPF路由器地址)。否则,LSack数据包IP包头的组播目的IP地址为226.0.0.6(DR/BDR地址)。
0----------------------------------------------------------------------------------------------------------------------------------------------31
|
24字节OSPF公共包头
|
LSA包头
|
图1-20 OSPF LSack 报文