童话故事 --- 通信协议之 HDLC 浅析
|
高飞狗: |
“高飞的白鹭浮水的鹅,唐诗里有画…” |
|
布鲁托: |
“高飞狗,又在做你的高飞梦哪!” |
|
高飞狗: |
“哈罗,布鲁托,这几天好郁闷呐!” |
|
布鲁托: |
“遇到什么烦心事了?” |
|
高飞狗: |
“最近在做几个物联小项目,遇到了一个共同的问题。” |
|
布鲁托: |
“有项目做,就离发财不远了,你啃完骨头,别忘了把肉留给我!” |
|
高飞狗: |
“没事做着急,有事做不出来,哪有心思又啃又吃!” |
|
布鲁托: |
“到底遇到什么问题了?” |
|
高飞狗: |
“是酱紫的,我的一台主机设备管理并存储着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 浅析的更多相关文章
- http协议和web应用有状态和无状态浅析
http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it 我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...
- 简述移动端IM开发的那些坑:架构设计、通信协议和客户端
1.前言 有过移动端开发经历的开发者都深有体会:移动端IM的开发,与传统PC端IM有很大的不同,尤其无线网络的不可靠性.移动端硬件设备资源的有限性等问题,导致一个完整的移动端IM架构设计和实现都充满着 ...
- 多平台下Modbus通信协议库的设计(一)
1.背景 1.1.范围 MODBUS 是 OSI 模型第 7 层上的应用层报文传输协议, 它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信. 自从 1979 年出现工业串行链路的事实标准以 ...
- IM通信协议逆向分析、Wireshark自定义数据包格式解析插件编程学习
相关学习资料 http://hi.baidu.com/hucyuansheng/item/bf2bfddefd1ee70ad68ed04d http://en.wikipedia.org/wiki/I ...
- 浅析ARM公司在物联网领域的战略布局
From: http://www.cnblogs.com/yefanqiu/p/3447769.html 浅析ARM公司在物联网领域的战略布局 随着ARM芯片的出货量越来越多,自信满满的ARM公司统一 ...
- protobuf 协议浅析
目录 Protobuf 协议浅析 1. Protobuf 介绍 1.1 Protobuf 基本概念 1.2 Protobuf 的优点 1.3 Protobuf, JSON, XML 的区别 2. Pr ...
- SQL Server on Linux 理由浅析
SQL Server on Linux 理由浅析 今天的爆炸性新闻<SQL Server on Linux>基本上在各大科技媒体上刷屏了 大家看到这个新闻都觉得非常震精,而美股,今天微软开 ...
- 【深入浅出jQuery】源码浅析--整体架构
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
随机推荐
- 互联网世界中的C语言——我的golang学习笔记:1(基础语法快速过)
前言 学习任何知识都会有一个学习背景 最近,我们团队乃至我司整个云服务,上go的呼声越来越高!新服务已经开始用go开发,部分现有Java版的服务重构为go也只是时间问题而已,故相关技术积累势在必行!在 ...
- Spring Cloud在国内中小型公司能用起来吗?
今天吃完饭休息的时候瞎逛知乎,突然看到这个一个问题Spring Cloud在国内中小型公司能用起来吗?,吸引了我的注意.仔细的看了题主的问题,发现这是一个好问题,题主经过了一番思考,并且用图形全面的将 ...
- 利用Java调用OpenCV进行人脸识别
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt409 今天我准备学习如何用Java来进行人脸检测.人脸检测有助于在任何数字图 ...
- Entity Framework Core 2.0 数据库迁移
看见过几篇其他大神写的关于EFCore2.0的文章.本人有点小白,一开始看文档的时候除了一些基本操作外其他部分几乎没有读懂,我估计会有一部分人跟我一样,因为人家读懂了的早就懂了. 在这里我写一下我自己 ...
- 软工+C(2017第6期) 最近发展区/脚手架
// 上一篇:工具和结构化 // 下一篇:野生程序员 教育心理学里面有提到"最近发展区"这个概念,这个概念是前苏联发展心理学家维果茨基(Vygotsky)提出的,英文名词是Zone ...
- Git和Github使用
什么是Git? Git 是一个快速.可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系统提供了高级操作和完全访问. 版本控制 简单地说,就是将在本地开发的代码,定时推送到服务器.每一次修改, ...
- GUI(自定义背景图片)
如果组件中没有setIcon(...);这个方法,这是有需要给组件设置背景图片,这时就可以自定义绘制背景图片 /** * */ package com.niit.javagui; import jav ...
- 团队作业八——第二次团队冲刺(Beta版本)第4天
团队作业八--第二次团队冲刺(Beta版本)第4天 一.每个人的工作 (1) 昨天已完成的工作 做一下用户注册的功能和登录功能. (2) 今天计划完成的工作 完成界面跳转 (3) 工作中遇到的困难 界 ...
- 201521123030《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...
- 第2周作业-Java基本语法与类库(20170227-20170304)
本周学习总结 (1)这周学习认识和熟悉了java的一些类型和变量: (2)学习了java的运算符基本使用方法: (3)了解了如何建立远程仓库和本地仓库,和如何让java代码在临时储存,本地仓库和远程仓 ...