字符填充的首尾定界符法

简介:

以下内容摘自笔者编著的《网络工程师必读——网络工程基础》一书:
 

7.2.2 字符填充的首尾定界符法

该同步方法是用一些特定的字符来定界一帧的起始与终止,充分解决了错误发生之后重新同步的问题。

1. 同步原理

在这种帧同步方式中,为了不使数据信息位中与特定字符相同的字符被误判为帧的首尾定界符,可以在这种数据帧的帧头填充一个转义控制字符(DLE STXData Link Escape – Start of TeXt),在帧的结尾则以DLE ETXData Link Escape – End of TeXt )结束,以示区别,从而达到数据的透明性。若帧的数据中出现DLE字符,发送方则插入一个“DLE”字符,接收方会删除这个DLE字符。如现在要发送一个如图7-3a)的字符帧,在帧中间有一个“DLE”字符数据,所以发送时会在其前面插入一个“DLE”字符,如图(b)所示。在接收方接收到数据后会自己删除这个插入的“DLE”字符,结果仍得到原来的数据,但帧头和帧尾仍在,予以区别,如图(c)所示。
 
7-3 字符填充的首尾定界原理
 
在以前,这种同步方式中,起始和结束字符是不同的(如起始字符为DLE,而结束字符是DLE ETX),但是近几年,绝大多数协议倾向于使用相同的字符来标识起始和结束位置。按这样的做法,在接收方丢失了同步,则只需搜索一下标志符就能找到当前帧的结束位置。两个连接的标志符代表了当前帧的结束和下一帧的开始。
 
但这种同步方式也不是完美的,也会发生严重的问题。当标志符的位模式出现在数据中时,这时同步问题就可能发生了。这种位模式往往会干扰正常的帧分界。解决这一问题的办法是在发送方的数据链路层传输的数据中,在与分界标志符位模式一样的字符中插入一个转义字符(如ESC)。接收方的数据链路层在将数据送给网络层前删除这种转义字符。因此,成帧用的标志字符与数据中出现的相同位模式字符就可以分开了,只要看它前面有没有转义字符即可。
 
如果转义字符出现在数据中间,同样需要用转义字符来填充。因此任何单个转义字符一定是转义序列的一部分,而两个转义字节则代表数据中的自然出现的一个转义字符。具体参见图7-3
 

2. 示例介绍

这种帧同步方法只能用于较为少用的面向字符型协议,典型代表是IBM公司的二进制同步通信协议(BSC)和PPP协议。它的特点是一次传送由若干个字符组成的数据块,而不是只传送一个字符,并规定了10个字符作为这个数据块的开头与结束标志,以及整个传输过程的控制信息。由于被传送的数据块是由字符组成,所以也被称之为向字符的协议
 
BSC协议用ASCIIEBCDIC字符集定义的传输控制字符来实现相应的功能。这些传输控制字符的标记、名字及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              SOHStart of Head):报头开始标志,用于表示报文的标题信息或报头的开始。
l              STXStart of test):文本开始标志,标志标题信息的结束和报关文本的开始。
l              ETXEnd of Text):文本终止标志,标志报文文本的结束。
l              EOTEnd of Transmission):发送完毕标志,用以表示一个或多个文本的结束,并拆除链路。
l              ENQEnquire):询问标志,用以请求远程站给出响应,响应可能包括站的身份或状态。
l              ACKAcknowledge):确认标志,由接收方发出的作为对正确接收到报文的响应。
l              DLEData Link Escape):转义标志,用以修改紧跟其后的有限个字符的意义。在BSC协议中,实现透明方式的数据传输,或者当10个传输控制字符不够用时,提供新的转义传输控制字符。
l              NAKNegative Acknowledge):否认标志,由接收方发出的,作为对未正确接收的报文的响应。
l              SYNSynchronous):字符同步标志,在同步协议中,用以实现节点之间的字符同步,或用于在无数据传输时保持该同步。
l              ETBEnd 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字符之后,以使接收方能实现字符同步。报头字段的包识别符及地址。所有数据块在块终限定符(ETXETB)之后还有块校验字符BCCblock check character),BCC可以是垂直奇偶校验或者说16CRC,校验范围从STX开始到ETXETB为止。
  
    当发送的报文是二进制数据库,而不是字符串时,二进制数据中形同传输控制字符的比特串将会引起传输混乱。为使二进制数据中允许出现与传输控制字符相同的数据(即数据的透明性),可在各帧中真正的传输控制字符(SYN除外)前加上DLE转义字符;在发送时,若文本中也出现与DLE字符相同的二进制比特串,则可插入一个外加以标记。在接收端则进行同样的检测,若发现单个的DLE字符,则可知其后为传输控制字符;若发现连续两个DLE字符,则知其后的DLE为数据,在进一步处理前将其中一个删去。
本文转自王达博客51CTO博客,原文链接http://blog.51cto.com/winda/7168如需转载请自行联系原作者

茶乡浪子
相关文章
|
6月前
去掉字符串前后空格/去掉字符串中所有空格(包括中间连续空格)/去掉所有全角半角空格/去掉所有全角半角 空格
去掉字符串前后空格/去掉字符串中所有空格(包括中间连续空格)/去掉所有全角半角空格/去掉所有全角半角 空格
|
6月前
|
自然语言处理
字符范围
字符范围
107 2
|
C语言
向字符串添加空格
首先我们可以算出s数组的大小-len,也可以直接得到spaces的大小-即要添加的空格数,那么我们要创建的数组大小是len+spacesSize吗? 不是,应该是len+spacesSize+1,这里的加一是存放一个'\n' 这里呢 我们可以写一个for i循环,用来把s中的元素放到arr里面,然后在外面定义一个falg用来充当arr的下标,存进一个元素falg++,再定义一个j=0,当i == space[j]就存放空格,每存放一个空格++.
72 0
|
Python
字符串首尾空格去除问题
字符串首尾空格去除问题
96 0
在一个由小写英文字母(a-z)组成的字符串中,查找最长子串,其头尾字母相同,且中间不包含该头尾字母,并输出最左边的该类子串
在一个由小写英文字母(a-z)组成的字符串中,查找最长子串,其头尾字母相同,且中间不包含该头尾字母,并输出最左边的该类子串
161 0
|
存储 Shell 程序员
字符和字符串
一.案例:代码展示 二.如何给字符串赋值
字符和字符串
|
人工智能 BI
762 字符串匹配----给定两个长度相同的字符串 a 和字符串 b。如果在某个位置 i 上,满足字符串 a 上的字符 a[i] 和字符串 b 上的字符 b[i] 相同,那么这个位置上的字符就是匹配
给定两个长度相同的字符串 aa 和字符串 bb。 如果在某个位置 ii 上,满足字符串 aa 上的字符 a[i]a[i] 和字符串 bb 上的字符 b[i]b[i] 相同,那么这个位置上的字符就是匹配的。 如果两个字符串的匹配位置的数量与字符串总长度的比值大于或等于 kk,则称两个字符串是匹配的。
284 0
字符串加空格
给定一个字符串,在字符串的每个字符之间都加一个空格。 输出修改后的新字符串。
158 0