OSPF邻居关系如何建立?
1.使用hello报文建立邻居关系
2.OSPF中利用设备上的主地址来发送hello报文
3.OSPF是直接封装于ip报文中,协议号89,证明IPV4和OSPF协议存在相辅相成的关系
4.OSPF是一种运行与IP层之上的路由协议,网络层之上
5.OSPFv2本身依赖于IPV4的环境
-------------------------------------------------
OSPF的头部是由两部分组成:头部+报文类型
OSPF的报头为8个字段:
1.版本--OSPF的版本 V1 V2 V3
2.Message type:消息类型,hello=1,DBD=2,LSR=3,LSU=4,LSACK=5
3.Packet length:描述报文的总长度
4.Sorurce OSPF router:发送OSPF报文的源路由器的RID
5.Area ID:OSPF路由器接口所在的区域
6.checksum:校验和
7.Auth Type:认证类型,null-无认证=0,明文认证=1,密文MD5认证=2
8.Auth data:认证信息
-----------------------------------------------------
OSPF的hello报文:
1.network mask:网络掩码
2.hello interval:hello报文发送周期,默认MA,P2P为10s,P2MP,NBMA默认为30s
3.Router priority:OSPF路由器接口优先级,用于在MA,NBMA网络下选举DR和BDR,默认为1,取值范围为0-255
4.dead interval:邻居失效时间,为hello interval的4倍
5.DR:本网段DR所在接口的ip地址,P2P,P2MP该字段为0.0.0.0
6.BDR:该链路上DR接口的ip地址,P2P,P2MP该字段为0.0.0.0
7.options:所有bit位置1时代表支持该特性,置0代表不支持。
1.DN位:用于MPLS VPN双归中防止环路。
2.O位:始发路由器支持Opaque LSA(类型9,类型10和类型11,mpls多协议标签环境)
3.DC位:代表始发路由器支持按需链路上的OSPF的能力,置为1.
4.EA位:当始发路由器具有接收和转发external-attributes-LSA(type8 LSA,BGP外部属性)的能力时,该位被置位。
5.N位,只用在hello数据包中,N=1表明路由器支持7类LSA,N=0表明该路由器不接收和发送NSSA LSA.
6.P位:只用在NSSA LSA,该位将告诉NSSA区域的ABR实现7转5操作。
7.MC位:当始发路由器支持转发组播数据包能力时,置位,目前已被淘汰MOSPF
8.E位:当始发路由器具有接受外部LSA的能力时,被置位,在所有5类LSA和始发于骨干区域以及非末节区域的LSA中,该位置1;始发于末节区域的LSA中,该位置为0,如果hello报文中该位置为1代表该路由器接口具有接收和发送5类LSA的能力
9.MT位:表示始发路由器支持多拓扑OSPF
-------------------------------------------------------
OSPF建立邻居的条件:
1.router-id不能冲突
2.area ID要一致
3.auth type auth data要一致
4.hello interval要一致
5.dead interval要一致
6.ebit,nbit位要一致
--------------------------------------------
特定场景下对其他参数的要求:
1.P2P链路不要求对端接口ip地址和自己在一个网段,不要求掩码一致。
2.broadcast,NBMA要求地址必须在一个网段,掩码必须相同。
3.P2MP要求地址必须同一个网段,默认情况下要求掩码一致,但可以通过命令忽略对掩码的限制。
4.其他报文对邻居关系的影响:DBD报文中ip mtu值要一致,默认情况下华为设备不对DBD报文中的mtu做检测,华为设备DBD报文中的ip mtu默认为0,如果开启mtu检测功能,默认为1500。
5.开启了mtu检测功能以后,当设备收到DBD报文时,会检测DBD报文中的ip mtu值是否小于自身接口的ip mtu,如果小于则处理,如果大于则丢弃报文。(思科设备默认开启ip mtu检测,默认接口ip mtu值为1500)
6.接口下ospf mtu-enable的作用是:对接收的DBD报文做ip mtu检测;对自身发送的DBD报文,ip mtu值设置为自身接口的ip mtu值。
------------------------------------------------
OSPF的邻居建立过程:
状态:
down:代表没有发现任何存在的邻居,没有收到任何邻居的hello
init:收到邻居的hello包,但hello包中没有发现自己的RID,此时代表了发现了邻居的存在,邻居没有发现你的存在one-way,单向邻居
Two-way:收到邻居hello包,并且在hello包中看到了自己的RID。
------三次握手既可以达到双向邻居关系,是OSPF可靠性的一种体现
Two-way状态之后,drothers之间就知道2-way状态,不进行LSDB的同步,其他情况会继续往下进行LSDB的同步,进入exstart状态
exstart状态:做主从选举,为实现可靠的DBD同步做准备。
1.exstart发送的DBD报文只做主从选举,而不会携带任何的LSDB中LSA的头部信息,
2.并各自表达自身是初次发送DBD报文,后续还希望继续发送DBD报文,并宣告自身为master,随机生成DBD序列号。
3.彼此交换DBD报文后,根据RID的大小选举出master(RID大的成为master,RID小的成为slave)完成主从选举。
4.主从选举完成后,进入exchange状态。
5.I=1-代表这是第一个DBD报文,M=1代表后面还有更多的DBD报文,MS=1代表自己是主设备。
---------------------------------------
exchange状态:
1.salve设备开始发送携带自身LSDB中LSA的头部信息的DBD报文,并使用master设备提供的序列号作为改DBD报文的序列号。
2.master设备收到以后,也会发送DBD报文给对方,并且以收到的对方发来的DBD报文携带的序列号加1的方式向对端做隐式确认。
3.如果对端没有收到本设备发送的DBD报文,那么就不能进行基于未收到的DBD报文携带的序列号做加1的操作,也就是说发送这个DBD报文的设备无法收到隐式拒绝的DBD报文,则会认为对方没有收到,需要进行重传,默认重传间隔为5s。
4.从设备总是使用主设备的序列号发送DBD报文,主设备收到以后总是以序列号加1的方式进行隐式确认,如果从设备还有后续还有DBD报文,将继续使用主设备发过来的确认报文中的序列号再次发哦是那个DBD报文,以此类推,保障DBD报文交互过程中的可靠性。
5.彼此互相都要做确认,保证可靠。
6.为什么要采用隐式确认?原因DD报文携带自身LSDB中所有LSA的头部信息,信息比较多,确认处理起来比较繁琐,消耗设备资源,影响邻居收敛速度,所以采用相对简单的隐式确认机制。
--------------------
1.exchange状态完成后,邻居根据DBD报文中的头部信息和自身LADB的头部信息做比较,进行LSDB同步。
2.同步的规则:交换彼此没有的,或者替换老旧的LSA,实现LSDB的一致性,最终双方的LSDB达到统一个状态(FULL)
3.为了实现同步,对LSA的数据结构做出定义需要满足以下条件:
1.唯一的区分一条LSA
2.对LSA的新旧进行判断
4.DBD报文通过携带LSA的头部信息来唯一的区分和判断LSA的新旧(exstart状态下DBD报文不携带LSA的头部信息)
5.LSA通过以下6个参数来标识自身的头部信息和新旧程度:
1.LSA的老化时间
2.链路状态的类型(LSA的类型)
3.链路状态ID
4.ADV router
5.序列号
6.校验和
-------------其中
1.链路状态的类型(LSA的类型)
2.链路状态ID
3.通告路由器
--------------------用于唯一标识一条LSA,当对端收到以后,发现自己的LSDB中没有该LSA,则会通过LSR进行请求,LSR报文中携带的就是这三要素,三个参数相同则认为是同一条LSA。
-----------------------------------
如果彼此都有这条LSA,则需要进行新旧程度判断,用新的去替代旧的,如何实现新旧判断?
通过以下三个参数来判断LSA的新旧程度:
1.LSA的Seq
2.LSA的checksum
3.LSA的老化时间
A:首先比较序列号,越大越新
B:如果Seq相同,比较checksum,越大越新
C:如果checksum相同,比较LSA age时间,是否等于3600s,如果等于3600s,则认为最新,并用新的替换掉旧的LSA,然后由于老化时间到期,删除这条LSA。
D:LSA age如果都不等于3600s,则比较LSA age,如果大于900s,则最小的LSA age为最新,如果都LSA age都小于900s,则认为这条LSA是同一条LSA。
------通过DBD中携带的LSA的头部信息,完成LSDB的差异比较,向邻居发送LSR,请求自身需要的LSA。(按需同步)