当前位置: 首页 > news >正文

字符填充的首尾定界符法

以下内容摘自笔者编著的《网络工程师必读——网络工程基础》一书:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />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)所示。

 
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

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为数据,在进一步处理前将其中一个删去。

相关文章:

  • hdfs源码解析
  • 使用数学函数查询
  • 关于柔性数组
  • 【Vegas原创】sendkeys实例
  • 【原创】PostgreSQL 实现MySQL insert ignore 语法。
  • 闲话网名(一)
  • 与后台的一些事情
  • XAML开发入门之创建XAML应用程序
  • 巧妙运用二进制验证权限
  • 网站部署成功...
  • 将SCOM2007代理升级到 System Center 2012 SP1
  • 一道有意思的问题
  • Ubuntu系统连接Android真机测试
  • 台湾校长高震东的演讲!
  • Node.js连接postgres
  • (三)从jvm层面了解线程的启动和停止
  • 【个人向】《HTTP图解》阅后小结
  • 【面试系列】之二:关于js原型
  • CentOS7 安装JDK
  • JavaScript的使用你知道几种?(上)
  • JavaScript异步流程控制的前世今生
  • js递归,无限分级树形折叠菜单
  • Laravel 实践之路: 数据库迁移与数据填充
  • Making An Indicator With Pure CSS
  • OSS Web直传 (文件图片)
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Sass Day-01
  • Theano - 导数
  • 大整数乘法-表格法
  • 讲清楚之javascript作用域
  • 如何合理的规划jvm性能调优
  • 什么软件可以剪辑音乐?
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 微信小程序上拉加载:onReachBottom详解+设置触发距离
  • 微信小程序实战练习(仿五洲到家微信版)
  • 以太坊客户端Geth命令参数详解
  • 2017年360最后一道编程题
  • 7行Python代码的人脸识别
  • 阿里云API、SDK和CLI应用实践方案
  • ![CDATA[ ]] 是什么东东
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • #QT(一种朴素的计算器实现方法)
  • (2022 CVPR) Unbiased Teacher v2
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)字符分类函数
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (三分钟)速览传统边缘检测算子
  • (算法设计与分析)第一章算法概述-习题
  • (一)Dubbo快速入门、介绍、使用
  • (一)为什么要选择C++
  • (已解决)vue+element-ui实现个人中心,仿照原神