华为-HCNP-ospf-协议包含的5个报文及报文字段--05

ospf封装:Layer 2|ipv4|ospf|FCS

Ospf的五种报文:1.hello,2.DBD数据库描述,3.LSR链路状态请求,4.LSU链路状态更新,5.LS ACK链路状态确认

ospf:包含两个部分,ospf报头和ospf载荷内容

报头包含以下字段:1.ospf版本(当前使用版本二,版本二针对ipv4,版本三针对ipv6)

2.类型(hello为1,DBD为2等等)3.报文长度(整个ospf报文长度多少字节)4.路由器ID 5.区域ID(如何让别人知道你属于哪个区域,你在发送hello的时候携带)6.校验和(用来校验报文再发送过程中是否出现问题)7.认证类型8.认证密钥(7和8这两个如果做了认证会有,没做就没,认证类型分为三级,0(不做认证)、1(明文认证,没有安全性一抓包就知道)、2(密文认证))9.data

华为-HCNP-ospf-协议包含的5个报文及报文字段--05_第1张图片

hello报文:

建邻居要保证报头里的一些字段匹配:version,routerID不能冲突,直连接口宣告进相同区域,如果做了认证,认证类型和认证密钥要相同。

Hello interval :hello时间

Options:里面有两个关键位,一个叫E位,用来描述这个区域支持外部路由存在的,正常情况下路由器通过骨干区域或常规非骨干区域在发送hello时,E位都会置1,代表在这个区域内支持ASBR并且支持外部路由。N用来描述在这个区域内是否支持NSSA区域的外部路由正常情况下骨干区域或常规非骨干区域都不是NSSA区域,肯定不支持NSSA的七类LSA在这个区域内发送。两台路由器建邻居要保证这两个位要匹配,也就说这两台路由器要宣告直连接口进入ospf,不光要宣告进同一个区域,还要保证区域类型都一致(NSSA,stub,常规),stub区域E位置0,N位置0

Router priority:路由器优先级

修改hello时间dead时间会自动修改,但修改dead时间hello时间不会回调,四分之一有可能除不尽

Neighbor:用来向外展示当前接收过谁的hello包,hello包在报头中包含了发送者路由器ID,如果给你发送的hello中neighbor字段为空,意味当前没有收到任何邻居路由器发送的任何hello。

在hello包的载荷中,要保证大家hello时间dead时间一致。flag位必须一致就是要认为我们所处的区域是同一个区域。建邻居使用的网络类型如果是广播,点到点或者NBMA要求大家掩码一致,地址可以不再一个子网段。

ospf适合中到大型网络运作,它的LSDB中难免有重复的LSA,为避免低效率的LSA交互,可以通过交互DBD。

不算attempt,ospf的邻接关系状态级有7级down、initial、two-way、exstart、exchange、loading、full。如果算上NBMA网络的话加上attempt一共有8种,attempt一般在down和initial之间存在的过度状态,因为他需要通过peer命令,来指定单播的命令包。

