高飞狗:

“高飞的白鹭浮水的鹅,唐诗里有画…”

布鲁托:

“高飞狗,又在做你的高飞梦哪!”

高飞狗:

“哈罗,布鲁托,这几天好郁闷呐!”

布鲁托:

“遇到什么烦心事了?”

高飞狗:

“最近在做几个物联小项目,遇到了一个共同的问题。”

布鲁托:

“有项目做,就离发财不远了,你啃完骨头,别忘了把肉留给我!”

高飞狗:

“没事做着急,有事做不出来,哪有心思又啃又吃!”

布鲁托:

“到底遇到什么问题了?”

高飞狗:

“是酱紫的,我的一台主机设备管理并存储着1000台从机设备的各种数据,也就是有1000套数据存储在主机设备中,我的上位机狗狗要从主机设备中读取这1000套数据。我就为这事郁闷呐!”

布鲁托:

“这有什么难的,上位机狗狗发1条命令,主机设备上传1套数据;上位机狗狗发1000条命令,就能得到全部数据。”

高飞狗:

“你脑残哪!那不得把我的上位机狗狗活活累死,等到猴年马月才能把数据传送完毕!”

布鲁托:

“要么上位机狗狗只发1条命令,主机设备就一口气把1000套数据全部上传过来?”

高飞狗:

“你是鳄鱼脑啊!如果传送途中受一点点干扰,整个1000套数据就得重传。”

布鲁托:

“那你有什么好法呢?”

高飞狗:

“我的方法比你聪明些,就是上位机狗狗只发1条命令,主机设备就一口气把1000套数据全部上传过来,但是1套数据是一个独立的数据包,数据包带有CRC校验和。传送途中哪个数据包受到干扰,就只需重传哪个数据包。”

布鲁托:

“高飞,你真是聪明绝顶!那你还郁闷啥呢?”

高飞狗:

现在遇到一个头疼了好些天的问题,就是当主机设备连续发送1000个包时,或者说上位机狗狗连续接收多个数据包时,上位机狗狗经常晕头转向,搞不清哪一堆数据属于同一个包,还经常把一堆分属于2个包的连续数据误以为一个包。如此,后果不堪设想,我都快崩溃了!

布鲁托:

“瞧你这模样,是够痛苦的! 对了,咱们不妨找找你的黛丝姐姐,她是这方面的行家里手。”

高飞狗:

“我也不是没打过这个念头,可你也知道,我跟她之间的那点事…,如今人家是博士了,哪瞧得上我呀!”

布鲁托:

“常言道,不耻下问,以前你是荒淫无度,如今改邪归正,没准你们俩的事还会因此转机呢!”

高飞狗:

“到如今,也只好硬着头皮、厚着脸皮了,要么你陪我走一趟,顺便敲敲锣边,给我打打气,灭灭她的威风?”

高飞狗和布鲁托来到了黛丝的家门口。“叮铃铃…叮铃铃…”

黛丝:

“谁呀? 哎呀!稀客稀客,布鲁托,好久不见,什么风把你吹我这来了?快请进”。

高飞狗夹着尾巴想趁势溜进去。

黛丝:

“哎哎哎,你是谁呀?谁让你进来啦!”

布鲁托:

“黛丝姐姐,今天我有要事请您帮忙和指教,我自己一个人上你家显然不合适,就要高飞陪我过来啦。”

黛丝冲着高飞:“哼!”

高飞垂头无语。

黛丝:

“布鲁托,您别这么客气,咱们是发小,有事只管直说,什么指教不指教的。我先给您沏杯咖啡。”

布鲁托把事情经过说了一遍。

黛丝:

“原来是这事,虽说我是个博士,也就昨天才学的,今天在你这就用上了,真的成了现学现用现卖了!”

布鲁托:

“您太谦虚了!”

黛丝:

“当连续发送和接收多个数据包时,通常每个数据包都有明确的包头和包尾标识,上位机狗狗一眼就能认出来。如此,无论连发多少个包,上位机狗狗都不会晕头转向。”

布鲁托:

“包头和包尾标识用什么表达?”

黛丝:

“比较经典的做法是,包头和包尾均用1字节0x7E表达。我画个图您就明白了。”

高飞狗伸长了脖子看黛丝画图。

黛丝:

“看什么看!小心你的狗头!”

高飞狗:

“那如果包内数据有0x7E的话,接收时就会被当做包尾标识,从而错误地识别包了。”

黛丝:

“布鲁托,你这个问题提得好!”

布鲁托

“啊哦!这是高飞提的问题。”

黛丝:

“啊哦!是这样,如果包内数据有0x7E的话:

在发送时就替换为0x7D 0x5E,这叫做stuffing。

在接收时,如果发现0x7D,就丢弃0x7D并将其后的0x5E替换为0x7E,这叫做destuffing。

经过stuffing处理,0x7E只会出现在数据包头和包尾。

经过destuffing处理后,数据及其包长就恢复为原始数据了。”

