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. python面向对象的特征及反射

    目录 派生类实操 面向对象特征之封装 property伪装属性(python内置装饰器) 面向对象特征之多态 面向对象之反射 派生类实操 1.将时间字典序列化成json格式,由于序列化数据类型的要求, ...

  2. 在Ubuntu下编译安装GreatSQL

    在Ubuntu下编译安装GreatSQL 本次介绍如何利用Docker构建Ubuntu环境,并将GreatSQL源码编译成二进制文件. 1.准备工作 先创建本次Docker的workdir为 /dat ...

  3. Reactive UI -- 反应式编程UI框架入门学习(二)

    前文Reactive UI -- 反应式编程UI框架入门学习(一)  介绍了反应式编程的概念和跨平台ReactiveUI框架的简单应用. 本文通过一个简单的小应用更进一步学习ReactiveUI框架的 ...

  4. Selenium 4 有哪些不一样?

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/d59b986c.html 你好,我是测试蔡坨坨. 众所周知,Selenium在2021年10月13号发布了Selenium4 ...

  5. io几乎没有,iowait却很高

    遇到如下一种情况: top - 09:43:03 up 2 days, 22:48, 9 users, load average: 133.19, 132.60, 132.32 Tasks: 767 ...

  6. DECIMAL 数据处理原理浅析

    注:本文分析内容基于 MySQL 8.0 版本 文章开始前先复习一下官方文档关于 DECIMAL 类型的一些介绍: The declaration syntax for a DECIMAL colum ...

  7. 什么?WPF 不支持 SVG ?

    什么?WPF 不支持 SVG ? 控件名:SharpVectors 作者:Elinam LLC (Japan) 项目地址: https://github.com/ElinamLLC/SharpVect ...

  8. HDU6623 Minimal Power of Prime (简单数论)

    题面 T ≤ 50   000 T\leq50\,000 T≤50000 组数据: 输入一个数 N N N ( 2 ≤ N ≤ 1 0 18 2\leq N\leq 10^{18} 2≤N≤1018) ...

  9. 1.1_selenium+Python自动化测试大纲

  10. 做自动化测试选择Python还是Java?

    你好,我是测试蔡坨坨. 今天,我们来聊一聊测试人员想要进阶,想要做自动化测试,甚至测试开发,如何选择编程语言. 前言 自动化测试,这几年行业内的热词,也是测试人员进阶的必备技能,更是软件测试未来发展的 ...