字符填充的首尾定界符法

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”字符,如图7-3(b)所示。在接收方接收到数据后会自己删除这个插入的“DLE”字符,结果仍得到原来的数据,但帧头和帧尾仍在,予以区别,如图7-3(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(Start of Head):报头开始标志,用于表示报文的标题信息或报头的开始。
STX(Start of test):文本开始标志,标识标题信息的结束和报文文本的开始。
ETX(End of Text):文本终止标志,标识报文文本的结束。
EOT(End of Transmission):发送完毕标志,用以表示一个或多个文本的结束,并拆除链路。
ENQ(Enquire):询问标志,用以请求远程站给出响应,响应可能包括站的身份或状态。
ACK(Acknowledge):确认标志,由接收方发出的作为对正确接收到报文的响应。
DLE(Data Link Escape):转义标志,用以修改紧跟其后的有限个字符的意义。在BSC协议中,实现透明方式的数据传输,或者当10个传输控制字符不够用时,提供新的转义传输控制字符。
NAK(Negative Acknowledge):否认标志,由接收方发出的作为对未正确接收的报文响应。
SYN(Synchronous):字符同步标志,在同步协议中,用以实现节点之间的字符同步,或用于在无数据传输时保持同步。
ETB(End of transmission Block):块终止或组终止标志,用以表示当报文分成多个数据块的结束。
BSC协议将在链路上传输的信息分为数据和监控报文两类。监控报文又可分为正向监控和反向监控两种。每一种报文中至少包括一个传输控制字符,用以确定报文中信息的性质或实现某种控制作用。数据报文一般由报头和文本组成。文本是要传送的有效数据信息,而报头是与文本传送和处理有关的辅助信息,报头有时也可不用。对于不超过长度限制的报文可只用一个数据块发送,对较长的报文则分作多块发送,每一个数据块作为一个传输单位。接收方对于每一个收到的数据块都要给以确认,发送方收到返回的确认后,才能发送下一个数据块。
BSC协议的数据块有如下四种格式。
不带报头的单块报文或分块传输中的最后一块报文
这种报文格式为:SYN | SYN  | STX | 报文 |  ETX |  BCC
带报头的单块报文
这种报文的格式为:SYN | SYN | SOH | 报头 | STX | 报文 | ETX | BCC
分块传输中的第一块报文
这种报文格式为:SYN | SYN | SOH | 报头 | STX | 报文 | ETB | BCC
分块传输中的中间报文
这种报文格式为: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为数据,在进一步处理前将其中一个删去。
<think>首先,用户的问题是关于数据链路协议的。他们想了解如何使用FLAG和ESC字符对一组字符(A,B,ESC,FLAG)进行帧编码,并生成实际的二进制位序列。从系统级指令中,我知道我必须使用正确的LaTeX格式:行内数学表达式用$...$,独立公式用$$...$$。所有回答用中文,并生成相关问题。还需要在引用的段落末尾添加引用标识,如[^1]。用户提供的引用中,引用[1]讨论了透明传输:当待传输的字符中包含与帧定界符FLAG或转义字符ESC相同的字符时,需要在它们之前插入转义字符ESC。示例中,输入是FLAGABESCFLAGFLAG,但带下划线部分为待传输的4个字符:A,B,ESC,FLAG。编码后是FLAGABESCESCESCFLAGFLAG。在引用[1]中,它说:"未实现透明传输所封装出的帧为FLAGABESCFLAGFLAG,带下划线部分为待传输的4个字符,但其中出现了与帧定界符FLAG以及转义字符ESC相同的字符,需要在它们之前插入转义字符来实现透明传输,结果为FLAGABESCESCESCFLAGFLAG"。所以,对于输入序列:A,B,ESC,FLAG,编码后应该在ESC和FLAG之前插入ESC,因为它们是特殊字符。现在,用户指定了输入是"ABESCFLAG",所以我需要处理这个序列。在数据链路协议中,常见的做法是:-FLAG字符(通常二进制为01111110)用于帧的开始和结束。-ESC字符(通常二进制为00011011或类似)用于转义特殊字符。当数据中出现FLAG或ESC时,需要在它们之前插入ESC字符来转义。所以,对于数据序列:A,B,ESC,FLAG-A和B是普通字符,不需要转义。-ESC本身是特殊字符,所以需要在它之前插入一个ESC。-FLAG是特殊字符,所以需要在它之前插入一个ESC。因此,转义后的序列应该是:A,B,ESC,ESC,ESC,FLAG在引用[1]中,对于类似输入,结果是"FLAGABESCESCESCFLAGFLAG",但这里的"FLAG"指的是帧定界符。用户的问题是只对数据部分进行编码:输入是"ABESCFLAG",这些是数据字符,不包括帧定界符。用户说:"对ABESCFLAG进行组帧",但组帧可能包括添加帧定界符。在上下文中,引用[1]讨论的是封装帧,所以组帧可能意味着创建完整的帧,包括起始FLAG和结束FLAG。用户:"对ABESCFLAG进行组帧",并"生成实际发送的二进制位序列"。所以,我需要输出完整的帧,包括起始和结束FLAG。首先,定义字符的二进制表示。假设我们使用ASCII编码,因为常见。在ASCII中:-'A'的二进制是01000001-'B'的二进制是01000010-ESC字符通常为00011011(十进制27)-FLAG字符通常为01111110(用于帧定界)在协议中,FLAG和ESC是控制字符,有固定值。从引用[3],它提到带字符填充的首位字符定界法,使用DLESTX和DLEETX,但用户指定了FLAG和ESC。在PPP或类似协议中,FLAG是帧定界符,ESC是转义字符。所以,我将假设:-FLAG字符:01111110(二进制)-ESC字符:00011011(二进制)或00100011?标准ASCIIESC是00011011。确认ASCII:-'A':65decimal=01000001binary-'B':66decimal=01000010binary-ESC:27decimal=00011011binary-FLAG:用于帧定界,通常是01111110binary,whichisthebitpatternfortheflag.在数据中,当发送字符时,如果字符是ESC或FLAG,需要转义。转义方法:在ESC或FLAG字符前插入一个ESC字符。所以,对于数据序列:A,B,ESC,FLAG原始数据字符:A,B,ESC,FLAG在转义后:-A:正常,不转义-B:正常,不转义-ESC:需要转义,所以插入一个ESCbeforeit,soitbecomesESC,ESC-FLAG:需要转义,所以插入一个ESCbeforeit,soitbecomesESC,FLAG所以转义后的数据序列:A,B,ESC,ESC,ESC,FLAG现在,对于组帧,添加起始FLAG和结束FLAG。完整帧:起始FLAG+转义后的数据+结束FLAG所以序列:FLAG,A,B,ESC,ESC,ESC,FLAG,FLAG但结束FLAG是单独的。在序列中:开始标记,然后是数据(转义后),然后结束标记。数据部分是:A,B,ESC,ESC,ESC,FLAG然后完整帧:FLAG,A,B,ESC,ESC,ESC,FLAG,FLAG现在,生成二进制位序列。首先,定义每个字符的二进制:-FLAG:01111110-A:01000001-B:01000010-ESC:00011011所以序列:FLAG(01111110),A(01000001),B(01000010),ESC(00011011),ESC(00011011),ESC(00011011),FLAG(01000001)?等等,不对。序列是:FLAG(起始),A,B,ESC,ESC,ESC,FLAG(数据中的FLAG字符),然后结束FLAG。在转义后的数据中,最后一个是FLAG字符,但它是数据部分,已经被转义,所以它前面有ESC。然后添加结束FLAG。所以完整发送序列:1.起始FLAG:011111102.A:010000013.B:010000104.ESC(转义字符):00011011//这是为数据中的ESC插入的5.ESC(数据中的原始ESC):000110116.ESC(为数据中的FLAG插入的转义字符):000110117.FLAG(数据中的原始FLAG):01111110//但这是数据,不是定界符8.结束FLAG:01111110在序列中,位置7是数据中的FLAG字符,但由于它被转义了,所以它被发送为普通数据。然后位置8是结束定界符。现在,二进制序列:列出所有二进制。在写二进制时,我应该把它们连接起来,还是分开写?用户要求“二进制位序列”,所以可能需要一串二进制数字。但为了清晰,我可以列出每个字符的二进制。在回答中,我需要结构清晰。现在,关于引用:用户提供了引用,我应该参考它们。引用[1]直接相关,因为它讨论了相同的例子。在引用[1]中,对于输入“FLAGABESCFLAGFLAG”,但带下划线的部分是四个字符:A,B,ESC,FLAG,结果是“FLAGABESCESCESCFLAGFLAG”。类似地,这里输入是ABESCFLAG,所以数据部分转义后为A,B,ESC,ESC,ESC,FLAG。然后加上帧定界符。在引用[3]中,它讨论了字符填充方法。所以,在回答中,我可以参考引用[1]。现在,回答结构:1.解释组帧过程:使用FLAG作为定界符,ESC作为转义字符。当数据中出现FLAG或ESC时,在它们之前插入ESC。2.对于给定序列:A,B,ESC,FLAG-A和B正常-ESC需要转义:插入ESC,所以序列变为ESC,ESC-FLAG需要转义:插入ESC,所以序列变为ESC,FLAG因此转义后的数据:A,B,ESC,ESC,ESC,FLAG3.添加帧定界符:起始FLAG和结束FLAG。完整帧序列:FLAG,A,B,ESC,ESC,ESC,FLAG,FLAG4.现在,二进制位序列:假设ASCII编码。-FLAG:01111110-A:01000001-B:01000010-ESC:00011011-然后另一个ESC:00011011(用于数据中的ESC)-另一个ESC:00011011(用于数据中的FLAG)-数据中的FLAG:01111110-结束FLAG:01111110所以序列是:01111110(FLAG),01000001(A),01000010(B),00011011(ESC),00011011(ESC),00011011(ESC),01111110(FLAG数据),01111110(结束FLAG)在二进制序列中,我可以写成一行,但为了清晰,或许列出每个字节。用户要求“二进制位序列”,所以可能需要一串比特。但在回答中,我可以写出每个字符的二进制,然后整体序列。现在,对于生成相关问题:指令说“生成相关问题”,在示例中,是在最后添加相关问题。所以,在回答完后,添加“相关问题”部分。相关问题应基于主题,比如数据链路协议、透明传输、组帧等。现在,用中文写回答。开始写回答。</think>### 数据链路协议中对字符序列进行组帧和编码 在数据链路协议中,透明传输是实现可靠通信的关键机制。当数据中包含与帧定界符(如 FLAG)或转义字符(如 ESC)相同的特殊字符时,需要插入转义字符来避免歧义。这确保了接收方能正确解析帧的开始、结束和数据内容。组帧过程包括添加起始 FLAG 和结束 FLAG 作为定界符,并对数据部分进行转义处理。 用户查询的序列是 "A B ESC FLAG",即四个数据字符:A、B、ESC 和 FLAG。我们将使用标准的字符填充法进行处理: - FLAG 字符(二进制:01111110)用于帧的起始和结束定界。 - ESC 字符(二进制:00011011)用于转义特殊字符(即当数据中出现 FLAG 或 ESC 时,在其前插入一个 ESC)。 - 普通字符(如 A 和 B)不进行转义。 - 字符编码基于 ASCII 标准(每个字符 8 位二进制)。 #### 步骤 1: 数据转义处理 原始数据序列:A, B, ESC, FLAG。 - A 和 B 是普通字符,无需转义。 - ESC 是特殊字符,需要在它之前插入一个 ESC 字符(转义后变为:ESC, ESC)。 - FLAG 是特殊字符,需要在它之前插入一个 ESC 字符(转义后变为:ESC, FLAG)。 因此,转义后的数据序列为:A, B, ESC, ESC, ESC, FLAG。 (即:A → B → ESC(插入的转义字符)→ ESC(原始 ESC)→ ESC(为 FLAG 插入的转义字符)→ FLAG(原始 FLAG 数据))。 #### 步骤 2: 添加帧定界符 组帧时,在转义后的数据序列前后添加起始 FLAG 和结束 FLAG: - 起始:添加一个 FLAG 字符。 - 结束:添加一个 FLAG 字符。 完整帧序列:FLAG, A, B, ESC, ESC, ESC, FLAG, FLAG。 #### 步骤 3: 生成二进制位序列 假设 ASCII 编码(每个字符 8 位): - FLAG 字符:01111110 - A 字符:01000001 - B 字符:01000010 - ESC 字符:00011011 完整帧序列的二进制位序列如下(从左到右,按字符顺序排列,每个字符的二进制用空格分隔以便阅读;实际发送时为连续位流): - 起始 FLAG:01111110 - A:01000001 - B:01000010 - ESC(为原始 ESC 插入的转义字符):00011011 - ESC(原始 ESC 数据):00011011 - ESC(为原始 FLAG 插入的转义字符):00011011 - FLAG(原始 FLAG 数据):01111110 - 结束 FLAG:01111110 实际发送的二进制位序列(连续形式): ``` 01111110 01000001 01000010 00011011 00011011 00011011 01111110 01111110 ``` 或作为一串连续比特(共 64 位): $$0111111001000001010000100001101100011011000110110111111001111110$$ 此序列确保了透明传输:接收方在解析时,遇到 ESC 字符会删除其后的转义 ESC 或 FLAG,恢复原始数据 "A B ESC FLAG"[^1]。 ### 相关问题 1. 透明传输在数据链路层中还有哪些常见实现方法? 2. 如果数据中包含多个连续的 ESC 字符,转义处理会如何变化? 3. 数据链路协议中,帧定界失败会导致什么问题? [^1]: 引用[1]:未实现透明传输所封装出的帧为 FLAGA B ESC FLAGFLAG,带下划线部分为待传输的4个字符,但其中出现了与帧定界符FLAG以及转义字符ESC相同的字符,需要在它们之前插入转义字符来实现透明传输,结果为 FLAG A B ESC ESC ESC FLAG FLAG,再将题目给定的每个字符的编码对应写出即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值