zoukankan      html  css  js  c++  java
  • 童话故事 --- 通信协议之 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。更具体的相关内容你们可以在网上搜搜。”

    布鲁托

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

    高飞狗

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

    黛丝

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

     

  • 相关阅读:
    在Windows上搭建Git Server
    Android Studio Intent使用(显式、隐式)
    Android Studio2.0 教程从入门到精通Windows版
    Android Studio2.0 教程从入门到精通Windows版
    【转】自动化框架中引入ExtentReport美化报告
    阿里巴巴Java开发规约IDEA插件安装及使用
    13位时间戳与格式化日期之间的转换实现
    计算机基础知识试题及答案
    构建最基础的Spring项目及所需要的jar包
    (二)SpringMVC+mybatis实践
  • 原文地址:https://www.cnblogs.com/micemik/p/7647142.html
Copyright © 2011-2022 走看看