高飞狗:

“那如果包内原始数据就有0x7D,接收时岂不就会错误地进行destuffing了?”

黛丝:

“这个问题提得非常好!”

“如果包内原始数据就有0x7D:

在发送时就替换为0x7D 0x5D,这也叫做stuffing。

在接收时,如果发现0x7D,就丢弃0x7D并将其后的0x5D替换为0x7D,这也叫做destuffing。

经过stuffing处理,原始数据0x7D变为0x7D 0x5D后发送。

经过destuffing处理后,数据及其包长就恢复为原始数据了。”

高飞狗:

“发送时数据7E变7D 5E,数据7D变7D 5D,接收时要做逆向处理,脑子都乱了,有没有简单的方法进行变换?”

黛丝:

“这个问题提得非常好!有个简单的招!”

“在发送时,包内数据遇到7D/7E,就插入7D,然后将7D/7E与0x20异或,就成了5D/5E。”

“在接收时,遇到7D,就将其丢弃,然后将其后面的5D/5E与0x20异或,就恢复为数据7D/7E”。

高飞狗:

“嗯,这个算法简单多了! 亲爱的,这是你的原创吗?”

黛丝:

“谁是你的亲爱的!我哪有你能耐!”

“今天我说的方法其实在网络通信中早已普遍应用,是国际标准,称为HDLC。更具体的相关内容你们可以在网上搜搜。”

布鲁托

“高飞,你听明白了吗?”

高飞狗:

“明白了,我回去后马上修改上位机狗狗程序。”

黛丝:

“布鲁托,你 你 你们俩…”

童话故事 --- 通信协议之 HDLC 浅析的更多相关文章

  1. http协议和web应用有状态和无状态浅析

    http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it   我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...

  2. 简述移动端IM开发的那些坑:架构设计、通信协议和客户端

    1.前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性.移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着 ...

  3. 多平台下Modbus通信协议库的设计(一)

    1.背景 1.1.范围 MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议, 它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信. 自从 1979 年出现工业串行链路的事实标准以 ...

  4. IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习

    相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...

  5. 浅析ARM公司在物联网领域的战略布局

    From: http://www.cnblogs.com/yefanqiu/p/3447769.html 浅析ARM公司在物联网领域的战略布局 随着ARM芯片的出货量越来越多,自信满满的ARM公司统一 ...

  6. protobuf 协议浅析

    目录 Protobuf 协议浅析 1. Protobuf 介绍 1.1 Protobuf 基本概念 1.2 Protobuf 的优点 1.3 Protobuf, JSON, XML 的区别 2. Pr ...

  7. SQL Server on Linux 理由浅析

    SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...

  8. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  9. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

随机推荐

  1. MYSQL 中 LIMIT 用法

    mapper文件中的sql: ------------------------------------------------------------------------------------- ...

  2. 关于破解Quartus

    在网上找了很多资料,说的也很详细,安装的Quartus13.0,在破解的时候遇到x64和x86两种破解器,两个针对的路径不一样,如果搞混了~可能就会出现这种情况   Error: Current li ...

  3. [转]RMI方式Ehcache集群的源码分析

    RMI方式Ehcache集群的源码分析   Ehcache不仅支持基本的内存缓存,还支持多种方式将本地内存中的缓存同步到其他使用Ehcache的服务器中,形成集群.如下图所示:   Ehcache支持 ...

  4. Java 强引用 软引用 弱引用 虚引用详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt393 众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方 ...

  5. poj 1523求割点

    题意:给出一个无向图,求割点以及去除这个点后图分为几部分: 思路:割点定义:去掉该点后图将分成几个部分.割点:(1)当k为根节点且有>1个分支,则去除该点后图便被分成几个分支.(2)DFN[v] ...

  6. 转:【Java并发编程】之十二:线程间通信中notifyAll造成的早期通知问题(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17229601 如果线程在等待时接到通知,但线程等待的条件还不满足,此时,线程接到的就是早期 ...

  7. Java中equals和==之间的区别

    今天在写表达式求值的时候,发现了equals和==||!=和!equals()之间是不一样的. 我就从网上搜了搜关于这方面的知识,然后在下面做一个总结: Java中有两类数据类型: 基本数据类型(Pr ...

  8. 201521123085 《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 List中指定元素的删除(题目4-1) 1.1 实验总结 要注意到在删除元素 ...

  9. 201521145048 《Java程序设计》第3周学习总结

    1. 本章学习总结 学会了对于一个基本类的创建,需要有属性(private public protected),方法( 静态方法 非静态方法),构造函数,main函数,在定义属性时一般使用privat ...

  10. 201521123102 《Java程序设计》第3周学习总结

    1. 本周学习总结 初学面向对象,会学习到很多碎片化的概念与知识.尝试学会使用思维导图将这些碎片化的概念.知识组织起来.请使用纸笔或者下面的工具画出本周学习到的知识点.截图或者拍照上传. 2. 书面作 ...