Rdt2.1 和 Rdt2.2的详细解释

可靠数据传递中Rdt1.0, Rdt2.0, Rdt3.0 都很好理解,但是就是这两个毒瘤一直在我脑袋里面刺痛着我,经过一段时间的总结,我相信我能给大家一个比较好理解的解释。

这俩为啥会出现?

既然大版本好是2.0,我们可以回忆一下2.0阶段做了什么事情

Rdt2.0中增加了检验纠错的结构,也就是应答。

sequenceDiagram
sender -->> receiver: 发送消息(备注:你看看对不对?)(跳转到等待态)
receiver -->> sender: 啊对对对,这玩意是我想要的(receiver验货,正常ACK返回)
sender -->> sender: 爷终于放心了,可以发下一个了(状态回溯到初始状态)
receiver -->> sender: 不对啊,我不收(异常NAK)
sender -->> receiver: 重发

按理来说这个过程非常自然啊,receiver检验,sender等待,整个流程走完了,数据也发出去了,如果数据异常,sender也能够重发,但是问题就在于,如果象征着异常数据的标志NAK也错了,象征着正常数据的ACK也错了,sender该如何判断????它唯一的相信的东西没了!!这个流程自然说不通了。

上述流程要完美发生就必须要求ACK,NAK绝对不能出错

可以事实上,非常容易出错,好在我们还是有解决办法的

解决之道

书中给出了三条解决之道:

  1. 通过另外的响应规则来应对突发情况,但是这个策略很明显有问题,如果另外的响应也错了怎么办?,所以书中没有考虑这个策略
  2. 加一堆校验码,让NAK,ACK拥有自我救赎的能力(自己把自己纠正过来,即使错了),可行,但是划不来,新的校验数据无疑会增大报文的体积,减低传输的效率
  3. 冗余报文响应(这个名字是我按照我的理解起的,建议以书为标准 - 重发):故名思义
graph LR
ACK不合法 --> 重发
NAK不合法 --> 重发
NAK拒绝 --> 重发
重发 --> 直到格式合法了数据正常了
Rdt 2.1

从发送端入手,虚线部分:

发送端先是不管三七二十一把数据封装起来了,然后填上了0标志位和校验和发送到发送端,自己进入等待状态。

此时接收到来自发送端的数据,接收端也从等待状态进入到wait for 1 from below, 并且向发送发抛出了一个数据,内部有ACK,表示接受

如果接收方接受到了这个完整的ACK,那么就是Rdt2.0的节奏了,这里假设ACK错了,不合法,由于接收方接收到了一个不合法的数据,那么自然就重发

此时接收方还在等待1状态,一检查,发现发送发又给我发了一份数据,那我没办法啊,只能又发一个ACK回去,

如此往复直到发送方接收到数据之后,状态转移,向接受发发送了一个带有1的报文,若接受方也能接受,那么就皆大欢喜了

接受方和发送方都回到了最初状态了,一次传递结束了!!!

很容易不是吗?

注意点:发送发和接收方都在考验彼此,一旦对面的数据给的不合法,或者发现了错误,就会通知对方,让对方重发一次,直到双方通信完成,状态回到初始态时候终止。

也许你会问,那这种等待,想Rdt2.0 那样不是也行吗?为啥得这样做呢,这么多状态,不会眼花吗?

其实这两个状态是有道理的,

Rdt2.0 中接受方只有一个状态,就是初始态,但是初始态无法辨识当前接收方是否出现了问题,所以必须给接收方多安排一个状态。

如此发送方也必须调整一下,

发送方从 0 - 1 - 0

接收方也从 0 - 1 - 0

当其中一方或者几方处于1状态时,必然意味着出现了意外状况,就可以实现干预了。

Rdt2.2

Rdt2.2 的思想与Rdt2.1 是相同的,只是简化了步骤,其实根本不需要发NAK,只需要发ACK,区别在于带上不同的标志以区分不同的阶段

graph LR
NAK --> ACK_0
NAK不合法
ACK --> ACK_1

如此就简化了既要判断ACK,又要判断NAK的复杂场面,

只要报文不合法就重发,只要ACK 带的值不是我想要的,你也得给我重发!!

