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

article/2025/10/9 8:30:35

🚀 优质资源分享 🚀

学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统

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

目录* Rdt2.1 和 Rdt2.2的详细解释
+ - 这俩为啥会出现?
- 解决之道
* Rdt 2.1
* Rdt2.2

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

这俩为啥会出现?

既然大版本好是2.0,我们可以回忆一下2.0阶段做了什么事情
Rdt2.0中增加了检验纠错的结构,也就是应答。

#mermaid-1666026028681 {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-1666026028681 .error-icon{fill:#552222;}#mermaid-1666026028681 .error-text{fill:#552222;stroke:#552222;}#mermaid-1666026028681 .edge-thickness-normal{stroke-width:2px;}#mermaid-1666026028681 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-1666026028681 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-1666026028681 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-1666026028681 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-1666026028681 .marker{fill:#333333;stroke:#333333;}#mermaid-1666026028681 .marker.cross{stroke:#333333;}#mermaid-1666026028681 svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-1666026028681 .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-1666026028681 text.actor>tspan{fill:black;stroke:none;}#mermaid-1666026028681 .actor-line{stroke:grey;}#mermaid-1666026028681 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-1666026028681 .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-1666026028681 #arrowhead path{fill:#333;stroke:#333;}#mermaid-1666026028681 .sequenceNumber{fill:white;}#mermaid-1666026028681 #sequencenumber{fill:#333;}#mermaid-1666026028681 #crosshead path{fill:#333;stroke:#333;}#mermaid-1666026028681 .messageText{fill:#333;stroke:#333;}#mermaid-1666026028681 .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-1666026028681 .labelText,#mermaid-1666026028681 .labelText>tspan{fill:black;stroke:none;}#mermaid-1666026028681 .loopText,#mermaid-1666026028681 .loopText>tspan{fill:black;stroke:none;}#mermaid-1666026028681 .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-1666026028681 .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-1666026028681 .noteText,#mermaid-1666026028681 .noteText>tspan{fill:black;stroke:none;}#mermaid-1666026028681 .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-1666026028681 .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-1666026028681 .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-1666026028681 .actorPopupMenu{position:absolute;}#mermaid-1666026028681 .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-1666026028681 .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-1666026028681 .actor-man circle,#mermaid-1666026028681 line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-1666026028681 :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}senderreceiver发送消息(备注:你看看对不对?)(跳转到等待态)啊对对对,这玩意是我想要的(receiver验货,正常ACK返回)爷终于放心了,可以发下一个了(状态回溯到初始状态)不对啊,我不收(异常NAK)重发senderreceiver

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

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

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

解决之道

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

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

#mermaid-1666026028746 {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-1666026028746 .error-icon{fill:#552222;}#mermaid-1666026028746 .error-text{fill:#552222;stroke:#552222;}#mermaid-1666026028746 .edge-thickness-normal{stroke-width:2px;}#mermaid-1666026028746 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-1666026028746 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-1666026028746 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-1666026028746 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-1666026028746 .marker{fill:#333333;stroke:#333333;}#mermaid-1666026028746 .marker.cross{stroke:#333333;}#mermaid-1666026028746 svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-1666026028746 .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-1666026028746 .cluster-label text{fill:#333;}#mermaid-1666026028746 .cluster-label span{color:#333;}#mermaid-1666026028746 .label text,#mermaid-1666026028746 span{fill:#333;color:#333;}#mermaid-1666026028746 .node rect,#mermaid-1666026028746 .node circle,#mermaid-1666026028746 .node ellipse,#mermaid-1666026028746 .node polygon,#mermaid-1666026028746 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-1666026028746 .node .label{text-align:center;}#mermaid-1666026028746 .node.clickable{cursor:pointer;}#mermaid-1666026028746 .arrowheadPath{fill:#333333;}#mermaid-1666026028746 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-1666026028746 .flowchart-link{stroke:#333333;fill:none;}#mermaid-1666026028746 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-1666026028746 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-1666026028746 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-1666026028746 .cluster text{fill:#333;}#mermaid-1666026028746 .cluster span{color:#333;}#mermaid-1666026028746 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-1666026028746 :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}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,区别在于带上不同的标志以区分不同的阶段

