HDLC捆绑
文/李冰
1 HDLC概述
1.1 综述
HDLC(High-level Data Link Control,高级数据链路控制)是一种面向比特的链路层协议,其最大特点是对任何一种比特流,均可以实现透明的传输。在HDLC中,链路的监控功能是通过一定的比特组合所表示的命令和响应来实现的,这些命令和响应可以与信息报文一起传送。
HDLC是一套完善的数据链路控制体系,采用它的子集衍生出来了很多种链路层协议,其中包括:X.25协议的链路层所使用的LAPB协议,ISDN所采用的LAPD协议,以及现在比较常用的PPP协议和FR协议等。
1.2 HDLC的特点
HDLC协议作为一种简单高效的数据链路层控制协议,具有如下一些特点:
l 透明传输,对要传输的信息报文比特结构无任何限制,信息报文可以是任意字符码集或比特串,它不会影响链路的监控操作。
l 可靠性高,在所有的HDLC帧中,都采用了循环冗余校验,并且将信息帧按顺序编号,以防信息报文漏收和重收。
l 传输效率高,在通信中不必等待对端的响应就可以发送下一帧,可以进行双向同时通信。
2 HDLC帧类型和帧结构
2.1 HDLC帧结构概述
HDLC作为一个链路层协议,将上层协议送来的报文按一定规则封装起来,形成了HDLC结构的链路帧。
HDLC协议中包含三种类型的帧:信息帧(I帧)、监控帧(S帧)以及无编号帧(U帧);
l 信息帧用于传送有效信息或数据,通常简称为I帧。
l 监控帧用于差错控制和流量控制,通常称为S帧;S帧有RR(接收准备好)、RNR(接收未准备好)、REJ(拒绝)和SREJ(选择拒绝)四种类型的命令响应。
l 无编号帧用于提供对链路的建立、拆除以及多种控制功能,简称U帧。
HDLC的通用帧结构如下:
图 1 HDLC帧结构
l 标志字段Flag:标志字段为固定的值01111110即0x7E,标志一个HDLC帧的开始和结束,所有的帧必须以7E开头,并以7E结束;在邻近两帧之间的7E,既作为前面帧的结束,又作为后续帧的开头;Flag也可作为同步字符和帧间填充字符;不包括Flag字段在内,一个HDLC帧至少应为32bit,若少于32bit则认为该帧无效。
l “0比特插入法”:由于01111110比特序列是用于Flag字段,那么就应当避免Address、Control、Information以及FCS字段中出现01111110这样的序列,于是采用0比特填充法,在发送端对帧的内容进行控制,如发现连续5个“1”比特出现,就插入一个“0”比特,在接收端检查帧的内容,如发现连续5个“1”比特,就将其后的一个“0”比特删去,从而恢复了原始帧的内容。
l 地址字段Address:Address字段长度为8bit,用于标识接收或发送HDLC帧的地址;在H3C设备实现的HDLC中,地址字段可能被填充为如下一些数值:
通用的地址:维持HDLC链路UP的Keepalive报文为0x8F,若承载的是ISIS报文则Address也是0x8F,其他各类数据报文均为0x0F;
STAC压缩后的报文Address为0x2F或0xAF。
下图所示分别为Keepalive报文和ICMP报文,可看到所谓协议报文的Keepalive其目的地址为0x8F,而作为数据报文的ICMP其目的地址为0x0F;
l 控制字段Control:Control字段长度为8bit,用来实现HDLC的各种控制信息,并标识是否为数据;Control字段表示命令和响应的种类,并对帧进行编号;由于H3C实现的是HDLC的一个简化版本,未用到HDLC中规定的控制信息,Control字段固定填为0x00,如上面的图中所示。
l 信息字段Information:Information字段可以是任意的二进制比特串,长度未作限定,其上限由FCS(帧校验序列)字段或通讯节点的缓冲容量来决定,目前国际上用得较多的是1000-2000字节,而下限可以是0,即无信息字段。
l 帧校验字段FCS:FCS字段采用16bit或32bit的CRC,在H3C的HDLC实现中该字段采用16bit的CRC,对两个Flag字段之间的整个帧的内容进行循环冗余校验。
2.2 关于H3C设备的HDLC实现
HDLC协议本身是由ITU-T制定的一套完整的数据链路层控制协议,其内容相当复杂,包括多种监控帧、无编号帧,这两种类型的帧中又包含了多种命令、响应报文,从而实现完整的对数据链路层通信的控制。
此外,完整的HDLC协议还支持点到点、点到多点,支持全双工、半双工链路上的通信,包含NRM、ARM、NBM等多种操作方式以及异常状态的报告与恢复机制。
但这种复杂的协议细节对于设备的实现是有一定障碍的,并且现代通信系统中通常也已不需要如此复杂的链路层控制协议。
因此H3C的HDLC实现是参照CHDLC(即Cisco HDLC)的方式,实现了HDLC中的基本功能,以保证在点到点链路上与友商的设备以HDLC的方式互通。该实现简化到仅保留一种控制类的协议报文,即Keepalive帧,以保证点到点的HDLC链路在物理层和链路层上的UP状态;另一种报文就是承载了各种上层协议的Information帧。
在H3C设备上实现的HDLC则具有如下一些特殊限定:
l HDLC协议只支持点到点链路,不支持点到多点,也不存在广播网络的概念。
l HDLC不支持IP地址协商,不支持认证。协议内部通过发送以0x8F为目的地址的Keepalive报文来检测链路状态。
l HDLC协议只能封装在同步链路上。目前在H3C设备的接口类型中只有工作在同步模式下的Serial接口和POS接口可以支持HDLC封装的链路层。
3 HDLC捆绑
由于支持HDLC封装的接口类型(SAE接口、POS接口),其单接口的数据传输速率都不是很高,逐渐已不能适应当代通信网络高吞吐量、高可靠性的要求。在实际组网中为满足增加带宽、提高可靠性的要求,需要将多个封装了HDLC协议的接口捆绑在一起使用,形成一条逻辑上的数据链路,以提高链路的带宽、实现负载分担,以及增加链路的冗余保护。
HDLC捆绑与以太网接口的静态链路聚合有些相似,其基本目的都是增加通信带宽、实现链路备份和数据流的负载分担,甚至包括通过哈希算法将不同的数据流引向不同的物理接口发送,可以说是静态链路聚合在WAN接口上的一种应用。
3.1 HDLC捆绑的几个基本概念:
l HDLC捆绑接口:
HDLC捆绑接口是一个逻辑接口。一个HDLC捆绑接口对应一个HDLC捆绑。
l HDLC捆绑:
一个HDLC捆绑与一个HDLC捆绑接口相对应,是一组HDLC接口的集合。HDLC捆绑是随着HDLC捆绑接口的创建而自动生成的,其编号与HDLC捆绑接口编号相同。
l 成员接口
加入HDLC捆绑后的实际物理接口称为成员接口;总体来讲,成员接口可以分为选中和非选中两种状态、处于选中状态的成员接口才能参与数据报文的接收和发送,而非选中状态的接口则只能收发Keepalive报文,不参与数据报文的转发。
本文中关于HDLC捆绑的内容,均是基于如下的组网进行验证的,
图 2 实验组网拓扑
3.2 HDLC捆绑选中接口的确定
3.2.1 HDLC成员接口的状态机
HDLC捆绑中的每个成员接口,无论是从初始状态变为选中状态还是从选中状态变为非选中状态,都遵循一个状态机。HDLC捆绑中的成员接口存在如下几种状态:
l 初始化状态Initial:成员接口的链路层协议处于down状态。
l 协商状态Negotiated:成员接口的链路层协议处于up状态,但是成员接口不满足选中条件。
l 就绪状态Ready:成员接口的链路层协议处于up状态,且成员接口满足选中条件,但由于最多选中成员接口数目/最少选中成员接口数目/最小激活带宽的限制,使得该成员接口没有被选中,那么该成员接口将处于就绪状态。
l 选中状态Selected:成员接口的链路层协议处于up状态,且成员接口满足选中条件,处于选中状态。只有处于此状态的成员接口才能转发流量。
图 3 HDLC成员接口状态转移图
图3描述了成员接口状态的迁移关系,基于这种状态机,当某一成员接口处于协商状态时,若系统判断其具备选中条件时,状态即迁移到就绪状态;处于就绪状态时,系统进一步判断其可以被选中,参与HDLC捆绑的数据转发,状态即迁移到选中。
3.2.2 选中接口确定的原则
无论是处于Initial状态的成员接口还是处于Negotiated、Ready状态的成员接口,都可以统称为非选中状态,它们都不能参加流量的转发,只有处于Selected状态的选中接口才能参与数据报文的转发,因此如何从Ready状态进入Selected状态是关键的一步。需要明确的一点是,HDLC选中端口的确定是基于本地参数判断选择的,而非交互协商的结果,因此如果配置不当可能会出现两端选中结果不一致的情况。
影响成员接口成为Selected状态的因素有接口的速率、捆绑优先级、接口索引号以及配置的最大/最小选中接口数和最小激活带宽。
处于Ready状态的成员接口有M个,设备限制Selected状态的接口数目为N;
l 当M<=N时,所有的M个成员接口都可以变为Selected状态;
l 当M>N时,则按照接口速率(速率越大越好)、捆绑优先级(数值越小越好)、接口索引号(数值越小越好)的顺序决定哪些接口可以变为Selected状态;
下面的实验将按顺序验证上面的原则:
实验一:首要决定因素是接口速率
如图2中所示的三个Serial接口加入HDLC捆绑,配置Serial1/0接口的速率为64Kbps,接口的捆绑优先级为最高的1;
配置Serial1/1和Serial1/2接口的速率为2.048Mbps,接口的捆绑优先级为最低的65535
由于在HDLC捆绑接口上配置了最大选中接口数目bundle max-active links为2,因此不会出现三个成员接口都为Selected的情况,必有一个接口不能变为Selected,结果如下所示:
由上述结果可以看出,Serial1/1和Serial1/2变为了Selected状态,而接口捆绑优先级比较高、并且接口索引号比较小的Serial1/0仍然处于Ready状态,说明了接口的速率比捆绑优先级和接口索引号的重要性要高,它是首先需要被考虑的因素。
实验二:次要的决定因素是捆绑优先级
接下来验证接口的捆绑优先级和接口索引号对于接口成为Selected状态的决定作用。仍然利用上面的验证环境,将三个成员接口的速率都配置为2.048Mbps,从而排除了速率对于Selected接口的影响;将Serial1/0接口的捆绑优先级调整为最低的65535,而将Serial1/1和Serial1/2的捆绑优先级调整为最高的1;依然由于配置了bundle max-active links为2,因此不会出现三个成员接口都为Selected的情况,必有一个接口不能变为Selected,结果如下所示:
由上述结果可看出,接口索引号比较小的Serial1/0仍处于Ready状态,而接口索引号较大的Serial1/1等成为Selected接口,说明捆绑优先级比接口索引号的重要性要高。
实验三:当捆绑优先级一致时,接口索引号小的接口优先被选中
在上一个实验的基础上,将Serial1/1接口的捆绑优先级降低为与Serial1/0相同的65535,而Serial1/2的捆绑优先级依然保持1,结果如下所示:
可以看到,当接口速率、捆绑优先级都一样时,接口索引号就成为了决定接口能否成为Selected状态的条件,索引号越小的接口具有越高的成为Selected状态的优先权。
由上面的几个实验,验证了决定Ready状态的成员接口成为Selected状态的因素,即接口速率->接口捆绑优先级->接口索引号。
除了上面这些决定因素外,可以影响成员接口是否能由Ready转为Selected的因素还包括配置的最大选中接口数目bundle max-active links,最小选中接口数目bundle min-active links,以及最小激活带宽bundle min-active bandwidth,设备上处于Ready的M个接口按照前面所述的原则排好序后,还要满足下面的条件才能成为Selected接口:
l 如果M>bundle max-active links,那么按照前面的顺序确定的前bundle max-active links个成员接口变为Selected状态,其余接口保持Ready状态;
l 如果M<bundle min-active links,那么所有接口都仍将处于Ready状态;
l 如果M条链路的带宽之和仍小于bundle min-active bandwidth的数值,那么也达不到选中条件,所有接口仍保持Ready状态;
3.3 HDLC捆绑的负载分担
HDLC捆绑的一个重要目的就是将数据流量在Selected的成员接口之间进行负载分担,从而达到增大带宽和链路冗余备份的功能。
如图2中所示的情况,Terminal A向Terminal B发送数据,经由HDLC捆绑接口进行转发;HDLC捆绑模块会将报文从一条实际的HDLC物理接口(Selected成员接口)发送,并通过哈希算法将属于同一条流的报文引向同一个物理接口,以保证发送的报文不会乱序。
在H3C设备实现中,决定报文从哪一个物理接口发送取决于三个因素:源IP地址、目的IP地址以及当前处于Selected状态的接口数目。
第一步,将源IP地址每8bit为一组,分为4组,将这4组8bit序列进行异或(XOR)运算,得到异或运算后的二进制序列;
第二步,将目的IP地址也按照源IP地址一样的方式进行处理,得到一个异或运算后的二进制序列;
第三步,将上两步的运算出来的二进制序列再进行一次异或运算,得出最终的二进制序列,并将其转为十进制数字;
第四步,确定HDLC桶深;假设Selected接口数目为M,取一个最接近32(但小于32)并且是M的整数倍的数,作为HDLC桶深,记为bucketLength;并建立一个数组,长度为bucketLength,其中循环填充Selected接口的M个编号;
图 4 HDLC桶深示意图
第五步,将第三步得出的T与第四步得出的bucketLength求模,T%bucketLength=Z,在第四步得到的数组中的第Z个元素(从0开始数)所代表的Selected接口即为发送数据的接口。
从HDLC捆绑负载分担的原理来看,它是按照逐流的方式进行的,也就是说只有源或目的IP变化的情况下,流量才能从不同的成员接口进行发送,否则将一直只从一个Selected物理接口进行转发。
3.4 HDLC捆绑的收敛效率
HDLC捆绑的一个重要作用就是链路备份,也就是说当捆绑中的一条链路失效时,设备可以将该条链路上的流量转移到其它处于Active状态的链路上去,因此HDLC捆绑发生链路故障时的收敛效率指标是非常重要的。
为了验证该项指标,依然采用如图2所示的组网环境,图中的设备采用SR6602型路由器,HDLC捆绑的三个物理接口均是工作在2.048Mbps速率下的SAE接口(采用V.35电缆直连)。
由Terminal A向Terminal B发送数据流量,该流量初始时从Device A的Serial 1/1接口发出。发送报文长度为64bytes,以2Mbps的速率发送40000个包。
在流量持续发送过程中,使Serial 1/1接口所在链路失效(例如拔掉电缆),在设备将流量切换到其它正常链路上之前,共丢失了4个报文,约合1.34ms;也就是说在链路失效情况下,HDLC捆绑大约可在1.34ms左右的时间收敛,将流量切换到其它正常链路上。
上述测试是在设备链路直连的情况下进行的,而实际中的组网多为穿越传输网的长途线路,若另一端的接口down掉,本端不能马上检测到,这时候就要通过Keepalive接收超时从而触发链路的切换。设备可配置的Keepalive最小间隔是1秒,而连续5个时间间隔内收不到对端发送的Keepalive报文的话会使该接口链路层down掉,也就是说在穿越长途传输网的情况下,至少需要5秒钟时间设备才能检测到链路失效,从而将流量切换到正常状态的链路上。