<p><span style="font-size:14px"> 上篇讲到OSPF协议基础,简单总结为 “<strong><span>三表五包七状态</span></strong><span>”;</span>今天我们来谈谈OSPF协商过程;</span><span style="font-size:14px">OSPF协商过程还是围绕OSPF五种数据包和七种状态来细化展开。</span></p><p>
</p><blockquote><p>状态与包分解
</p></blockquote><p>
</p><p><span style="font-size:14px"> 在 中,提到OSPF协议五个包,分别是<strong>Hello、<strong><span>DBD</span></strong>、<strong><span>LSR、<strong><span>LSU</span></strong>、<strong><span>LSAck</span></strong></span></strong></strong><span>;下面将分析协商过程中七状态如何结合五个包进行整个OSPF建立的协商交互过程。</span></span></p><p><span style="font-size:14px">
</span></p><p><span style="font-size:14px"/></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/7a2e89ad87f81a7d.jpeg" img-data="{"format":"jpeg","size":47422,"height":651,"width":779}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div>
<p/><p><span style="font-size:14px">
</span></p><p><span style="font-size:14px">如上图所示,OSPF启动开始使用Hello报文确定相互连接的邻居是否可以通信,如下图:
</span></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/92c24e92df0b1438.jpeg" img-data="{"format":"jpeg","size":37991,"height":705,"width":1080}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p><span style="font-size:14px">PS:OSPF的选路,是通过SPF算法计算出来的,而计算就有个计算方法,具体的计算方法后面张开说明,这里需要说明的是根据链路的开销值(Cost)和协议的优先级来选择路由路径的。</span></p><p><span style="font-size:14px">
</span></p><p><strong><span style="font-size:14px">关于带宽参考值说明:</span></strong></p><p><span style="font-size:14px">路由选择最优路径是根据开销值在选择,默认是根据接口链路带宽来计算的(可手动设置cost值),如OSPF有个默认带宽参考值100Mbps,而如果实际链路是1G,那么Cost值就是1,<span>计算公式为:接口cost=带宽参考值/接口带宽,取计算结果的整数部分作为接口cost值,cost越小越优先。在这里可以修改链路带宽参考值,现在企业内部网络带宽最少也是千兆链路,可修改带宽为10000Mbps为带宽参考值,如果是千兆链路cost值就是10,万兆链路就是1。</span>
</span></p><p><span style="font-size:14px">
</span></p><p><span><strong><span style="font-size:14px">OSPF支持的网络类型</span></strong></span></p><ol><li><p><span><strong><span style="font-size:14px">P2P--点到点网络</span></strong></span></p></li><li><p><span><strong><span style="font-size:14px">P2MP--点到多点网络</span></strong></span></p></li><li><p><span><strong><span style="font-size:14px">MA--广播多路访问网络</span></strong></span></p></li><li><p><span><strong><span style="font-size:14px">NBMA--非广播多路访问网络</span></strong></span></p></li></ol><p>
</p><p><span><strong><span style="font-size:14px">详细请了解该文章:</span></strong></span></p><p><span><strong><span style="font-size:14px">OSPF支持的网络类型
</span></strong></span></p><p><span><strong><span style="font-size:14px">
</span></strong></span></p><p><span style="font-size:14px">
</span></p><p><span style="font-size:14px"/></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/bbdda91729249329.jpeg" img-data="{"format":"jpeg","size":46277,"height":574,"width":1080}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p/><p><span style="font-size:14px">
</span></p><p><span style="font-size:14px">上图所示,OSPF 协议启动后,先寻找网络中的邻居( Neighbor ),也就是通过 Hello 报文确认可以双向通信,Hello报文交换,确定邻居关系。</span></p><p><span><strong><span style="font-size:14px">Down 失效状态</span></strong></span><strong><span style="font-size:14px">:</span></strong><span style="font-size:14px">这是邻居的初始状态,表示路由器还没有从邻居收到任何信息。</span></p><ol><li><p><span style="font-size:14px">停滞于此状态表明路由器没有从邻居处接收到Hello报文。</span></p></li></ol><p>
</p><p><span><strong><span style="font-size:14px">Attempt 尝试状态</span></strong></span><strong><span style="font-size:14px">:</span></strong><span style="font-size:14px">此状态只在<strong>NBMA</strong>网络上存在,表示路由器没有收到邻居的任何信息,但是已经周期性地向邻居发送了Hello报文;如果在Router Dead Interval的时间间隔内未收到邻居的Hello报文,则转为Down状态。</span></p><ol><li><p><span style="font-size:14px">停滞于此状态表明路由器向已配置的邻居发送了单播Hello报文,但没有收到该邻居的Hello报文。</span></p></li></ol><p>
</p><p><span><strong><span style="font-size:14px">Init 初始状态</span></strong></span><strong><span style="font-size:14px">:</span></strong><span style="font-size:14px">表示路由器已经从邻居收到了Hello报文,但是自己不在所收到的Hello报文的邻居列表中。这说明自己尚未与邻居建立起双向通信关系。</span></p><ol><li><p><span style="font-size:14px">停滞于此状态表明路由器收到了邻居的Hello报文,但Hello报文中没有包含接收路由器的OSPF RID(Router ID)。</span></p></li></ol><p><span style="font-size:14px">
前面三个阶段都是Hello报文的交互作用:下面简单说下Hello报文结构和作用</span>
</p><p><span style="font-size:14px">
</span></p><p><span style="font-size:14px"/></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/0c50306769e276f6.jpeg" img-data="{"format":"jpeg","size":24515,"height":318,"width":487}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p/><p><span style="font-size:14px">
</span></p>字段长度含义Network Mask32比特发送Hello报文的接口所在网络的掩码。HelloInterval16比特发送Hello报文的时间间隔。Options8比特可选项:<ol><li><p>E:允许Flood</p><p><span>AS-External-LSAs</span></p></li><li><p>MC:转发IP组播报文</p></li><li><p>N/P:处理Type-7 LSAs</p></li><li><p>DC:处理按需链路</p></li></ol>Rtr Pri8比特DR优先级。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举。RouterDeadInterval32比特失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。Designated Router32比特MA网络中DR的接口地址。若不存在则为0.0.0.0Backup Designated Router32比特MA网络中BDR的接口地址。若不存在则为0.0.0.0Neighbor32比特邻居,以Router ID标识。<p>
</p><p><span><strong><span style="font-size:14px">2-Way 双向通信状态</span></strong></span><span style="font-size:14px">:<span>表示路由器与邻居的双向通信关系已经建立(即已经建立起了邻居关系),但是尚未建立起邻接关系。</span></span></p><ol><li><p><span style="font-size:14px">停滞于此状态表明路由器彼此都收到了对方的Hello报文,并且都从Hello报文中发现了自己的OSPF RID。</span><span style="font-size:14px"><strong>对于以太网链路上的非DR/BDR路由器来说,这种状态是可以接受的。</strong></span></p></li></ol><p>
</p><p><strong><span style="font-size:14px">可以查看下wireshark抓包下的Hello报文:
</span></strong></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/8d33d1ef93c75151.jpeg" img-data="{"format":"jpeg","size":82797,"height":626,"width":1058}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><p><span style="font-size:14px">综上原理可得Hello报文作用:</span><span style="font-size:14px"><strong>用于发现邻居和维护邻居关系</strong></span>
</p><p><span style="font-size:14px"><strong>
</strong></span></p><p><span style="font-size:14px"><strong>PS:在MA网络中,</strong></span><span><strong><span style="font-size:14px">邻居状态在 2-Way 后,会进行 DR 和 BDR 选举。</span></strong></span></p><p><span><strong><span style="font-size:14px">什么是MA网络?</span></strong></span></p><p><span style="font-size:14px">MA 网络,即多路访问网络,是在同一个共享介质中连接多个设备的网络。网络中的任意两台设备都能直接进行二层通信。MA 网络有两种,一种是 BMA 网络,即广播型多路访问网络,比如以太网,典型场景就是一台以太网交换机连接着多台路由器,如果有一个广播数据发出来,整个网络中的路由器都能收到。另一种是 NBMA 网络,即非广播型多路访问网络,比如帧中继,只是帧中继不支持广播。</span></p><p>
</p><p><span style="font-size:14px">在 MA 网络中,n 台路由器都两两建立邻接关系,那么就有 n(n-1)/2 个邻接关系,会消耗大量的路由器资源,增加网络中 LSA 的泛洪数量。为了优化邻接关系数量,减少不必要的协议流量,OSPF 会在每一个 MA 网络中选举一个 DR(指定路由器)和一个 BDR(备用指定路由器)。</span></p><p>
</p><p><span style="font-size:14px">既不是 DR 也不是 BDR 的路由器叫做 DROther ,MA网络中所有 DROther 只和 DR 及 BDR 建立 OSPF 邻接关系,BDR 也和 DR 建立邻接关系,DROther 之间只停留在 2-Way 状态。这样,就有 <strong>2(n-2)+1 </strong>个邻接关系,数量得到优化。</span></p><p>
</p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/bc17f2f980d7cf2e.jpeg" img-data="{"format":"jpeg","size":68746,"height":1155,"width":667}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><p><span style="font-size:14px">DR 会侦听网络中的拓扑变化信息,并将变更信息通知给其它路由器。BDR 会监控 DR 状态,当 DR 发生故障时就接替它的工作。</span></p><p>
</p><p><span style="font-size:14px">DR 、BDR 的选举通过 Hello 报文实现,发生在 2-Way 状态之后。Hello 报文有路由器接口的 DR 优先级,取值范围是 0 ~ 255 ,默认值为 1 ,DR 优先级为 0 的接口没有 DR 和 BDR 的选举资格。</span></p><p>
</p><p><span style="font-size:14px">当接口激活 OSPF 后,它会查看网络中是否存在 DR ,如果有就使用已经存在的 DR ,也就是 DR 不可抢占,否则选择最高优先级的路由器成为 DR ,当优先级相等时,选择 Router-ID 最大的路由器成为 DR 。之后还会进行 BDR 的选举,选举过程与 DR 类似。</span></p><p>
</p><p><span style="font-size:14px">需要注意的是,DR 和 BDR 是一个接口级别的概念。某台路由器是 DR ,这种说法不准确,严谨的说法是:某台路由器的某个接口在这个 MA 网络中是 DR 。</span></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/31a5e53f1dc42269.jpeg" img-data="{"format":"jpeg","size":26770,"height":291,"width":789}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><p><span style="font-size:14px">在一个 MA 网络中,DR 要确保网络中的所有路由器有相同的 LSDB ,也就是确保 LSDB 同步。DR 使用组播地址 224.0.0.5 向网络中发送 LSU 报文,所有 OSPF 路由器都会侦听这个组播地址,并同步自己的 LSDB 。而 DROther 感知到拓扑变化时,向 224.0.0.6 发送 LSU 报文通告这个变化,DR 和 BDR 会侦听这个组播地址。</span></p><p>
</p><p><span style="font-size:14px"><strong>邻居已经发现,接下来就是ExStart和Exchange的过程,也就是链路状态信息传递过程,在这个过程,邻居之间交互DD报文。</strong></span></p><p><span style="font-size:14px"><strong>
</strong></span></p><p><span><strong><span style="font-size:14px">ExStart 信息交换初始状态</span></strong></span><span style="font-size:14px">:<span>邻居状态变成此状态以后,路由器开始向邻居发送DD报文。Master/Slave关系是在此状态下形成的,初始DD序列号也是在此状态下确定的。在此状态下发送的DD报文不包含链路状态描述。</span></span></p><ol><li><p><span style="font-size:14px">停滞于此状态表明邻居路由器之间的MTU不匹配或OSPF RID重复。</span></p></li></ol><p>
</p><p><strong><span style="font-size:14px">DD报文的主从选择</span></strong></p><p><strong><span style="font-size:14px">
</span></strong></p><p><strong><span style="font-size:14px"/></strong></p><p><strong><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/247ed18778b5d495.jpeg" img-data="{"format":"jpeg","size":27396,"height":439,"width":601}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div></strong></p><p/><p><strong><span style="font-size:14px">
</span></strong></p><p><span><strong><span style="font-size:14px">Exchange 信息交换状态</span></strong></span><strong><span style="font-size:14px">:</span></strong><strong><span style="font-size:14px">在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文。</span></strong></p><ol><li><p><strong><span style="font-size:14px">停滞于此状态表明邻居路由器之间的MTU不匹配。</span></strong></p></li></ol><p>
</p><p><span style="font-size:14px">路由器进入 Exchange 状态,向邻居发送描述自己 LSDB 的 DD 报文,DD 报文中包含 LSA 头部。DD 报文逐个发送,每个报文中都有 DD 序列号,DD 序列号由 Master 路由器决定,序列号在 DD 报文的交互过程中递增,确保交互过程的有序性和可靠性。</span></p><p>
</p><p><span style="font-size:14px">DD 报文用于描述 LSDB ,携带 LSDB 中 LSA 的头部数据,而非完整的 LSA 内容。在路由器邻接关系的建立过程中,先用空的 DD 报文协商 Master/Slave ,然后用 DD 报文描述各自的 LSDB ,这种 DD 报文包含 LSDB 里的 LSA 头部。路由器可以使用多个 DD 报文来描述 LSDB ,为了保证 DD 报文传输的顺序和可靠,Master 路由器使用序列号字段递增的方式,主导整个 LSDB 描述过程。</span></p><p>
</p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/fd13763d872e35a0.jpeg" img-data="{"format":"jpeg","size":37429,"height":759,"width":619}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><p><strong><span style="font-size:14px">DD报文结构:</span></strong></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/5af972213add1dde.jpeg" img-data="{"format":"jpeg","size":45987,"height":362,"width":816}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><ol><li><p>Interface MTU:16位,此接口最大可发出IP报文的长度,华为默认不填充为0。</p></li><li><p>Options:含义同OSPF报文头一致。</p></li><li><p>I位:1位,当连续发送多个DD报文时,是第一个DD报文时为1,否则为0。</p></li><li><p>M位:1位,当连续发送多个DD报文时,后续没有LSA头要传时,则为0。</p></li><li><p>M/S位:1位,当两台路由器交换DD报文需选举主从,RouterID大的为主,当值位1则为Master。</p></li><li><p>DDS equence Number:32位,DD报文序列号,主从交互DD利用序列号保证DD报文传输的可靠性和稳定性。</p></li><li><p>LSA Headers:本地LSDB的头部信息。</p></li></ol><p>
</p><p><strong><span style="font-size:14px">DD报文抓包</span></strong>
</p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/dc2a39bae460e744.jpeg" img-data="{"format":"jpeg","size":43168,"height":458,"width":1080}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p/><p><span style="font-size:14px">DD报文作用:</span><b>用来描述本地LSDB的摘要信息,用于同步数据库</b></p><p>
</p><p><span><strong><span style="font-size:14px">Loading 信息加载状态</span></strong></span><span style="font-size:14px">:在此状态下,路由器与邻居之间相互发送LSR报文、LSU报文、LSAck报文。</span></p><ol><li><p><span style="font-size:14px">停滞于此状态表明可能存在硬件故障或硬件故障或MTU不匹配。</span></p></li></ol><p>
</p><p><span style="font-size:14px">接下来,路由器进入 Loading 状态,路由器向邻居发送 LSR 请求 LSA 的完整信息。邻居使用 LSU 进行回应,LSU 报文里有 LSA 的完整信息。在收到 LSU 报文后,路由器需要发送 LSAck 对 LSA 进行确认。</span></p><p><span style="font-size:14px">
</span></p><p><strong><span style="font-size:14px">LSR报文格式:</span></strong><span style="font-size:14px">用于向邻居请求完整的LSA。{注意:只会请求自己没有的LSA}
</span></p><p><span style="font-size:14px"/></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/e6863feffff6e632.jpeg" img-data="{"format":"jpeg","size":43344,"height":383,"width":775}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p/><p><span style="font-size:14px">
</span></p><ol><li><p><span style="font-size:14px">LS type:32位,LSA的类型</span></p></li><li><p><span style="font-size:14px">Link State ID:32位,根据LSA中的LSA Type和LSA Description在路由域中描述一个LSA。</span></p></li><li><p><span style="font-size:14px">Advertising Router:32位,产生此LSA的路由器Router ID。</span></p></li></ol><p>
</p><p><span style="font-size:14px">LSA常见的类型:</span></p><p><span style="font-size:14px">type-1=Router LSA</span></p><p><span style="font-size:14px">type-2=Network LSA</span></p><p><span style="font-size:14px">type-3=Network Summary LSA</span></p><p><span style="font-size:14px">type-4=ASBR Summary LSA</span></p><p><span style="font-size:14px">type-5=AS External LSA</span></p><p><span style="font-size:14px">type-6=Group Membership LSA</span></p><p><span style="font-size:14px">type-7=NSSA LSA</span></p><p>
</p><p><span><strong><span style="font-size:14px">日常使用的有1、2、3、4、5、7</span></strong></span></p><p><strong><span style="font-size:14px">后续文章讲详细讲解LSA
</span></strong></p><p>
</p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/b1a96bc7899c850d.jpeg" img-data="{"format":"jpeg","size":97542,"height":674,"width":896}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><p><strong><span style="font-size:14px">LSU报文格式:</span></strong><span style="font-size:14px">LSU报文包含的是完整的LSA信息,用于回复LSR报文。并且当路由器感知到网络发生变化时也会泛洪LSU。</span></p><p><span style="font-size:12px">PS:注意:非DR/BDR路由器的LSU报文是发送给224.0.0.6地址的,而DR收到这个报文后又会把它发送给224.0.0.5[所有的OSPF路由器]。这样就大大的减少的网络开支,有利于网络的优化。</span></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/2cae20d41fe6ffc1.jpeg" img-data="{"format":"jpeg","size":38363,"height":316,"width":750}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><ol><li><p><span style="font-size:14px">Number of LSAs:32位,表示此Update中包含的LSA数量。</span></p></li><li><p><span style="font-size:14px">LSAs:多个完整的LSA内容。</span></p></li></ol><p>
</p><p>
</p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/7cb2698ce9496cdd.jpeg" img-data="{"format":"jpeg","size":145097,"height":844,"width":906}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><p><strong><span style="font-size:14px">LSAck报文格式:</span></strong></p><p><span style="font-size:14px">链路状态确认报文,用于确认LSU报文;为了保障每条LSA可达,需要LSAck来对每天收到的LSA进行确认。</span></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/56f90924e1809dc5.jpeg" img-data="{"format":"jpeg","size":34619,"height":285,"width":763}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><p><span style="font-size:14px">LSA Headers:LSA头列表,OSPF通过LSA头对完整的LSA做确认,一份LSA可以对多份LSU中的LSA做确认。</span></p><p><span style="font-size:14px">
</span></p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/2b1a2daa04935da7.jpeg" img-data="{"format":"jpeg","size":84850,"height":816,"width":1030}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p><p><span><strong><span style="font-size:14px">Full 完全邻接状态:</span></strong></span><span style="font-size:14px">表示LSDB同步过程完成,路由器与邻居之间形成了完全的邻接关系。</span></p><p>
</p><p><span style="font-size:14px"><strong>整个状态变化的报文交互情况:</strong></span>
</p><div class="image-package"><img src="https://img.haomeiwen.com/i2084007/82bc56e7cdf31e7c.jpeg" img-data="{"format":"jpeg","size":65066,"height":742,"width":739}" class="uploaded-img" style="min-height:200px;min-width:200px;" width="auto" height="auto"/>
</div><p>
</p>
网友评论