7.2.2 字符填充的首尾定界符法
该同步方法是用一些特定的字符来定界一帧的起始与终止,充分解决了错误发生之后重新同步的问题。
1. 同步原理
在这种帧同步方式中,为了不使数据信息位中与特定字符相同的字符被误判为帧的首尾定界符,可以在这种数据帧的帧头填充一个转义控制字符(DLE STX,Data Link Escape – Start of TeXt),在帧的结尾则以DLE ETX(Data Link Escape – End of TeXt )结束,以示区别,从而达到数据的透明性。若帧的数据中出现DLE字符,发送方则插入一个“DLE”字符,接收方会删除这个DLE字符。如现在要发送一个如图7-3(a)的字符帧,在帧中间有一个“DLE”字符数据,所以发送时会在其前面插入一个“DLE”字符,如图(b)所示。在接收方接收到数据后会自己删除这个插入的“DLE”字符,结果仍得到原来的数据,但帧头和帧尾仍在,予以区别,如图(c)所示。
图7-3 字符填充的首尾定界原理
在以前,这种同步方式中,起始和结束字符是不同的(如起始字符为DLE,而结束字符是DLE ETX),但是近几年,绝大多数协议倾向于使用相同的字符来标识起始和结束位置。按这样的做法,在接收方丢失了同步,则只需搜索一下标志符就能找到当前帧的结束位置。两个连接的标志符代表了当前帧的结束和下一帧的开始。
但这种同步方式也不是完美的,也会发生严重的问题。当标志符的位模式出现在数据中时,这时同步问题就可能发生了。这种位模式往往会干扰正常的帧分界。解决这一问题的办法是在发送方的数据链路层传输的数据中,在与分界标志符位模式一样的字符中插入一个转义字符(如ESC)。接收方的数据链路层在将数据送给网络层前删除这种转义字符。因此,成帧用的标志字符与数据中出现的相同位模式字符就可以分开了,只要看它前面有没有转义字符即可。
如果转义字符出现在数据中间,同样需要用转义字符来填充。因此任何单个转义字符一定是转义序列的一部分,而两个转义字节则代表数据中的自然出现的一个转义字符。具体参见图7-3。
2. 示例介绍
这种帧同步方法只能用于较为少用的面向字符型协议,典型代表是IBM公司的二进制同步通信协议(BSC)和PPP协议。它的特点是一次传送由若干个字符组成的数据块,而不是只传送一个字符,并规定了10个字符作为这个数据块的开头与结束标志,以及整个传输过程的控制信息。由于被传送的数据块是由字符组成,所以也被称之为“向字符的协议”。
BSC协议用ASCII和EBCDIC字符集定义的传输控制字符来实现相应的功能。这些传输控制字符的标记、名字及ASCII码值和EBCDIC码值见表7-1。
表7-1 BSC协议的10个传输控制字符
标记
|
SOH
|
STX
|
ETX
|
EOT
|
ENQ
|
ACK
|
DEL
|
NAK
|
SYN
|
ETB
|
名称
|
序始
|
文始
|
文终
|
送毕
|
询问
|
确认
|
转义
|
否认
|
同步
|
块终
|
ASCII码值
|
01H
|
02H
|
03H
|
04H
|
05H
|
06H
|
10H
|
15H
|
16H
|
17H
|
EBCDIC码值
|
01H
|
02H
|
03H
|
37H
|
2DH
|
2EH
|
10H
|
3DH
|
32H
|
26H
|
l SOH(Start of Head):报头开始标志,用于表示报文的标题信息或报头的开始。
l STX(Start of test):文本开始标志,标志标题信息的结束和报关文本的开始。
l ETX(End of Text):文本终止标志,标志报文文本的结束。
l EOT(End of Transmission):发送完毕标志,用以表示一个或多个文本的结束,并拆除链路。
l ENQ(Enquire):询问标志,用以请求远程站给出响应,响应可能包括站的身份或状态。
l ACK(Acknowledge):确认标志,由接收方发出的作为对正确接收到报文的响应。
l DLE(Data Link Escape):转义标志,用以修改紧跟其后的有限个字符的意义。在BSC协议中,实现透明方式的数据传输,或者当10个传输控制字符不够用时,提供新的转义传输控制字符。
l NAK(Negative Acknowledge):否认标志,由接收方发出的,作为对未正确接收的报文的响应。
l SYN(Synchronous):字符同步标志,在同步协议中,用以实现节点之间的字符同步,或用于在无数据传输时保持该同步。
l ETB(End of transmission Block):块终或组终止标志,用以表示当报文分成多个数据块的结束。
BSC协议将在链路上传输的信息分为数据和监控报文两类。监控报文又可分为正向监控和反向监控两种。每一种报文中至少包括一个传输控制字符,用以确定报文中信息的性质或实现某种控制作用。数据报文一般由报头和文本组成。文本是要传送的有效数据信息,而报头是与文本传送和处理有关的辅助信息,报头有时也可不用。对于不超过长度限制的报文可只用一个数据块发送,对较长的报文则分作多块发送,对较长的报文则分作多块发送,每一个数据块作为一个传输单位。接收方对于每一个收到的数据块都要给以确认,发送方收到反回的确认后,才能发送下一个数据块。
BSC协议的数据块有如下四种格式:
l 不带报头的单块报文或分块传输中的最后一块报文
这种报文格式为:SYN | SYN | STX | 报文 | ETX | BCC
l 带报头的单块报文
这种报文的格式为:SYN | SYN | SOH | 报头 | STX | 报文 | ETX | BCC
l 分块传输中的第一块报文
这种报文格式为:SYN | SYN | SOH | 报头 | STX | 报文 | ETB | BCC
l 分块传输中的中间报文
这种报文格式为:SYN | SYN | STX | 报文 | ETB | BCC
从以上数据报文格式可以看出,BSC协议中所有发送的数据均跟在至少两个SYN字符之后,以使接收方能实现字符同步。报头字段的包识别符及地址。所有数据块在块终限定符(ETX或ETB)之后还有块校验字符BCC(block check character),BCC可以是垂直奇偶校验或者说16位CRC,校验范围从STX开始到ETX或ETB为止。
当发送的报文是二进制数据库,而不是字符串时,二进制数据中形同传输控制字符的比特串将会引起传输混乱。为使二进制数据中允许出现与传输控制字符相同的数据(即数据的透明性),可在各帧中真正的传输控制字符(SYN除外)前加上DLE转义字符;在发送时,若文本中也出现与DLE字符相同的二进制比特串,则可插入一个外加以标记。在接收端则进行同样的检测,若发现单个的DLE字符,则可知其后为传输控制字符;若发现连续两个DLE字符,则知其后的DLE为数据,在进一步处理前将其中一个删去。
本文转自王达博客51CTO博客,原文链接http://blog.51cto.com/winda/7168如需转载请自行联系原作者
茶乡浪子