<计算机网络自顶向下> 可靠数据传输的原理

news2024/10/2 8:41:17

可靠数据传输(rdt:Reliable Data Transfer)的原理

  • rdt在应用层,传输层和数据链路层都很重要
  • 是网络TOP10问题之一
  • 信道的不可靠特点决定了可靠数据传输rdt的复杂性
  • rdt_send: 被上层(如应用层)调用,以将数据交付给下方的发送实体
  • udt_send: 被rdt调用,用一将分组放到不可靠的信道上传输到接收方
  • rdt_rcv: 放分组通过信道到达接收方的时候调用(修改下层的错误,传递给上层正确的信息)

  • 下面将渐增的开发rdt的发送方和接收方(上层和下层的接口都定下来以后,如何安排本层协议实体需要做那些动作,安排那些时空资源来向上层提供可靠的服务)
    • 条件;只考虑单项数据传输(但是接收方有可能会返回给发送方控制信息一类的东西,所以控制信息是双向流动的)
    • 双向的数据传输问题实际上黑丝两个单项数据传输问题的综合
    • 使用FSM(有限状态机)来描述发送方和接收方(在某一状态的时候,下一个状态只由下一个事件唯一确定
      把可靠传输依靠下层信道比作一个团队领导依靠小弟,下面小弟越没用领导的工作就越复杂,所以需要先假设他们可靠程度高一点,渐增的设计领导的工作这样更加容易一点而不是毫无头绪的直接从头设计领导工作,rdt同理

Rdt1.0: 在可靠信道上的可靠数据传输

  • 下层信道是完全可靠的
    • 没有比特出错
    • 没有分组丢失
  • 发送方和接收方的FSM
    • 发送方将数据发送到下层信道
    • 接收方从下层信道接收数据
  • 总的来说rdt1.0要做的就是封装和解封装

Rdt2.0: 具有比特差错的信道

  • 下层信道可能会出错,将分组中的比特翻转
    • 用校验和来检测比特差错
  • 从差错中恢复的办法
    • 确认(ACK):接收方显式的告诉发送方分组已经被正确接受
    • 否定确认(NACK): 接收方显式的告诉发送方发生了差错:发送方收到NAK以后重传分组
  • rdt2.0中的新机制:使用差错控制编码来进行差错检测
    • 发送方差错控制编码、缓存
    • 接收方使用编码检错
    • 接收方的反馈,控制报文(ACK.NAK):接收方->发送方
    • 发送方收到反馈相应的动作

                         

  • rdt2.0致命的缺陷
    • ACK和NACK也有可能出错
    • rdt2.1引入序号可以解决这一点

Rdt2.1:有序号

  • 处理重复:发送方在每个分组中加入序号,如果ACK/NAK出错,发送方重传当前分组

  • 如果序号重复的话,接收方丢掉重复分组,再发一次ACK

  • 这是stop and wait (停等协议):发送方发送一个分组(一次只发送一个分组),然后等待接收方的应答 

  • 发送方

    • 在分组中加入序列号,0和1两个序号即可(因为一次只发送一个未经确认的分组)

    • 必须检查ACK/NAK是否出错(需要checksum)

    • 状态数变成了两倍:必须记住当前分组的序列号是0还是1

  • 接收方

    • 必须检测接收到的分组是否是重复的

      • 状态会指示希望收到的分组的序号为0还是1

      • 注意:接收方并不知道发送方是否正确收到了ACN/NAK——没有安排确认的确认

 rdt2.2:无NAK的协议

  • 功能同rdt2.1,单只使用ACK(ack要编号)
  • 接收方对最后正确接受的分组法ACK,以替代ACK
    • 接受方必须显示的包含被正确接收分组的序号
  • 当收到重复的ACK(如:再次收到ACK0)的时候,发送方与收到NAK采取相同的动作:重传当前分组
  • 为后面的一次发送多个数据单位做准备
    • 一次能够发送多个,每一个的应答都有:ACK, NACK太麻烦了
    • 使用对前一个数据单位的ACK代替本数据单位的NAK
    • 确认信息减少一半,协议处理简单
  • 2.2和2.1的唯一区别就是2.2没有NAK

Rdt3.0:具有比特差错和分组丢失的信道——超时重传机制

  • 下层信道可能会丢失分组(数据或者ACK)
    • 会死锁:发送的时候分组丢失(比如队列满了包丢失等等)比如发送p1包到接收方,p1中间没了,发送方等待AK,接收方等待p1
    • 机制还不够处理这种状况(下面列出来的只是帮助回忆之前的机制)
      • 检验和
      • 序列号
      • ACK
      • 重传
    • 方法:发送方等待ACK一段合理的时间
      • 发送端超时重传,如果导师没有收到ACK->重传
      • 问题:如果分组(或ACK)只被延迟了
        • 重传将会导致数据重复,但利用序列号一已经可以处理这个问题
        • 接收方必须指明被正确接收的序列号
      • 需要一个倒计数定时器(设置为比正常往返稍微多一点点的时间)
    • 链路层的timeout时间是确定的(往返延迟分布比较集中),传输层timeout时间是适应式的(往返延迟分布比较分散)

      链路层(数据链路层)定时器设置固定: 链路层通常负责在相邻节点之间进行数据传输,其定时器设置一般较为固定。这是因为在局域网或广域网等较小范围内的链路上,往返延迟相对较低且相对稳定,数据包的传输时间相对可预测。因此,链路层的定时器一般采用固定的超时时间,以适应这种相对稳定的网络环境。

      传输层定时器设置适应性强: 传输层负责在端到端的通信中提供可靠的数据传输服务,其定时器设置一般需要更加灵活和适应性强。在互联网等大范围网络中,往返延迟可能会受到多种因素的影响,如网络拥塞、路由器处理延迟、数据包丢失等,导致数据包的传输时间波动较大,难以准确预测。因此,传输层通常采用自适应的超时时间设置策略,如 TCP 中的拥塞控制算法(如慢启动、拥塞避免)和快速重传机制,以根据网络状况动态调整超时时间,从而提高数据传输的效率和可靠性。

    • 过早超时(延迟的ACK)也能够正常工作;但是效率较低,一半的分组和确认是重复的,所以设置一个合理的超时时间也是比较重要的

  • rdt3.0的性能
    • stop and wait效率太低,信道的容量比较大,包发出去要好久才能到目标主机,特别费时间,比如下面的例子,花了1G的钱仅仅可以得到270kbps有效带宽,所以要一次发送多个包

slide window(滑动窗口)协议

发送端有一个缓冲区(发送缓冲区),发送方把一个分组发送完毕了以后,仍然将那个分组留在缓冲区以便检错重发或者超市抽放。接收端也有一个缓冲区。这个缓冲区是为了平衡发送速率与用户接受速率(一般后者是比前者要慢的)

  • 发送缓冲区
    • 形式:内存中的一个区域,落入缓冲区的分组可以发送
    • 功能:用于存放已发送但是没有得到确认的嗯组
    • 必要性:需要重发的时候可用
  • 发送缓冲区中的分组
    • 未发送的:落入发送缓冲区的分组,可以连续发送出去
    • 已经发送出去的,等待对方确认的分组;发送缓冲区的分组只有得到确认才能删除
  • 发送缓冲区窗口,是发送缓冲区的子集,用于存放已经发送但是未确认的分组的范围。没发送一个分组,发送缓冲区窗口向前滑动一个单位,前沿滑动的极限就是发送缓冲区的大小后沿滑动的极限就是滑动缓冲区的最前方(后沿滑动是因为收到ACK)。实际上是分组在动窗口不动(这里说窗口动是指相对滑动)
  • 发送缓冲区的大小:一次最多可以发送多少个未经确认的分组
    • 停止等待协议=1(sw=rw=1)
    • 流水线协议>1,这里必须要合理的值,不可以很大,链路利用率不可以超过100%

Pipeline(流水线或者是管道化)协议

连续发送多个未经确认的分组,要用多个比特来表示分组序号。假如序号由n个比特表示,那么序号的空间为2^n。

  • sw>1, rw=1是GBN协议(Go-Back-N 累计确认协议)
    • 接收缓冲区窗口等于1,只有落在接收缓冲区中的分组才能被接收,假如缓冲区已经满了,但是有新的分组到来,把这个新来的分组丢弃然后返回接收窗口最高位的分组的ACK确认信息(带有序号),因为接收窗口此时大小就是1所以直接返回最后收到的分组序号的ACK(这个协议只能顺序的一个一个接收分组)这里比如收到ACK2,就代表2及以前所有分组都收到了,是累计确认(收到的分组都会放在缓冲队列,只要没接收就还在里面,处理到这个分组的时候溢出或者前面又没收到的直接拒收)

             一个计时器,超时就重传 

 

  • sw>1, rw>1是SR协议(Selective Repeat 选择重传协议)
    • 对于正确到来的分组,需要给这个分组确认然后接收窗口向前滑动一格,滑动到接收窗口的最大值大小。要是接接收窗口里面最左边有分组没有收到,不可以向右边滑动。GBN协议不一样,SR协议是每次收到哪个发哪个的确认信息,而GBN协议之只要没收到新的一直发到来的最高序号的分组确认是。SR是非累积确认也就是独立确认(SR协议下,内容正确但乱序的包会缓存下来,并发送相应确认),整个窗口的分组全部确认了以后会一起解封装然后有序地接收

 

  •  正常情况下的两个窗口互动
    • 发送窗口 
      • 有新的分组落入发送缓冲区范围,发送->前沿滑动
      • 来了老的低序号分组的确认->后沿向前滑动->新的分组可以落入发送缓冲区的范围
    • 接收窗口
      • 收到分组,落入接收窗口范围内,接收
      • 是低序号,发送确认给对方
    • 发送端上面来了分组->发送窗口滑动->接收窗口滑动->发确认
    • 也就是说发送方有了新的分组发送进入推动发送窗口向前滑动,发送窗口向前滑动意味着接收窗口一会可以向前滑动,接收窗口向前滑动发送确认给发送端代表发送窗口也可以向前滑动,发送窗口滑动使得发送缓冲区有新的分组可能落到发送缓冲区范围之内(这就是一个连续的过程) 

  • 异常情况下SR的两个窗口活动
  • 发送窗口
    • 有新分组落入发送缓冲区范围,发送->前沿滑动
    • 超时重发机制让发送端将发送窗口中的所有分组发送出去
    • 来了老分组的重复确认->后沿不向前滑动->新的分组无法落入缓冲区的范围(此时如果发送缓冲区有新的分组可以发送)
  • 接收窗口
    • 收到乱序分组,没有落入到接受串口范围内,抛弃
    • (重复)发送老分组的确认,累计确认

  • 异常情况下SR的两个窗口活动
    • 发送窗口
      • 新分组落入发送缓冲区范围,发送->前沿滑动
      • 超时重发机制让发送端将超时的分组重新发送出去
      • 来了乱序分组的确认->后沿不向前滑动->新的分组无法落入发送缓冲区的范围(此时入如果发送缓冲区有新的分组可以发送)
    • 接收窗口
      • 收到乱序分组,落入到接收窗口范围内,接收
      • 发送该分组的确认,单独确认

  • GBN协议和SR协议的异同
    • 相同点
      • 发送窗口>1
      • 一次可以发送多个未经确认的分组
    • 不同点
      • GBN:接收窗口尺寸=1
        • 接收端只能顺序接收
        • 发送端从表现来看,一旦一个分组没有发成功:如0,1,2,3,4:;假如1没有发送成功,234都发送过去了,要把这个从1开始重新发送

  • GBN和SR优缺点以及适用范围

  •  窗口的最大尺寸(这里我没明白,有人可以回答一下吗)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1613676.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI安全之问:我们的智能助手真的安全吗?

在我们日益依赖人工智能来撰写文档、编写程序代码、甚至创作艺术作品的今天,我们是否曾经想过这些智能系统可能面临的被恶意操纵的风险? 分享几个网站 GPT-3.5研究测试: https://hujiaoai.cn GPT-4研究测试: https://higpt4.cn…

【数据结构项目】通讯录

个人主页点这里~ 原文件在gitee里~ 通讯录的实现 基于动态顺序表实现通讯录项目1、功能要求2、代码实现file.hfile.cList.hList.ctest.c 基于动态顺序表实现通讯录项目 准备:结构体、动态内存管理、顺序表、文件操作 1、功能要求 ①能够存储100个人的通讯信息 ②…

刷代码随想录有感(41):二叉树最小深度

题干: 代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), …

