计算机网络探索(七)可靠数据传输原理

主机内部的传输数据被封装为“报文段”,而在主机之间,报文段加上了ip地址头部,我们称为“分组”,为了简便,我们简称为“包”

总览

什么叫不可靠传输?简单来说,这种传输中,在接收方可能出现以下问题,可靠传输就是通过各种手段解决
可靠数据传输简称Rdt
书中Rdt1.0表示再可靠信道上传输,当然就是可靠传输
而实际上,信道不可靠,因为他会出现以下问题

问题 方案
差错(包内部字节乱序,丢失等) ACK与NAK反馈
冗余(重复传了同一个包) 分组序号
乱序(包之间排序出现混乱) ACK与NAK序号
丢包 倒计数定时器

可能现在还看不太懂方案是啥意思,没关系,本片博客就是为解释上面这个表而生成的
解决了以上问题,就成为可靠传输了

差错

关键词:校验和,ACK与NAK重传,停等协议

设计思路

如果传输过程出差错(指包内部位丢失,错位等),我们要做什么?
我们只能做,并且必须做两点:

  1. 接收方检测出差错,并告诉发送方
  2. 错了已经不能回头,只能重新传一次

ACK确认与ARQ协议

如果接收方成功收到分组,并且通过校验和判定这个包没出差错,就会回发一个“ACK”(positive acknowledgment)确认.
如果检测出差错,就发送"NAK"(negative acknowledgment)

接收方通过发送方的回复判断发送是否出现了差错(所以收到回复之前他不会继续发),当收到ACK,就继续发下一个包,如果是NAK,就重发这个包

这种具有自动重传机制的可靠数据传输协议称为ARQ(auto repeat reQuest)协议

下图是发送端的状态,有两种,一种是发送状态,在这个状态中,上层可以调用rdt_send(data)方法指示其发送数据,并进入等待状态,另一种是等待状态,两个状态可以互转,等待状态接受到

横线上面为调用该状态的方法,下面为该状态自己进行的方法

接收端状态(注意此时是下层调用这个状态,因为接收端的数据是从下层往上层传的)

现在我们来演示,假设没有错误

如图所示
红圈表示初始状态
data会加上checksum打包后发到接收端,发送端停等,然后接收端发回ACK确认,发送方状态变化,一次发送执行完毕

出错的时候同理

解决了差错问题
Rdt2.0缺陷:没有考虑ACK与NAK的错误情况


冗余与乱序

关键词:序列号与升级版ACK

Rdt2.1

如果ACK与NAK出错,那么发送方将会收到一个不可识别的确认消息
解决方法:重传
问题:导致发送的分组重复,产生冗余问题

思路

给分组加序号(0,1),接收方收到两个相同序号的分组时,抛弃后来的,同时要发ACK,让发送方知道,避免他重传

设计方案

加上校验和,状态翻倍,再加上序列号,状态再翻倍

接收方也是,分为希望收到0的状态和希望收到1的状态

Rdt2.2

原来的NAK作用在于告诉发送方我没收到某个分组
现在用升级版ACK,也就是在ACK中加上确认的序列号,告诉发送方:“我已经收到了这个序列号的分组”
发送方识别下一次要发哪一个分组

总状态,上面是发送方,下面是接收方


丢包

关键词:定时器
如果发送方发的包半路丢失,接收方不知道情况,导致发送方永远等下去

思路

很简单,设计发送方合理的等待时间,超过就……
哈哈,当然还是伟大的重传啦!!!
问题:包没有丢失,ACK延迟到重传之后来了,导致冗余(不过我们Rdt2.2已经解决了问题)

设计方案

a为正常发送,b为发送方丢包,黑线为定时器时间,超过即重发

c为接收方丢包(ACK丢失),d为ACK延迟,导致重发冗余

d的最后收到了姗姗来迟的ACK1,但是他要的是ACK0,此时该怎么办?(以后再解释)

性能

从以上可以看到,停等协议,发送方很多时间往往在等待,所以导致他的性能很差
举例说明

直观感受,两个竖线之间的面积为可用网络资源,青色部分为用到的,所以性能很差,利用率仅为0.00027

方案:流水线协议

如图,同时发3个就可以将性能提高3倍

新问题:分组序号

每多发一个分组,就必须多分配一个序列号,原来仅有0和1,现在需要更多的序号

新方案:滑动串口协议


有两种滑动窗口协议

GBN

Go-Back-n

SR
全部评论

相关推荐

05-09 12:10
济宁学院 Java
程序员小白条:丰富下简历,有点少了,中小厂反正看运气海投
点赞 评论 收藏
分享
xdm 早上喝奶茶差点喷出来。事情是这样的,我们班有个哥们儿,简称 L,去年秋招拿了字节sp,专业方向是后端。我们当时都震惊:这哥们儿平时课上从来不发言,期末小组作业基本是划水的那种,刷题平台 commit记录我点进去看过,绿格子稀稀拉拉。但他面试一路绿灯。一面二面三面 hr 面,全过,给的还是sp。当时班级群里恭喜他的、问他经验的、约饭的,热闹了一周。他说自己"运气好,准备充分"。我们都信了,直到三月初他入职。入职第二周开始,班里另一个进字节的同学W(在隔壁组的)开始跟我他的不对劲。一开始是写代码慢,后来写不出来,再后来是组里 mentor 让他fix 一个简单 bug 都搞了一下午没动静。最离谱的是上周。W 说他们大部门搞了个新人分享会,让新人讲一下自己负责模块的设计思路。L 上去讲了 20分钟,全程念稿子,问答环节别人随便问一个"那你这里为什么用 Redis 不用 Memcached",他直接卡 30秒说"这个我回去再确认一下"。会后他 mentor 直接找 leader 谈,leader 找 hr 谈,hr调出了他面试录像,全程对比口型和回答节奏,发现他二三面有大量时长在偷偷看屏幕外(推测开了双机位 AI 答题)。(这段是 W后来转述给我的,他自己也是听他组里同事八卦来的)昨天下班前,W 告诉我L 被辞退了,让他自己走,不走就走仲裁但会发函到学校。L 现在已经回学校了,朋友圈仅三天可见。我说真的,我不是个心眼小的人,但是我看到这个消息的时候真的有种"嗯,挺好"的感觉。去年秋招我投字节后端,简历挂。我准备了八个月,背 八股 + 刷 500 题 +项目改了三版,连面试机会都没拿到。班里这哥们儿凭着一个外挂上岸,最后还是被甩出来了。不是说作弊就一定会被发现,但是当面试拿到的 offer远远超出真实能力的时候,迟早会有这一天。试用期三个月不是给你过家家的,是真的要写代码、要在会议上回答问题、要扛需求的。我现在反而有点同情他。同情他相信"上岸就是终点"。发出来不是为了嘲笑谁,就是想说给那些正在被身边作弊上岸的同学搞得很 emo 的 uu 们听——别急,回旋镖很长,但它一定会回来。你继续刷你的题,写你的项目,背你的八股。该是你的迟早是你的,不是你的早晚还得还回去。xdm 共勉。
牛客12588360...:我不想评论面试方式,作弊是绝对不对的,但是你八股加刷题也不过是个做题小子,他穿帮纯粹是他菜,你也没有高明到哪里去
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务