高飞狗:

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

布鲁托:

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

高飞狗:

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

布鲁托:

“遇到什么烦心事了?”

高飞狗:

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

布鲁托:

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

高飞狗:

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

布鲁托:

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

高飞狗:

“是酱紫的,我的一台主机设备管理并存储着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. 9-9害死人不偿命的(3n+1)猜想

    1001. 害死人不偿命的(3n+1)猜想 (15) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 卡拉兹(Ca ...

  2. CSS基础用法

    [CSS常用选择器] 标签选择器 写法: HTML标签名{}作用: 可以选中页面中,所有与选择器同名的HTML标签. 类选择器(class选择器)写法: .class名{}调用: 在需要调用选择器样式 ...

  3. vue.js移动端app实战4:上拉加载以及下拉刷新

    上拉加载以及下拉刷新都是移动端很常见的功能,在搜索或者一些分类列表页面常常会用到. 跟横向滚动一样,我们还是采用better-scroll这个库来实现.由于better已经更新了新的版本,之前是0.几 ...

  4. NHibernte教程(10)--关联查询

    本节内容 关联查询引入 一对多关联查询 1.原生SQL关联查询 2.HQL关联查询 3.Criteria API关联查询 结语 关联查询引入 在NHibernate中提供了三种查询方式给我们选择:NH ...

  5. Domain Driven Design

    在Spring官网的第一个tutorial中看到了这种 设计模式 Domain Driven Design 找到了篇介绍这个得文章: What is Domain Driven Design? &qu ...

  6. Web in Linux小笔记001

    Linux灾难恢复: Root密码修复 Centos single Filesystem是硬盘文件根目录,无法再cd ..就像macitosh 硬盘图标 Pwd:显示绝对路径 MBR修复 模拟MBR被 ...

  7. OSX 10.8+下开启Web 共享 的方法

    MENU Home Archives About SUBSCRIBE ☰MENU OSX 10.8+ Mountain Lion 下开启 Web Sharing(Web 共享)的方法 JUL 28, ...

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

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 本次PTA作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...

  9. 201521123088 《Java程序设计》第14周学习总结

    1. 本周学习总结 2. 书面作业 1. MySQL数据库基本操作建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自己的学号.姓名)在自己建立的数据库上执行常见SQL语句(截图) 2. ...

  10. 201521123007《Java程序设计》第11周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多线程相关内容. 2. 书面作业 本次PTA作业题集多线程 1. 互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) ...