0
点赞
收藏
分享

微信扫一扫

OSPF深入浅出

后来的六六 2022-03-16 阅读 85

OSPF 概念

使用Hello报文建立邻居关系,接口如果有Sub辅助地址,始终由主地址发送hello报文,目的组播地址 224.0.0.5
OSPF协议直接封装在IP报文中,协议号89,证明IPV4和OSPF协议直接存在相辅相成的关系。OSPF是一种运行在IPV4(网络层)之上的路由协议。

OSPF Header报文字段,每种OSPF报文包含

1、version v2   :描述ospf协议版本
2、message type :描述ospf报文类型,1 hello , 2 DBD ,3 LSR  4, LSU  5,LSACK
3、packet leg   : 描述ospf报文长度
4、router id    :描述设备的router id
5、area id      : 接口所属的ospf区域
6、checksum     :校验和
7、auth type    :0 null(空) ,1 明文 ,2 md5
8、auth data    : 认证信息

OSPF Hello packet 报文字段

network mask    :接口掩码
hello interval  :hello报文发送间隔,P2P ,broadcast 默认10s,P2MP,NBNA默认30s
router priority :接口优先级,用在broadcast,NBMA型链路选举DR,BDR,默认为1,取值范围0-255
dead interval   :邻居失效时间,默认为hello间隔4倍
DR				:该链路上DR接口的IP地址,P2P,P2MP 该字段为0.0.0.0
BDR				:该链路上的BDR接口的IP地址,P2P,P2MP 该字段为0.0.0.0
option			:N bit = 0 代表不能交换7类LSA   ,  E bit = 1  代表能交换5类LSA

任何情况下要满足的建立邻居关系的条件

1、router id 不能冲突			(因为邻居建立过程中有一个主从关系的选举,router ID大的,被选举为DR,如果router ID相同,那么连2-way状态都到不了)
2、area id 必须相同
3、认证类型要一致
4、认证数据要匹配
5、hello interval 要一致
6、dead interval 要一致
7、E bit ,N bit 要一致

**

## 特点场景下对其他参数的要求

1、P2P链路不要求地址在同一网段,不要求掩码一致
2、broadcast、NBMA 要求地址必须在同一个网段、掩码必须一致
3、P2MP 默认要求地址必须在同一网段,默认情况下要求掩码一致,但可以通过命令忽略对掩码的检测

其他报文对邻居关系的影响:DBD报文中IP MTU值要一致,默认情况下华为设备不对DBD报文的IP MTU值做检测,华为设备的DBD 报文的IP MTU 默认为0,思科设备默认位置为接口IP MTU 的大小;
当设备收到DBD报文时,会检测DBD报文中IP MTU 值是否小于自身接口的IP MTU,如果小则接受并处理,如果大则丢弃

ospf mtu-enable 作用(接口敲)
1、对接受的DBD报文做IP MTU的检测
2、对自身发送的DBD报文,IP MTU值设置为自身接口的MTU值

OSPF的报文

down			代表还没发现任何邻居的存在(为接受到hello报文)
init			收到了邻居的hello包,但hello报文中没发现自己的router ID,此时你发现了邻居的存在,但并不代表邻居已经发现了你,也称为one-way(一次握手)
two-way			收到了邻居的hello包,并在hello报文中发现了自己的router ID

					PS:采用3次握手建立邻居关系,是OSPF协议可靠性的体现

			two-way 之后,drother之间就只到two-way状态,不会进行LSDB的同步,其他情况下的邻居会继续进行LSDB的同步,进入到exstart状态,开始发送DBD报文。
			exstart 发送DBD报文只做主从选举,而不会携带任何LSDB中的LSA的头部信息;并各自生成表达自身是初次发送DBD报文,后续还希望继续发送DBD,并自身是master,
			随机生成DBD报文序列号,进行主从选举。彼此交换该DBD报文后,根据router id的大小完成主从选举,router id 大的成为master,router id 小的成为slave.
			
			DBD报文字段 I = 1 表示第一次发送DBD报文,M = 1 表示DBD报文还没发完,后续还会发送DBD报文,MS = 1 希望成为master
			1.1.1.1 		I = 1		M = 1  		MS = 1		SEQ = X
			2.2.2.2			I = 1       M = 1		MS = 1		SEQ = Y
							
			主从选举完毕后,进入exchange 状态,slave路由器开始发送携带自身LSDB中的LSA头部信息的DBD报文,并使用exstart状态master路由器的序列号作为该DBD报文的序列号。

			slave   1.1.1.1 	I = 0		M = 1/0		MS = 0 		SEQ = Y	 		LSA头部
			(M 中1代表LSDB中LSA的头部信息还没发送完,后续还需要继续通过DBD报文发送LSA头部信息,0 代表LSDB中所有LSA的头部已经发送完毕)	
			master  2.2.2.2		I = 0 		M = 1/0  	MS = 1		SEQ = Y+1		LSA头部
			slave   1.1.1.1     I = 0		M = 1		MS = 0 		SEQ = Y+1		LSA头部
			master  2.2.2.2		I = 0		M = 1		MS = 1		SEQ = Y+2		LSA头部
			slave   1.1.1.1		I = 0       M = 0		MS = 0 		SEQ = Y+2		LSA头部
			master	2.2.2.2		I = 0		M = 0 		MS = 1		SEQ = Y+3		LSA头部
			slave	1.1.1.1		I = 0		M = 0		MS = 0 		SEQ = Y+3
			
			slave 总是用master的序列号向master发送DD报文;master将slave的序列号加1,向slave发送DD报文。
			
			为什么要采用隐式确认?
				原因DD报文携带自身LSDB中所有的LSA头部信息,信息比较多,一一确定处理起来比较繁琐,消耗设备资源;
				影响邻居收敛的时间,所以采用相对简单的隐式确认机制。
			
			exchange完成后,邻居根据DBD报文的头部信息和自身LSDB的头部信息作比较,进行LSDB的同步。
				同步的规则:交换彼此没有的LSA以及新的LSA替换老旧的LSA,实现邻居LSDB的一致性。
				
			为了实现同步,对LSA的数据结构做出定义要能实现如下功能:
				1、如何实现唯一的区分一条LSA
				2、如何实现LSA的新的判断
				而这些功能就是LSA的头部信息(摘要信息),DBD报文携带的正是LSA的头部信息;exstart状态下DBD不携带LSA头部。
				LSA通过6个参数来标识自身的新旧程度
				
					如何实现唯一区分一条LSA呢?
						ls type
						link state ID
						adv router
						用于区分一条LSA,3个参数相同则认为是同一条LSA,如果都有这条LSA,则需要进一步进行新旧判断,用新的去同步旧的。
					
					如何实现LSA的新旧判断呢?通过3个参数来判断新旧。
						sequence number
						checksum
						ls age
						1、比较序列号越大越新
						2、seq相同,比较checksum,越打越新
						3、checksum相同,则判断lsa age 是否等于3600s,如果等于3600s,则认为最新;用于删除这条lsa.
						4、lsa age 如果都不等于3600s,则判断lsa age的差值,大于900S,则lsa age 小的最新,小于900s则认为是相同的lsa.
						   同DBD报文中携带的LSA的头部信息,完成LSDB的差异比较,向邻居发送LSR,请求自身需要的LSA .
						   
			为什么要设计DD报文呢?实现按需同步,提高收敛速度。
				exchange进入loading 状态,发送LSR,LSU,LSAck完成LSA的交换。
			
exstart			做主从选举,为实现可靠的DBD同步做准备。
exchange		
举报

相关推荐

0 条评论