#mermaid-1666026028823 {font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-1666026028823 .error-icon{fill:#552222;}#mermaid-1666026028823 .error-text{fill:#552222;stroke:#552222;}#mermaid-1666026028823 .edge-thickness-normal{stroke-width:2px;}#mermaid-1666026028823 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-1666026028823 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-1666026028823 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-1666026028823 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-1666026028823 .marker{fill:#333333;stroke:#333333;}#mermaid-1666026028823 .marker.cross{stroke:#333333;}#mermaid-1666026028823 svg{font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:16px;}#mermaid-1666026028823 .label{font-family:“trebuchet ms”,verdana,arial,sans-serif;color:#333;}#mermaid-1666026028823 .cluster-label text{fill:#333;}#mermaid-1666026028823 .cluster-label span{color:#333;}#mermaid-1666026028823 .label text,#mermaid-1666026028823 span{fill:#333;color:#333;}#mermaid-1666026028823 .node rect,#mermaid-1666026028823 .node circle,#mermaid-1666026028823 .node ellipse,#mermaid-1666026028823 .node polygon,#mermaid-1666026028823 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-1666026028823 .node .label{text-align:center;}#mermaid-1666026028823 .node.clickable{cursor:pointer;}#mermaid-1666026028823 .arrowheadPath{fill:#333333;}#mermaid-1666026028823 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-1666026028823 .flowchart-link{stroke:#333333;fill:none;}#mermaid-1666026028823 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-1666026028823 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-1666026028823 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-1666026028823 .cluster text{fill:#333;}#mermaid-1666026028823 .cluster span{color:#333;}#mermaid-1666026028823 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:“trebuchet ms”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-1666026028823 :root{–mermaid-font-family:“trebuchet ms”,verdana,arial,sans-serif;}NAKACK_0NAK不合法ACKACK_1如此就简化了既要判断ACK,又要判断NAK的复杂场面,

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


http://chatgpt.dhexx.cn/article/2lYOjZhE.shtml

相关文章

rdt(可靠数据传输)

构造可靠数据传输 rdt(reliable data transfer protocol,可靠数据传输协议) 什么是可靠? 不错、不丢、不乱 1.rdt1.0:可靠信道上的可靠数据传输 最简单的情况即为底层信道是完全可靠的,则该协议非常简…

16、可靠数据传输(rdt)的原理

一、可靠的数据传输(rdt) 1、什么是可靠数据传输:不出错、不冲突、不失序、不丢失 2、如何实现可靠数据传输? 需要借助于下层提供的协议,但是如果下层提供服务不可靠呢?本层的协议机制,协议实体…

Rdt协议(可靠运输协议)

提示:文章写完后 文章目录 前言一、可靠数据传输原理二、Rdt协议1.Rdt 1.0(可靠信道)2.Rdt 2.0(ARQ重传)3.Rdt 2.1(序列号)4.Rdt 2.2(无NAK)5.Rdt 3.0(定时器) 总结 前言 提示:以下是本篇文章正文内容 一、可靠数据传输原理 可靠指数据在传输过程中不错…

RDT 协议 (可靠数据传输协议)

RDT (reliable data transfer)协议详解 零、文档目录 .名词解释 背景介绍 rdt协议的实现 总结 疑问解析 参考文献 一、名词解释 rdt协议(reliable data transfer)可靠数据传输协议 二、背景介绍 计算机网络通过对网络进行…

rdt 可靠数据传输协议

计算机网络的设计基本方案是复杂化,多功能化应用层,运输层的协议设计,从而使得网络层,链路层,物理层变得相对简单,网络搭建的物质条件变得简单。由于网络层较为简单,采用了无连接的协议&#xf…

前端开发学习之一------前端开发是什么以及我们要学什么