CK_Label_V1

CK_Label_v1(电池版) 产品型号 CK_Label_v1 尺寸 37*65*33.7mm 按键 1 指示灯 1 RGB灯(红/绿/蓝/黄/紫/白/青) 外观颜色 白色 供电方式 5号干电池供电1800mAh,可更换电池 通信方式 无线通信 合规认证 CE, RoHS 工作温度 …

FebHost:CC域名商业和非商业使用的区别

在当今互联网的世界中,域名的选择不仅关乎一个网站的在线身份,更与其背后的商业策略紧密相连。.cc 顶级域(TLD)作为众多选择之一,其使用方式可分为商业和非商业两大类。 商业用途:当提及.cc域名的商业用途…

使用yum安装pt-query-digest 并分析MySQL慢查询日志

查看慢SQL日志 1、查看慢日志设置 show variables like slow_query_log%; 2、设置慢日志开关 -- 关闭 SET GLOBAL slow_query_log OFF; -- 开启 SET GLOBAL slow_query_log ON; 3、查看慢日志阈值,即SQL执行时间超过阈值后,才会记录在慢日志文件中 …

Springboot的Test单元测试操作

Springboot的Test单元测试操作 简单总结需要操作的步骤 1&#xff0c;导入依赖 2&#xff0c;创建目录&#xff08;目录和启动类的目录保持一致&#xff09; 3&#xff0c;添加注解 4&#xff0c;写方法测试 1&#xff0c;导入依赖 <dependency><groupId>org.spri…

