OSPF 学习笔记
OSPF 协议号是89,也就是说在ip 包的protocol 中是89,用ip 包来传送
数据包格式:
在OSPF 路由协议的数据包中,其数据包头长为24 个字节,包含如下8 个字段:
* Version number-定义所采用的OSPF 路由协议的版本。
* Type-定义OSPF 数据包类型。OSPF 数据包共有五种:
* Hello-用于建立和维护相邻的两个OSPF 路由器的关系,该数据包是周期性地发送的。
* Database Description-用于描述整个数据库,该数据包仅在OSPF 初始化时发送。
* Link state request-用于向相邻的OSPF 路由器请求部分或全部的数据,这种数据包是在当
路由器发现其数据已经过期时才发送的。
* Link state update-这是对link state 请求数据包的响应,即通常所说的LSA 数据包。
* Link state acknowledgment-是对LSA 数据包的响应。
* Packet length-定义整个数据包的长度。
* Router ID-用于描述数据包的源地址,以IP 地址来表示,32bit
* Area ID-用于区分OSPF 数据包属于的区域号,所有的OSPF 数据包都属于一个特定
的OSPF 区域。
* Checksum-校验位,用于标记数据包在传递时有无误码。
* Authentication type-定义OSPF 验证类型。
* Authentication-包含OSPF 验证信息,长为8 个字节。
FDDI 或快速以太网的Cost 为1,2M 串行链路的Cost 为48,10M 以太网的Cost 为10 等。
所有路由器会通过一种被称为刷新(Flooding)的方法来交换链路状态数据。Flooding 是指路由器将其LSA 数据包传送给所有与其相邻的OSPF 路由器,相邻路由器根据其接收到的链路状态信息
更新自己的数据库,并将该链路状态信息转送给与其相邻的路由器,直至稳定的一个过程。当路由
器有了一个完整的链路状态数据库时,它就准备好要创建它的路由表以便能够转发数据流。CISCO 路由器上缺省的开销度量是基于网络介质的带宽。要计算到达目的地的最低开销,链路状态型路由选择协议(比如OSPF)采用Dijkstra 算法,OSPF 路由表中最多保存 6 条等开销路由条目以进行负
载均衡,可以通过"maximum-paths" 进行配置。如果链路上出现fapping 翻转,就会使路由器不停
的计算一个新的路由表,就可能导致路由器不能收敛。路由器要重新计算客观存它的路由表之前先
等一段落时间,缺省值为 5 秒。在CISCO 配置命令中"timers spf spf-delay spy-holdtime" 可以对两次连续SPF 计算之间的最短时间(缺省值10 秒)进配置。
路由器初始化时Hello 包是用224.0.0.5 广播给域内所有OSPF 路由器,选出DR 后在用224.0.0.6 和DR,BDR 建立邻接。DR 用224.0.0.5 广播给DRother LSA BDR 也是
DRother 用224.0.0.6 广播LSA 给DR 和BDR
DR 是在一个以太网段内选举出来的,如果一个路由器有多个以太网段那么将会有多个
DR 选举;DR 的选择是通过OSPF 的Hello 数据包来完成的,在OSPF 路由协议初始化的过程中,会通过Hello 数据包在一个广播性网段上选出一个ID 最大的路由器作为指定
路由器DR(如果设置优先级的话那么首先看优先级,优先级为0 不参加选举)并且选出ID 次大的路由器作为备份指定路由器BDR,BDR 在DR 发生故障后能自动替代DR 的所有工作然后重新选择BDR 。当一个网段上的DR 和BDR 选择产生后,该网段上的其余所有
路由器都只与DR 及BDR 建立
相邻关系。见下图
DR 的选举过程:这里可以以选举村长为例
选举的时候用Hello 包中的DR 字节来标识,开始的时候都是标识的自己,一旦选举出一个DR 来那么即使后来再有优先级更高的进来也不重新选举(因为一旦重新选举那么所有的邻接关系都要重新建立)
OSPF 启动的过程:
down
init 发送Hello(224.0.0.5)DR 字段为全零(因为还没有选出DR),单通状态,我能收到对端的Hello 报文,但对方没有收到我的报
文,怎么知道对端有没有收到我的报文呢,通过Neighbors Seen
看
2way 2 个OSPF 路由器从Hello 中发现互相的router id(本地路由器最大
ip,一般是loopback)建立邻接
在这个阶段已经知道谁是DR 了
exstart 预启动状态,OSPF 路由器建立主从关系(看谁的routerid 大)然后
协商一个序列号(因为ip 是不可靠的传输采用确认+超时重传
就可以)准备传送,头两个DD 报文为空,不包含LSA 的数据Router 1:
DD seq=x,I=1,M=1,MS=1
I 是第一个报文
M 是more 表示还有后续报文
MS 是表示Router 1 是Master
Router 2:
DD seq=y,I=1,M=1,MS=1
I 是第一个报文
M 是more 表示还有后续报文
MS 是表示Router 2 是Master
究竟谁是master 呢,就会选一个router id 大的作为
master
谁当了master 序列号就用谁生成的那个数,在这里应该
是Router 2 的y
exchange 和DR 开始交换数据,master 先发送lsdb 报文,此报文只是一个
index(如同一本书的目录)不包含实际的路由数据,slave 也发
送报文,看谁的序列号高,序列高的数据新,相邻路由器可以根
据数据库描述数据包的序列号与自身数据库的数据作比较,若发
现接收到的数据比数据库内的数据序列号大,则相邻路由器会针
对序列号较大的数据发出请求,并用请求得到的数据来更新其链
路状态数据库。
Router 1 先发送DD 报文序列号用master 的并且MS 字段为0
RouteR2 回应报文把序列号加 1 表示已经收到了刚才的DD 报文
并
且也包含自己的DD 报文,下一个Router 1 的DD 报文还用y+1
来表示因为slave 无权把序列号加1。如果DD 报文中的M=0
那么表示DD 报文发送结束
loading 装入状态,如果新加入的路由器的从DD 报文中看出那个是自己
需要的路由数据,则发送lsr 报文,请求发送数据,对端发送LSU
报文,此报文包含所需的全部数据。
full 收到LSU 报文后发送确认,完成充满状态。
Hello 包TTL 值是1,在以太网中每10 秒发送一次,而且不穿过路由器,通常OSPF 协