在实际组网中,有时会出现一种特殊的现象——单向链路(即单通)。所谓单向链路是指本端设备可以通过链路层收到对端设备发送的报文,但对端设备不能收到本端设备的报文。单向链路会引起一系列问题,比如生成树拓扑中存在环路等。
以光纤连接为例,单向链路可分为两种类型:一种是光纤交叉相连,另一种是一条光纤未连接或一条光纤断路。如图 1所示,是正确的光纤连接与上述两种类型单向连接的对比示意。
DLDP(Device Link Detection Protocol,设备链路检测协议)可以监控光纤或铜质双绞线的链路状态。如果发现单向链路存在,DLDP会根据用户配置,自动关闭或通知用户手工关闭相关端口,以防止网络问题的发生。
DLDP是链路层协议,它与物理层协议协同工作来监控设备的链路状态。物理层的自动协商机制进行物理信号和故障的检测;DLDP进行对端设备的识别、单向链路的识别和关闭不可达端口等工作。二者协同工作,可以检测和关闭物理和逻辑的单向连接。如果链路两端在物理层都能独立正常工作,DLDP会在链路层检测这些链路是否正确连接、两端是否可以正确的交互报文。这种检测不能通过物理层的自动协商机制实现。
DLDP协议的状态类型如表 1所示。
表 1 DLDP协议状态
状态 | 说明 |
Initial(初始) | DLDP协议未使能时的初始化状态 |
Inactive(非活动) | DLDP协议已使能,但是链路down时所处的状态 |
Active(活动) | DLDP协议已使能且链路up,或者清空邻居表项后所处的状态 |
Advertisement(通告) | 所有邻居双向连通(two way)或者处于Active状态超过5秒后进入的状态,这是一种没有发现单向链路时的比较稳定的状态 |
Probe(探测) | 收到一个未知邻居的报文后进入的状态,此时将发送探测报文检测链路是否为单向链路。该状态启动Probe发送定时器,为每个需要探测的邻居启动一个Echo等待定时器 |
Disable(单通) | DLDP协议检测到单向链路,或在加强模式下邻居消失时的状态。此时端口不再接收和发送除DLDPDU以外的报文 |
DelayDown(延迟down) | 当DLDP状态处于Active状态、Advertisement状态或Probe状态时,如果收到端口down事件,不会立即删除邻居、进入Inactive状态,而是先进入临时的DelayDown状态 在该状态下,DLDP邻居信息仍然被保留,同时启动DelayDown定时器 |
DLDP协议工作过程中需要使用到的定时器如表 2所示。
表 2 DLDP协议中的定时器
定时器 | 说明 |
Active发送定时器 | 发送带有RSY标记的Advertisement报文的时间间隔(缺省为1秒):即在Active状态下每秒发送1个带RSY标记的Advertisement报文,最多发送5个 |
Advertisement发送定时器 | 发送普通Advertisement报文的时间间隔(缺省为5秒) |
Probe发送定时器 | Probe发送定时器的时间间隔为1秒:即在Probe状态下每秒发送2个Probe报文,最多发送10个 |
Echo等待定时器 | 在DLDP切换到Probe状态或启动加强探测时启用Echo等待定时器(超时时间为10秒)。若该定时器超时后仍未收到来自邻居应答本端的Echo报文,则将本端的状态置为单通,并将状态机转到Disable状态,发送Disable报文,并根据用户配置的DLDP Down模式,提示用户手动或者自动关闭本端口,同时删除该邻居表项 |
邻居老化定时器 | 每个新邻居加入时都要建立邻居表项,并启用相应的邻居老化定时器,当收到邻居报文时刷新相应的邻居表项和邻居老化定时器: l 在普通模式下,若该定时器超时后仍未收到邻居发来的报文,则发送带有RSY标记的Advertisement报文,同时删除该邻居表项 l 在加强模式下,若该定时器超时后仍未收到邻居发来的报文,则启用加强定时器 邻居老化定时器的超时时间是Advertisement定时器的3倍 |
加强定时器 | 在加强模式下,若邻居老化定时器超时后仍未收到邻居发来的报文,则对该邻居启用加强定时器(超时时间为1秒)。在启用了该定时器之后,每秒向邻居发送1个Probe报文,连续发送8次 |
DelayDown定时器 | 当DLDP处于Active、Advertisement或Probe状态时,如果收到端口down事件,不会立即删除邻居并进入Inactive状态,而是先进入DelayDown状态并启动DelayDown定时器(此时仍保留DLDP邻居信息,且只响应端口up事件): l 若该定时器超时后仍未收到端口up事件,则删除DLDP邻居信息并进入Inactive状态 l 若该定时器超时前收到了端口up事件,则返回到原来的DLDP状态 |
恢复探测定时器 | 恢复探测定时器的时间间隔为2秒:即处于Disable状态下的端口每2秒发送1个RecoverProbe报文,用于检测单向链路是否恢复 |
DLDP协议有如下两种工作模式:
l 普通模式:在该模式下,一旦有邻居老化定时器超时,只是在删除该邻居表项的同时发送一个带RSY标记的Advertisement报文。
l 加强模式:在该模式下,一旦有邻居老化定时器超时,则启动加强定时器,每1秒发送1个Probe报文(连续发送8个)用于主动探测该邻居,如果Echo等待定时器超时仍未收到来自邻居的Echo报文,则进入Disable状态。
表 3 DLDP协议工作模式与邻居表项老化
DLDP协议工作模式 | 邻居老化后是否主动探测该邻居的存在 | 邻居老化定时器超时后是否立即删除该邻居表项 | 邻居老化定时器超时后是否启用加强定时器 |
普通模式 | 否 | 是 | 否 |
加强模式 | 是 | 否 | 是(加强定时器超时后开始发送Probe报文) |
加强模式的目的在于检测网络黑洞,防止出现一端up而另一端down的情况。有些设备在端口配置为强制速率和强制全双工模式时,会出现如图 2所示的情况,此时Device B的端口虽已down掉,但由于普通的链路层协议无法检测出来,因此Device A的端口还处于up状态。在加强模式下,Device A的端口在邻居老化定时器超时后会进行主动探测,如果在Echo等待定时器超时仍未收到Device B的端口返回的Echo报文,Device A的端口就将进入Disable状态。此时由于Device B的端口的物理状态为down,因此其DLDP状态为Inactive。
图 2 加强模式的应用场景示意图
l 当DLDP协议工作在普通模式下,系统只能识别光纤交叉连接这一种类型的单向链路。
l 当DLDP协议工作在加强模式下,系统能够识别光纤交叉连接和一条光纤未连接或断路这两种类型的单向链路。在探测后一种类型的单向链路时,需要将端口配置为强制速率和强制全双工模式,否则即使启用了DLDP协议,该协议也不起作用。当出现后一种单向链路时,Rx端有信号的端口将处于Disable状态,而Rx端没有信号的端口将处于Inactive状态。
为了防止网络攻击和恶意探测,用户可以在端口上配置DLDP报文认证方式,分为下列三种:
l 不认证方式:发送DLDP报文一方将认证字字段置为全0,认证类型字段置为0;接收DLDP报文一方要将报文中的认证字和认证类型同本端配置进行比较,如果不一致,则丢弃报文。
l 明文认证方式:发送DLDP报文一方将认证字字段置为用户配置的明文认证密码,认证类型字段置为1;接收DLDP报文一方要将报文中的认证字和认证类型同本端配置进行比较,如果不一致,则丢弃报文。
l MD5认证方式:发送DLDP报文一方将认证字字段置为用户配置的密码采用MD5算法加密后的摘要,认证类型字段置为2;接收DLDP报文一方要将报文中的认证字和认证类型分别和本端配置的密码用MD5算法加密后的摘要以及本端认证类型进行比较,如果不一致,则丢弃报文。
(1) 如果使能了DLDP的端口链路状态为up,DLDP会向对端发送DLDP报文,同时分析处理对端设备发送过来的DLDP报文。DLDP处在不同的状态时发送的报文类型不同。
表 4 DLDP发送报文类型
DLDP状态 | 发送报文类型 |
Active | 带有RSY标记的Advertisement报文 |
Advertisement | 普通Advertisement报文 |
Probe | Probe报文 |
Disable | 发送一个Disable报文,随后发送RecoverProbe报文 |
当从其它DLDP状态(不包括Inactive和Disable)迁移到Initial状态时,DLDP将发送Flush报文。
(2) DLDP对接收到的报文进行如下分析和处理:
l 在认证方式下,对报文进行认证。如果报文通不过认证,丢弃该报文。
l 报文中的通告时间间隔如果和本设备的不一致,丢弃该报文。
l 对DLDP报文进行处理。
表 5 对接收到的DLDP报文的处理过程
收到报文类型 | 处理过程 | |||
带RSY标记的Advertisement报文 | 取出邻居信息 | 如果本机上没有该邻居表项,则建立该邻居表项,启动此表项的老化定时器,并把DLDP状态切换到Probe状态 | ||
如果本机上存在该邻居表项,则刷新此表项的老化定时器,并把DLDP状态切换到Probe状态 | ||||
普通Advertisement报文 | 取出邻居信息 | 如果本机上没有该邻居表项,则建立该邻居表项,启动此表项的老化定时器,并把DLDP状态切换到Probe状态 | ||
如果本机上存在该邻居表项,则刷新此表项的老化定时器 | ||||
Flush报文 | 判断本端口是否为Disable状态 | 如果是Disable状态,则不需处理 | ||
如果不是Disable状态,且邻居表中有该邻居信息,则将此邻居信息删除 | ||||
Probe报文 | 取出邻居信息 | 如果本机上没有该邻居,则建立该邻居表项并把自身状态切换为Probe状态,向对端回复Echo报文 | ||
如果本机上有该邻居的表项,则刷新此表项的老化定时器,并向对端回复Echo报文 | ||||
Echo报文 | 取出邻居信息 | 如果本机上没有该邻居表项,则建立该邻居表项,启动此表项的老化定时器,并把DLDP状态切换到Probe状态 | ||
如果本机上存在该邻居表项,检查报文中携带的邻居信息是否和本机相同 | 不同 | 丢弃该Echo报文 | ||
相同 | 将该邻居标志位置为双向连通 如果所有邻居状态都为双向连通,则DLDP状态由Probe切换为Advertisement,同时将Echo定时器置为无效 | |||
Disable报文 | 判断本端口是否为Disable状态 | 如果是Disable状态,则不需处理 | ||
如果不是Disable状态,则本端口进入Disable状态 | ||||
RecoverProbe报文 | 判断本端口是否为Disable或Advertisement状态 | 如果不是Disable或Advertisement状态,则不需处理 | ||
如果是Disable或Advertisement状态,则回应RecoverEcho报文 | ||||
RecoverEcho报文 | 判断本端口是否为Disable状态 | 如果不是Disable状态,则不需处理 | ||
如果是Disable状态,检查该报文中携带的邻居信息是否和本端口信息相同,如果相同,则本端口转换为Active状态 | ||||
LinkDown报文 | 判断本端口是否工作在加强模式下 | 如果不是工作在加强模式下,则不需处理 | ||
如果工作在加强模式下,且本端口不为Disable状态,则进入Disable状态 |
(3) 如果DLDP没有收到邻居的Echo应答报文,会做如下处理:
表 6 未收到邻居Echo应答报文时的处理过程
未收到邻居Echo报文 | 处理过程 |
普通模式下,Echo等待定时器超时还未收到 | 将DLDP状态转到Disable,输出日志和跟踪信息,向邻居发送Disable报文,并根据用户配置的DLDP Down模式,手动或者自动关闭本端端口。同时删除该邻居表项 |
加强模式下,由于加强探测启动的Echo定时器超时还未收到 |
如果端口的关闭模式被设置为系统自动关闭,当DLDP检测到单向链路时,把端口的状态设置为DLDP Down,处于此状态的端口不会转发业务报文,也不能收发除DLDPDU之外的任何协议报文。
处于DLDP Down状态端口能在链路恢复之时,从DLDP Down状态中恢复。DLDP Down状态下的端口仍然会周期性的发送链路恢复探测报文(RecoverProbe报文),一旦收到正确的恢复回应报文(RecoverEcho报文),则说明单向链路已经变为双向链路,DLDP将此端口重新up。其具体过程如下:
处于DLDP Down状态的端口向外每2秒发送一次RecoverProbe报文。报文中只携带本端口的信息。对端如果收到该报文,则以RecoverEcho报文作为应答。一旦本端收到RecoverEcho报文,检查RecoverEcho报文中携带的邻居信息是否和本端口信息相同。如果相同,则认为本端口和该邻居之间已经恢复双向连通,则端口从Disable状态迁移到Active状态,开始重新建立邻居关系。
链路恢复报文只在处于DLDP Down状态的端口上发送和处理。如果端口被用户使用shutdown命令手工关闭,则自动恢复机制不能生效。
DLDP邻居的状态有三种,如表 7所示。
表 7 DLDP邻居状态
状态类型 | 说明 |
未知状态 | 刚建立这个邻居,目前正在对邻居进行探测,还没有收到邻居回应时的邻居状态。该状态只在探测(Probe)过程中存在,探测结束后就转为双通或者单通 |
双通状态 | 收到邻居回应后的邻居状态,表示目前处于正常的双向连通状态,该状态可以长期稳定存在 |
单通状态 | 检测到单通链路时的邻居状态,此时会将该邻居删除 |