春游江淮 请来池州 | 3天2晚 您的专属高铁游线路来啦

“快乘高铁 趣游池州”3天2晚高铁游主题线路来喽! 各位旅客朋友请注意,连接九华山、黄山、太平湖“两山一湖”的“黄金旅游线”池黄高铁已进入开通倒计时! 本次列车共设池州、九华山、黄山西、黟县东4站。始发站池州,趁着春意正浓,和我们一起快乘高铁,趣游池州吧! DAY1 上午…

冒泡排序c++

题目描述 编程输入n(1≤n≤20)个小于1000非负整数&#xff0c;然后自动按从大到小的顺序输出。&#xff08;冒泡排序&#xff09; 输入 第一行&#xff0c;数的个数n; 第二行&#xff0c;n个非负整数。 输出 由大到小的n个非负整数&#xff0c;每个数占一行。 样例输入 …

使用 kubeadm 进行证书管理

使用 kubeadm 进行证书管理 一&#xff1a;使用 kubeadm 进行证书管理 1.检查证书是否过期 kubeadm certs check-expiration 2.手动续订证书 使用 kubeadm certs renew 命令 可以随时手动续订证书&#xff0c;该命令使用存储在/etc/kubernetes/pki中的 CA (or front-proxy-…

【JVM常见问题总结】