1.web前端开发工程师是做什么的 简单地说,就是要与网站打交道 2.成为一名web前端工程师需要具备的条件 ①兴趣 ②敲代码(实践、需要去练习) 3.Web前端开发工程师需要学习什么(重点:HTML,CSS,JavaScript硬性指标) ①软件(代码的辅助工具) 浏览器:浏览器有非常多,(…

前端学习.

前端学习 基础学习路线网页简介1.html2.网页 常用的浏览器Web标准HTML标签(上)HTML语法规范HTML基本结构标签网页开发工具HTML常用标签HTML中的注释和特殊字符 HTML标签(下)表格标签表格总结 列表标签列表总结 表单标签综合案例直…

我的前端学习经历

我最近在开发一个NFT相关的Saas,部分截图如下: 这是我一段时间前,朋友圈发的图,现在Saas在页面上有点变化,但懒得再截图了。客观而言,布局还可以,这一套的技术栈是:React TailwindC…

前端学习路线

这里写目录标题 1、产品经理。2、UI设计师。3、项目经理。4、最终用户。 一、基础二、JS1.JS变量2.JS运算符3.JS数组4.JS流程语句5.JS字符串函数6.JS函数基础7.JS基础DOM操作8.JS正则表达式9.JS数据类型 三、后端语言四、学习方法建议 前端开发工程师 不仅要掌握基本的Web前端开…

WEB前端开发学习5大网站,你用过几个?

“工欲善其事,必先利其器”,学习WEB前端开发也是一样。 一、前端视频教程-51自学网 我要自学网是由佛山市丰智胜教育咨询服务有限公司倾力打造的在线实用技能学习平台。该平台成立于2007年6月7日,是一家专业从事软件视频教程开发的教育服务机构。开发团队由奋战在教学第一线…

前端开发工程师学习路线图(收藏版)

在网上看到很多类似“前端现在是不是饱和了,是不是不好找工作了呀?”这类问题,就这类问题也和小伙伴进行了探讨,大家一致认为——不是前端饱和了,而是现在前端的工作在不断独立,门槛越来越高,再…

什么是前端开发及学习路线

一、什么是前端开发 前端开发是创建Web页面或app等前端界面呈现给用户的过程,在这个过程中需要学习并使用,HTML、CSS、JavaScript以及衍生出的各种技术、框架;其中最基础也最核心的就是:HTML、CSS、JavaScript,俗称“…

前端开发学习及工具网站(持续更新)

前端开发学习及工具网站 该文章主要是记录前端开发中好的学习网站或者工具网站 大部分实用网站来源抖音鱼皮大佬分享,这里分享给大家 1、w3cschool(编程狮) 这个网站适合0基础学前端的同学,内容简单易懂,在闯关中进行学习,能够刺…

前端开发免费学习资源分享

知乎上很多同学在问什么前端培训,怎么入行啥的 我这里给大家先总结一下,老师会给大家分享一些基础的学习资料如果你入不了门,就不要去搞啥前端了, 没有用的,一点基础没有去培训你也听不懂 黑马程序员pink老师前端入…

送给大家一套完整的web前端开发学习路线

本文来源:千锋web前端开发 近几年IT业可谓是发展火热,而且新生了很多的职业。在这众多的新生职业中备受瞩目的当属web前端工程师了,web前端在IT行业真正受到重视的时间不超过五年,但是web前端的发展前景却是非常的可观&#xff0…

Web前端开发学习(一)

目录 一、HTML的基础Tag用法 以下内容使用VSCode编写,LiveServe插件和Chrome浏览器生成网页。 Web前端学习,只要学会HTML和CSS(层叠样式表)就可以搭建出自己的页面啦!其中HTML的功能是为页面添加内容,CSS…

Web前端学习

第一步:拨云见日 1.基础部分:HTML 、CSS 2. 切图流程:传统切图、智能切图、公司流行切图 3.实战阶段:PC企业站布局 PC游戏站布局 第二步:溯本求源 1.扩展: HTML 、CSS 2 .新语法: HTML5 、 C…

Web前端入门学习

目录 导言1.拨云见日2.溯本求源3.风生水起4.巧夺天工 Web的入门知识1.什么是HTML、CSS?2.VS code 编辑器?3.学习编辑器的基本使用4.chrome浏览器?5.了解网站开发?6.HTML基础知识与属性7.HTML的初始代码8.HTML注释?9.HT…

关于前端的学习

最近在网上想模拟一个ai的围棋,然后在gitee上找了一个算法,想要启动一下。 https://gitee.com/changjiuxiong/myGoChess?_fromgitee_search 使用说明是这样的: 使用说明 npm install npm run dev 打开index.html 可自定义棋盘大小: new Game…

前端开发学习常用网站网址及介绍(都是免费的)

在开发的时候,想记住所有的单词基本是不可能的,所以就需要进入文档,只要理清需求能做出来,就很不差了!! 扫码加博主微信 1.百度,俗称度娘,有不懂的就问百度,有问必答&am…