可靠数据传输原理


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

1、总览

1.1 不可靠传输

什么叫不可靠传输?在传输中,在接收方可能出现以下问题:

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

1.2 可靠传输

  • 通过各种手段解决了以上问题,就成为可靠传输了
  • 可靠数据传输简称Rdt

2、差错

2.1 Rdt2.0

2.1.1 问题描述

如果传输过程出差错(指包内部位丢失,错位等),我们要做什么?

2.1.2 设计思路(Rdt2.0)

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

  • 接收方检测出差错,并告诉发送方
  • 错了已经不能回头,只能重新传一次
2.1.2 ACK确认与ARQ协议
  • 关键词:校验和ACK与NAK重传停等协议
2.1.2.1 ACK确认与NAK重发
  • 如果接收方成功收到分组,并且通过校验和判定这个包没出差错,就会回发一个“ACK”(positive acknowledgment)确认。如果检测出差错,就发送"NAK"(negative acknowledgment)
  • 发送方通过接收方的回复,判断发送是否出现了差错(收到回复之前他不会继续发),当收到ACK,就继续发下一个包,如果是NAK,就重发这个包。
  • Rdt2.0解决了差错问题,但是没有考虑ACK与NAK出现错误的情况
2.1.2.2 ARQ协议

这种具有自动重传机制的可靠数据传输协议称为ARQ(auto repeat reQuest)协议。在实现过程中,分为发送端与接收端,下面我们就分别探讨一下。

2.1.2.2.1 发送端

发送端的状态,有两种:

  • 一种是发送状态,在这个状态中,上层可以调用rdt_send(data)方法指示其发送数据,并进入等待状态。发送端与接收端这两个状态是可以互转的。
  • 另一种是等待状态,等待状态需要等接收端的回复,进而进入相应的处理流程(当收到ACK,进入到发送状态,继续发下一个包;如果是NAK,就重发这个包)。发送端与接收端这两个状态是可以互转的。

在这里插入图片描述

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

注意此时是下层调用这个状态,因为接收端的数据是从下层往上层传的
在这里插入图片描述

横线上面为调用该状态的方法,下面为该状态自己进行的方法
2.1.2.2.3 演示过程
  • 没有错误:
    红圈表示初始状态,data会加上checksum打包后发到接收端,发送端停等,然后接收端发回ACK确认,发送方状态变化,一次发送执行完毕
    在这里插入图片描述
  • 出错
    在这里插入图片描述

3、乱序与冗余

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

3.1 Rdt2.1(添加序列号,解决包的乱序问题)

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

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

3.1.3 设计方案
  • 加上校验和,状态翻倍;再加上序列号,状态再翻倍
    在这里插入图片描述
  • 接收方也是,分为希望收到0的状态和希望收到1的状态
    在这里插入图片描述

3.2 Rdt2.2(使用升级版ACK,解决包的重传问题)

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

总状态,上面是发送方,下面是接收方
在这里插入图片描述

4、丢包

  • 关键词:定时器

4.1 问题描述

如果发送方发的包半路丢失,接收方不知道情况,导致发送方永远等下去

4.2 设计思路

很简单,设计发送方合理的等待时间,超过就重传
问题:包没有丢失,ACK延迟到达接收方导致了重传,就会产生冗余(不过我们Rdt2.2已经解决了问题)

4.3 设计方案

  • a为正常发送
  • b为发送方丢包,黑线为定时器时间,超过即重发
    在这里插入图片描述
  • c为接收方丢包(ACK丢失)
  • d为ACK延迟,导致重发冗余
    在这里插入图片描述
  • d最后收到了姗姗来迟的ACK1,但是他要的是ACK0,此时该怎么办?(以后再解释)

5、性能

5.1 问题描述

从以上可以看到,停等协议使得发送方很多时间往往在等待,导致它的性能很差,比如:
在这里插入图片描述
我们可以直观感受下,下图中两个竖线之间的面积为可用网络资源,青色部分为用到的,所以性能很差,利用率仅为0.00027
在这里插入图片描述

5.2 流水线协议

5.2.1 使用流水线协议解决利用率低的问题

如下图,同时发3个就可以将性能提高3倍
在这里插入图片描述

5.2.2 带来的新问题:需要使用更多的分组序号

每多发一个分组,就必须多分配一个序列号,原来仅有0和1,现在需要更多的序号,为了解决这个问题,引入了滑动窗口协议(Go-Back-n(GBN)和 SR)
在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDP协议是一种无连接的传输协议,它不对数据传输进行可靠性保证,因此在进行数据传输时,可能会出现数据丢失、重复、乱序等问题。为了保证UDP数据传输可靠性,需要使用一些技术手段进行处理,其中最常用的是使用UDP Socket实现可靠数据传输。 UDP Socket是在UDP协议基础上进行实现的一个套接字。UDP Socket可以通过设置一些参数和使用一些技术手段,来实现UDP数据传输可靠性。下面就具体介绍UDP Socket实现可靠数据传输原理。 1.数据分片 UDP Socket将数据分片传输,每个数据分片都包含一个序号,接收端可以通过序号来判断数据分片是否存在丢失、重复或者乱序等问题。如果数据分片存在以上问题,则可以进行相应的处理,从而保证数据传输可靠性。 2.确认机制 UDP Socket采用确认机制来保证数据传输可靠性。发送端在发送每个数据分片后,会等待接收端返回确认信息,确认信息包含接收到的数据的序号。如果接收端返回的确认信息与发送端发送的序号不一致,则说明数据分片存在丢失或者乱序问题,发送端需要重新发送该数据分片。 3.超时重传机制 UDP Socket采用超时重传机制来保证数据传输可靠性。发送端在发送每个数据分片后,会设置一个超时时间,在超时时间内如果未收到接收端的确认信息,则发送端会重新发送该数据分片。通过这种方式,可以保证数据分片不会因为网络问题而丢失。 4.流量控制 UDP Socket采用流量控制来保证数据传输可靠性。在数据传输的过程中,发送端需要根据接收端的处理能力来控制数据的发送速度,防止数据发送过快导致接收端无法及时处理。通过流量控制,可以避免数据丢失或者传输延迟过大的问题。 综上所述,UDP Socket实现可靠数据传输原理主要包括数据分片、确认机制、超时重传机制和流量控制等方面。通过这些技术手段,可以保证UDP数据传输可靠性,从而满足各种网络应用的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值