一种具有检错功能的传输协议设计
2021-05-20连宏
连 宏
(中国电子科技集团公司第二十研究所,西安 710068)
0 引言
基于非连接的网络传输层协议提供的是不可靠的数据传输服务[1],无法保证接收端接收到的字节流是完整的、无差错的和有序的。此时,就需要设计应用层上的传输协议来保证面向非连接网络传输的可靠性[2]。
针对不可靠的非连接网络传输,本文设计了一种具有检错功能的传输协议。该协议综合运用握手、确认、应答、校验和错误重传等多种手段,能有效检查出传输数据的错误,对错误的数据采用重传确认机制,保证了数据传输的正确性和有效性。
传输协议包括帧格式定义和传输过程定义两部分内容[3]。帧格式描述了协议报文的基本定义,握手过程描述了数据发送和应答的交互过程。下面分别描述本协议的帧格式、握手过程以及具体实现。
1 协议设计
1.1 协议帧格式
帧格式由同步头、起始字、消息类型、报文长度、信息正文内容、保留和校验等九部分组成。报文帧格式如表1所示。
表1中消息类型与信息正文内容定义如表2所示。
表2 消息类型
帧头校验采用校验和形式,即表1报文帧格式中‘2’、‘3’、‘4’、‘5’项各个字节的值进行累加,溢出则丢弃,累加和由#0100H 减后存入第6 项。数据信息校验采用循环冗余校验(Cyclic Redundancy Check,CRC)。CRC 校验的生成多项式的阶数越高,那么误判的概率就越小[4]。本协议使用16 位校验,生成多项式为g(x)=x16+x12+x5+1,可以100%地检测出所有奇数个随机错误和长度小于等于k(k为g(x)的阶数)的突发错误[5]。
表1 报文帧格式
(1)表1的报文帧格式分为报头帧和数据帧两种。报头帧仅包含表1中的1~6 项,用来发送建立连接和发送应答等握手信号,即消息类型为101(正确接收应答消息)、102(错误接收应答消息)和104(建立连接消息)时采用报头帧格式发送。数据帧包含表1中1~9 项的全部内容,用来发送数据,即消息类型为100(本帧数据内容)和103(上帧数据内容)时采用数据帧格式发送。
(2)表1报文帧格式中,第6 项帧头校验采用校验和形式进行校验。
(3)表1报文帧格式中,第9 项数据信息的校验采用循环冗余校验进行校验。
(4)表1报文帧格式中,第7 项信息正文内容的最大长度为2048 字节。如果待发送的信息长度小于2048 字节,则为实际字节长度。
使用协议帧格式进行数据传输,首先由报文同步头和报文起始字共同决定一帧的开始,这样避免了非法数据进入到内部处理;然后使用帧头保留作为判断字节,可以过滤掉错误帧,保留正确帧;最后利用帧头校验来判断帧头是否正确。通过以上三层处理,仅保留了正确的帧数据。接下来对数据信息进行CRC 校验,确保进入后续处理程序的数据是正确的。通过帧头校验和数据信息CRC 校验可以有效检出帧头错误和数据信息错误,这样可靠地保证了数据传输的有效性和数据信息的正确性。
1.2 协议握手过程
发送方和接收方通过发送消息和接收应答实现双方的握手过程。首先发送方发送建立连接消息,接收方接收到建立连接消息后,根据帧头校验判断是否是正确帧,正确帧发送正确接收应答消息,错误帧发送错误接收应答消息。发送方接收到正确接收应答消息后开始发送数据消息;如果接收到错误接收应答消息,则重新发送建立连接消息,如果重传三次仍不成功,则退出发送过程。
发送方发送数据信息的握手过程与发送建立连接消息的握手过程相同,但接收方接收到数据信息后根据帧头校验和数据信息的CRC 校验两部分的结果判断帧数据是否正确,如果帧头校验和数据信息校验均正确,则发送正确接收应答消息,如果帧头和数据信息中任意一个校验出现错误,均发送错误接收应答消息。
协议握手过程如图1所示。
图1 协议握手过程
本协议通过发送—应答—握手—重传机制,即发送一帧数据,一个应答,若应答没收到或者接收到错误应答,重新进行协商握手,握手失败则向应用程序报告错误。握手过程建立了逻辑连接通道,保证了数据传输过程的可靠性;帧头校验和数据信息的CRC 校验检出了帧头和数据信息的错误,确保了数据信息的正确性;数据重传机制,保障了数据传输的有效性。该协议中多重手段的综合应用,使数据传输更加稳定高效。
2 协议实现
2.1 数据发送接收过程
发送方发送数据的处理过程如下所示:
A.发送建立连接消息;
B.等待接收应答消息;
C.接收应答消息,如果应答为正确接收应答消息,转E;否则,转D;
D.判断是否发送三次,是,转J;否,转A;
E.发送数据消息;
F.等待接收应答消息;
G.接收应答消息;如果应答为正确接收应答消息时,转I;否则,转H;
H.判断是否发送三次,是,转J;否,转E;
I.判断是否发送完毕,发送完毕,转J;否则,转E;
J.结束。
接收方接收数据的处理过程如下所示:
A.等待接收建立连接消息;
B.接收建立连接消息,校验正确,转D;校验错误,转C;
C.发送错误接收回传消息,判断是否接收三次,是,转J;否,转A;
D.发送正确接收回传消息;
E.等待接收数据消息;
F.接收数据消息,校验正确,转H;校验错误,转G;
G.发送错误接收回传消息,判断是否接收三次,是,转J;否,转E;
H.发送正确接收回传消息;
I.判断文件是否接收完毕,接收完毕,转J;否则,转E;
J.结束。
数据发送接收过程流程图如图2所示。
图2 数据发送接收过程流程图
2.2 循环冗余校验算法
CRC 校验采用多项式编码方法。被处理的数据块可以看作是一个n阶的二进制多项式,由an-1xn-1+an-2xx-2+···+a1x+a0组成。如一个8 位二进制数10110101 可以表示为:
1x7+0x6+1x5+1x4+0x3+1x2+0x+1
多项式乘除法运算过程与普通代数多项式的乘除法相同。多项式的加减法运算以2 为模,加减时不进、借位,和逻辑异或运算一致[6]。
采用CRC 校验时,发送方和接收方用同一个生成多项式g(x),并且g(x)的首位和最后一位的系数必须为1。CRC 的处理方法是:发送方以g(x)去除待发送的二进制数据t(x),得到的余数作为CRC校验码。校验时,以计算的校正结果是否为0 为据,判断数据帧是否出错。
CRC 校验码的编码方法是用待发送的二进制数据t(x)除以生成多项式g(x),将最后的余数作为CRC 校验码[7]。其实现步骤如下:
(1)设待发送的数据块是m位的二进制多项式t(x),生成多项式为r阶的g(x)。在数据块的末尾添加r个0,数据块的长度增加到m+r位,对应的二进制多项式为xrt(x)。
(2)用生成多项式g(x)去除xrt(x),求得余数为阶数为r-1 的二进制多项式y(x)。此二进制多项式y(x)就是t(x)经过生成多项式g(x)编码的CRC 校验码。
(3)用xrt(x)以(2)的方式减去y(x),得到二进制多项式xrt'(x)。xrt'(x)就是包含了CRC 校验码的待发送字符串。
从CRC 的编码规则可以看出,CRC 编码实际上是将待发送的m位二进制多项式t(x)转换成了可以被g(x)除尽的m+r位二进制多项式xrt'(x),所以解码时可以用接收到的数据去除g(x),如果余数为0,则表示传输过程没有错误;如果余数不为0,则在传输过程中肯定存在错误[8]。同时xrt'(x)可以看做是由t(x)和CRC 校验码的组合,所以解码时将接收到的二进制数据去掉尾部的r位数据,得到的就是原始数据。
3 结束语
本网络传输协议通过帧头校验和数据内容的CRC 校验,可有效检出传输过程中的数据错误。通过接收发送方的握手和错误重传机制,保障了传输过程的可靠性,提高了传输效率。本协议已在数据链系统网络传输领域得到运用,为数据链系统数据的稳定传输奠定了坚实的基础。