文章目录 jvm介绍jvm内存模型jvm内存分配参数jvm堆中存储对象&#xff1a;对象在堆中创建分配内存过程 jvm 堆垃圾收集器垃圾回收算法标记阶段引用计数算法可达性分析算法 清除阶段标记清除算法复制算法标记压缩算法 实际jvm参数实战jvm调优jvm常用命令常用工具 jvm介绍 Java虚…

【Flutter】多语言方案一:flutter_localizations 与 GetX 配合版

介绍 多语言方案&#xff1a;flutter_localizations 与 GetX 配合版&#xff0c;好处&#xff1a;命令行生成多语言字符串的引用常量类&#xff0c;缺点&#xff1a;切换语言以后&#xff0c;主界面需要手动触发setState&#xff0c;重绘将最新的Locale数据设置给GetMaterialA…

MKS GM50A MFC GUI 软件使用指南GE50A调零原理及步骤PPT

MKS GM50A MFC GUI 软件使用指南GE50A调零原理及步骤PPT

Datax助力轻松迁移SQLServer数据至GreatSQL

1.环境说明 1.1源端SQLSserver 版本IP端口Microsoft SQL Server 2017192.168.140.1601433 1.2目标端GreatSQL 版本IP端口GreatSQL-8.0.32192.168.139.863308 2.安装环境 2.1安装SQLServer环境 环境说明&#xff1a;借助Docker使用镜像启动数据库 2.1.1安装docker 1.安…

【prometheus】k8s集群部署AlertManager实现邮件和钉钉告警

目录 一、AlertManager概述 1.1 alertmanager简介 1.2 AlertManager核心概念 1.2.1 分组 1.2.2 抑制 1.2.3 静默 1.2.4 客户的行为 1.2.5 高可用性 二、Alertmanager部署邮箱告警 2.1 邮箱配置 2.2 Alertmanager global和route路由配置 2.3 部署prometheus和alertM…

如何熟悉一个陌生的业务系统

目录 一、业务层面 1.1 业务背景 1.2 业务系统概括 1.3 使用情况 1.4 业务流程演练 二、技术层面 2.1 技术架构 2.2 存储层 2.3 系统交互 2.4 运维部署 2.5 系统问题 三、总结 不知道你有没有这样的经历&#xff0c;以前维护某个系统的同事因为某些原因不在维护这个系统了&a…

真实世界的密码学(三)

原文&#xff1a;annas-archive.org/md5/655c944001312f47533514408a1a919a 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十一章&#xff1a;用户认证 本章涵盖了 认证人员和数据之间的区别 用户认证&#xff0c;根据密码或密钥对用户进行身份验证。 用户辅助认…

4.21java聊天室项目小结

基本完成了用户的登录注册功能&#xff0c;可以实现用户账号登录和邮箱登录功能&#xff0c;忘记密码通过邮箱发送验证码找回&#xff0c;注册账号功能&#xff0c;并传递给客户端更新数据库的表内容 注册功能&#xff1a; 注册成功后密码进行MD5加密并通过服务器保存到数据库…

Python 密码学实用指南(全)

原文&#xff1a;zh.annas-archive.org/md5/fe5e9f4d664790ea92fb33d78ca9108d 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 前言 密码学在保护关键系统和敏感信息方面有着悠久而重要的历史。本书将向您展示如何使用 Python 加密、评估、比较和攻击数据。总的来说&…

Java学习Go(入门)

下载Go 《官网下载golang》 直接点Download&#xff0c;然后根据你自己的操作系统进行下载&#xff0c;我这里以win10为例 安装go 默认安装到C:\Program Files\Go&#xff0c;这里我们可以选择安装到其他盘&#xff0c;也可以选择默认安装。初学者建议直接一路next。 安装完…