OSPF报文类型、五类数据包详解

时间:2024-04-14 16:27:27

OSPF

目录

OSPF

1. OSPF简介

1.1 OSPF邻接状态

1.1.1 OSPF Down 状态

1.1.2 OSPF Attempt 状态

1.1.3 OSPF Init状态

1.1.4 OSPF 2-way状态

1.1.5 OSPF Exstart状态

1.1.6 OSPF Exchange状态

1.1.7 OSPF Loading状态

1.1.8 OSPF Full状态

1.1.9 建立邻接关系的过程

1.2 OSPF 数据包

1.2.1 Hello 数据包

1.2.2 DBD数据包

1.2.3 LSR数据包

1.2.4 LSU数据包

1.2.5 LSack 数据包


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协议数据包。
 
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何在。
OSPF报文类型、五类数据包详解
 图1-2 OSPF attempt状态
 

1.1.3 OSPF Init状态

 
Init状态表示有一方收到了Hello数据包。如图1-3所示,R1发出Hello数据包。收到此Hello数据包之后,由于R2在其所含邻居路由器字段中未发现自己的Router-ID,因此邻居双方会步入单向(接收)状态。
OSPF报文类型、五类数据包详解
图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。
OSPF报文类型、五类数据包详解
图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***:此字段包含由“主”路由器设置的唯一值(***),在数据库交换过程中使用。只有“主”路由器才能增加此字段的值(***的值)。
OSPF报文类型、五类数据包详解
图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邻居双方已经交换完描述各自链路状态数据库的完整信息了。
OSPF报文类型、五类数据包详解
图1-6 OSPF Exchange状态
 

1.1.7 OSPF Loading状态

 
在loading状态下,OSPF邻居双方会互发LSR数据包,以请求在Exchange状态下(由对方通过DBD数据包通告)未曾接收到的LSA的最新实例。由图1-7可知,R1正处于loading状态,且已发出LSR数据包,要求R2向其发出某条LSA的最新实例。
OSPF报文类型、五类数据包详解
图1-7 OSPF Loading状态
 

1.1.8 OSPF Full状态

 
此状态表示OSPF邻居双方已经交换了完整的信息。如图1-8所示,R1和R2已经交换完了各自的链路状态数据库信息,且同处于Full状态。
OSPF报文类型、五类数据包详解
图1-8 OSPF Full状态
 

1.1.9 建立邻接关系的过程

OSPF路由器建立邻接关系的过程详细描述:
  1. OSPF路由器接口UP,发送Hello数据包。如果在NBMA网络环境中将进入Attempt状态。
  2. OSPF路由器接口收到Hello数据包,进入Init状态。并将该Hello数据包的发送者的Router-ID,添加到Hello数据包(自己将要从该接口发送出去的Hello数据包)的邻居列表中。
  3. OSPF路由器接口收到邻居列表中含有自己Router ID的Hello数据包,进入2-way状态,形成OSPF邻居关系,并把该路由器的Router ID添加到自己的OSPF邻居表中。
  4. 在进入2-way状态后,广播、非广播网络类型的链路,在DR选举等待时间内进行DR选举。点对点没有这个过程。
  5. 在DR选举完成或跳过DR选举后,建立OSPF邻接关系,进入Exstart(准启动)状态;并选举DBD交换主从路由器,以及由路由器定义DBD***,Router ID大的为主路由器。目前是为了解决DBD自身的可靠性。
  6. 主从路由器选举完成后,进入Exchange(交换)状态,交换DBD信息。
  7. DBD交换完成后,进入Loading状态,对链路状态数据库和收到的DBD的LSA头部进行比较,发现自己数据库中没有的LSA就发送LSR,向邻居请求该LSA;邻居收到LSR后,回应LSU;收到邻居发来的LSU,存储这些LSA到自己的链路状态数据库,并发送LSack确认。
  8. LSA交换完成后,进入Full状态,所有形成邻居的OSPF路由器都拥有相同链路状态数据库。
  9. 定期发送Hello数据包,维护邻居关系。
 

1.2 OSPF 数据包

 
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 数据包
 
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所示。
OSPF报文类型、五类数据包详解
图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所示。
OSPF报文类型、五类数据包详解
图1-12 OSPF Hello数据包报文
OSPF报文类型、五类数据包详解
图1-13 OSPF LLS Data Block报文
 

1.2.2 DBD数据包

 
DBD数据包是OSPF数据包的第2种类型,常用在(OSPF邻居路由器之间的)数据库交换期间。如图1-14所示为DBD数据包的格式。
DBD数据包的作用:
  • 首个DBD数据包用来建立主/从(Master and Slave)路由器。
  • 选举“主”路由器亦会用此数据包来设置(确定)初始化***。
  • Router-ID值最高的路由器会成为“主”路由器,并发起数据库同步。
OSPF报文类型、五类数据包详解
图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:此字段包含若干链路状态数据库包头。
 
OSPF报文类型、五类数据包详解
图1-15 OSPF DBD报文
OSPF报文类型、五类数据包详解
图1-15 OSPF DBD报文(带有LSA包头)
 

1.2.3 LSR数据包

 
链路状态请求数据包时OSPF数据包的第3种类型,在部分路由数据库信息“遗失”或“过时”的情况下发送。LSR数据包用来重新取回“遗失”的路由数据库中的精确信息。DBD交换过程完毕后,邻居双方(主/从路由器)还会互发LSR数据包,请求对方发送DBD交换过程中通告过的LSA。如图1-16所示LSR数据包的格式。
OSPF报文类型、五类数据包详解
图1-16 OSPF LSR 数据包
 
对链路状态请求数据包中各字段的解释:
  • LS Type:标识所请求的LSA类型。
  • LS-ID:表示特定LSA的链路状态ID。
  • Advertising Router:包含生成LSA的路由器的Router-ID。
OSPF报文类型、五类数据包详解
图1-17 LSR 报文
 

1.2.4 LSU数据包

 
链路状态更新数据包是OSPF数据包第4种类型,OSPF路由器会发此类数据包来实施LSA的泛洪。单个LSU数据包内会包含多条LSA。OSPF路由器也会发送LSU数据包,来回应(邻居路由器发出的)LSU数据包。以泛洪方式发出的LSA由LSA确认数据包进行确认。只要有一条未经确认的LSA,(OSPF路由器就会)每隔重传间隔时间重传一次。如图1-18所示LSU 数据包。
OSPF报文类型、五类数据包详解
图1-18 OSPF LSU 数据包
OSPF报文类型、五类数据包详解
图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包头
OSPF报文类型、五类数据包详解
图1-20 OSPF LSack 报文