当在一个路由器接口宣告ospf之后,通过这个接口没有接收任何报文情况下和任何路由器之间邻接关系都是down的,down代表这个路由器当前没有收到任何路由器发来的任何报文,当接口收到邻居通告的hello,但这个hello中neighbor字段中没有看到自身的路由器ID,代表咋们彼此之间只是单通的邻居,只能证实邻居发送的hello能收到,但是你发的hello邻居能不能收到不一定,反正目前没有收到。再往下,two-way,你收到的hello报文中neighbor字段中包含了自身RID,这时邻居建好,接下来是否往下要看你们这块直连链路网络类型到底是广播NBMA还是点到点点到多点,前者需要建邻居之前选一个DR/BDR来做邻接关系建立的优化,后者可以自由的直接往下建,因为你们之间只有可能建立一个邻居,没有任何优化可言。选举完DR/BDR,进入LSA交互阶段,发送DBD,所以会进入exstart状态下,双方会先交互一个空的DBD,由于这个空的DBD只有在最一开始交互的第一个DBD中会这么设置,所以也将这个空的DBD叫做first DBD,载荷为空,DBD中有一个flag字段,里面有三个字段I、M、M/S,第一个字段置0置1用来描述发送DBD是不是第一个,M描述这个DBD后面要不要发送其他DBD,M/S用来描述希望我做Master还是Slave,当然双方交互的first DBD这三个都是111,综合来看flag字段的值就是0x7,因为发的都是第一个后续肯定还有,都认为自己是Master,这个DBD中会包含一个RID用来比大小,除此以外还有MTU,这个双方不需要匹配,因为华为没有开启MTU一致性检测,接下来交互完first DBD后,Slave路由器会向master做一个空的DBD的隐式确认,来承认主从关系,接下来会沿用序列号,发送的确认包I位置0,M位置1,M/S置0,flag字段的值是2,在exchange过程中双方开始交互带有LSA报头的DBD,这样彼此了解到对方的LSDB中有哪些LSA,这个交换过程就是由主路由器带动Slave路由器发起的基于隐式确认的DBD交互过程。Loading:知道对方的LSDB后,会向对方发送LSR,对方回应LSU,再给对方发LS ack,当LSR为空表时,相当于LSDB已经同步了,在同步一瞬间邻接关系就会到达full,就是所谓的邻接。然后就可以正常传递LSA,通过周期性发送hello来维护邻接关系状态。

attempt邻接关系专门用于NBMA网络环境,例:

r1--r2

r1通过NBMA网络环境连接r2,在这种环境下运行ospf接口是不能主动发送组播的hello,因为这是网络类型决定的,网络类型不允许通过这个接口直接发送hello只能发单播包,这个单播包只能通过peer命令指定,当peer指定好了neighbor之后,就会以单播形式来吧hello发送走。此时r1指好peer,然后从单播发送hello开始,邻接关系就是attempt。如果我给你单播发送hello但是目前没有收到回应,如果迟迟没有在r2上指这个peer命令,此时我给你连续发送4次hello,我都没有收到回应的话,这个邻接关系就会回到down,当第五次发送hello时又会到达attempt。

DBD:Ospf适合中到大型网络运作,可能有共同邻居,意味LSDB中有相同的LSA,为了避免低效率LSA交互,可以通过交互DBD,DBD里面放的是一系列LSA报头。现在要同步LSA,就要先发DBD,彼此交互自己的本地LSADB中有哪些LSA,对于自己LSDB中没有的向对方发送LSR请求

LSR:LSR里非常明确的告诉需要哪条LSA,里面包含你所请求的LSA报头,但其实包含的是LSA的三元组,LSA的类型、名称和始发者路由器的RID,

LSU:LSU包含LSA的明细信息,LSA不能直接发,要封装在LSU中,对方收到LSU要回应LS ACK,确认包是针对LSU重的LSA确认的,将LSU中收到的LSA报头放在LS ack中发走。如果有一些没有收到就要重传。

LS ack:显式确认,包含LSA报头。

通过发送一个特殊的包来进行确认叫显式确认,ospf需要确认是因为他的封装是直接载荷封装在ip报头内的,ip协议是个无连接协议,各式各样的二层封装协议也都是无连接的,基于这些无连接协议不能保证ospf报文传输的可靠性,所以ospf自身需要设计一些可靠传输机制,所以确认和重传都是它从TCP那里学到的。DBD通过隐式确认方式来设计,在确认时不拿一个独立的报文确认,拿我所确认的相同类型的报文既做回应又做确认,我在发送DBD的时候包含一个序列号X,在给我发送序列号的时候为了证明是确认,你发送的DBD序列号也使用X。用来发送序列号的这端以及用来初始发送第一个带有LSA报头的DBD端称为Master,另外一端称为SLave,这两个是通过选举得到的,选举比较的就是路由器ID,大的做Master,由Master决定数据包的序列号,初始化DBD的发送。开始双方都发送一个空的DBD,里面包含路由器信息,来确定主从,Slave路由器会向主路由器发送确认。

你可能感兴趣的:(笔记)