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. v-model原理问题

    v-model的原理 很多同学在理解Vue的时候都把Vue的数据响应原理理解为双向绑定,但实际上这是不准确的,我们之前提到的数据响应,都是通过数据的改变去驱动DOM重新的变化,而双向绑定已有数据驱动D ...

  2. 技术分析 | 浅谈在MySQL体系下SQL语句是如何在系统中执行的及可能遇到的问题

    欢迎来到 GreatSQL社区分享的MySQL技术文章,如有疑问或想学习的内容,可以在下方评论区留言,看到后会进行解答 SQL语句大家并不陌生,但某种程度上来看,我们只是知道了这条语句是什么功能,它可 ...

  3. mybatis 08: 返回主键值的insert操作 + 利用UUID获取字符串(了解)

    返回主键值的insert操作 应用背景 图示说明 在上述业务背景下,涉及两张数据表的关联操作:用户表 + 用户积分表 传统操作:在对用户表执行完插入语句后,再次查询该用户的uid,将该uid作为外键, ...

  4. 125. 验证回文串--LeetCode

    来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/valid-palindrome 著作权归领扣网络所有.商业转载请联系官方授权,非商业转载请注明出处. ...

  5. 【Go实战基础】GO语言是什么,有哪些优势

    一.简介 2007年,为了提高在多核.网络机器(networked machines).大型代码库(codebases)的业务场景下的开发效率,Google 首席软件工程师决定创造一种语言那就是 Go ...

  6. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  7. PHP极简短连接

    可用于短连接开发 随便找个PHP空间存放即可 点击查看代码 <html> <head> <meta charset="utf-8"/> < ...

  8. Java方法总结

    什么是方法 何谓方法 就是一个方法只完成一个功能,这样利于后期的扩展 例子: public static void main(String[] args) {    System.out.printl ...

  9. shell实现自动挂载优盘

    #!/bin/sh is_empty_dir(){ return `ls -A $1|wc -w` } is_usb_in(){ return `dmesg |tail -100000|grep -i ...

  10. Python 第四次实验

    1.(程序设计)定义函数def GetRandomChar(),返回一个随机的数字或大写或小写字母,每个符号出现的机会相等.调用该函数8次,生成并输出一个8位的验证码.用户输入该验证码,如果验证码正确 ...