Rdt2.1 和 Rdt2.2的详细解释的更多相关文章

  1. .htaccess语法之RewriteCond与RewriteRule指令格式详细解释

    htaccess语法之RewriteCond与RewriteRule指令格式详细解释 (2012-11-09 18:09:08) 转载▼ 标签:  htaccess it 分类: 网络 上文htacc ...

  2. cookie的详细解释

    突然看到网页上中英文切换的效果,不明白怎么弄得查了查 查到了cookie 并且附有详细解释 就copy留作 以后温习 http://blog.csdn.net/xidor/article/detail ...

  3. tar命令的详细解释

    tar命令的详细解释 标签: linuxfileoutputbashinputshell 2010-05-04 12:11 235881人阅读 评论(12) 收藏 举报  分类: linux/unix ...

  4. Linux学习笔记15——GDB 命令详细解释【转】

    GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...

  5. C语言 - 结构体(struct)比特字段(:) 详细解释

    结构体(struct)比特字段(:) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26722511 结构体(struc ...

  6. 姿势体系结构的详细解释 -- C

    我基本上总结出以下4部分: 1.问题的足迹大小. 2.字节对齐问题. 3.特别保留位0. 4.这种结构被存储在存储器中的位置. #include <stdio.h> #include &l ...

  7. Java - 面向对象(object oriented)计划 详细解释

    面向对象(object oriented)计划 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/24058107 程序包括 ...

  8. 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

    迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...

  9. 设计模式 - 观察者模式(Observer Pattern) 详细解释

    观察者模式(Observer Pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/26583157 版权全部 ...

随机推荐

  1. 【原创】JS文件替换神器--Chrome ReRes插件

    本文仅供学习交流使用,如侵立删! JS文件替换神器--Chrome ReRes插件 ReRes插件安装配置 ReRes项目官方地址:https://github.com/annnhan/ReRes 谷 ...

  2. 技术分享 | ARM下中标麒麟系统ky10使用Xtrabackup-8.0.25

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 一.需求背景 查询Percona官方手册,Xtrabackup 8.0可以备份M ...

  3. WPF 实现带蒙版的 MessageBox 消息提示框

    WPF 实现带蒙版的 MessageBox 消息提示框 WPF 实现带蒙版的 MessageBox 消息提示框 作者:WPFDevelopersOrg 原文链接: https://github.com ...

  4. 金融任务实例实时、离线跑批Apache DolphinScheduler在新网银行的三大场景与五大优化

    在新网银行,每天都有大量的任务实例产生,其中实时任务占据多数.为了更好地处理任务实例,新网银行在综合考虑之后,选择使用 Apache DolphinScheduler 来完成这项挑战.如今,新网银行多 ...

  5. DolphinScheduler JSON拆解详解

    本次活动邀请DolphinScheduler社区活跃贡献者,开源积极分子,现就职于政采云大数据部门,从事大数据平台架构工作的李进勇同学给大家分享相关内容. 同时也特别感谢示说网对本次直播活动的大力支持 ...

  6. 开源深度思考 - In Community We Trust

    作者 | 黄东旭,PingCAP 联合创始人&CTO 出品 | CSDN(ID:CSDNnews) 业界一直流传着黄东旭的传说:小学三年级开始写代码,四五年级学习C语言,初中毕业时,已经能够用 ...

  7. Apache DolphinScheduler 1.3.6 功能发布说明

    参与人员 @chengshiwen.@hailin0.@wanghong1314.@ruanwenjun.@xxjingcd.@zhangguohao.@zhuangchong.@syb8535531 ...

  8. Babylon.js 入门简介和开发实例

    Babylon.js是一款WebGL开发框架,和Three.js类似. Three.js是由社区推动的,比Babylon.js要成熟些,而Babylon.js是微软推动的,和微软的相关技术结合更好. ...

  9. TS 泛型推断好难啊,看看你能写出来不

    前言 最近做东西都在用ts,有时候写比较复杂的功能,如果不熟悉,类型写起来还是挺麻烦的.有这样一个功能,在这里,我们就不以我们现有的业务来举例了,我们还是已Animal举例,来说明场景.通过一个工厂来 ...

  10. wallpaperPKG文件提取

    简单粗暴 下载这个ZIP文件链接: 下载地址戳我 提取码: ag43 解压后双击打开如下文件 我们在解压一下repkg-master.zip解压后如下,注意我的路径进入到这些很多文件的页面 返回首页复 ...