首页 > 其他分享 >可靠数据传输原理

可靠数据传输原理

时间:2022-12-12 16:37:11浏览次数:31  
标签:重传 ACK NAK 可靠 发送 分组 原理 数据传输 接收


  • 可靠数据传输中为上层实体提供的服务抽象是:数据可以通过一条可靠的信道进行传输。借助于可靠信道,传输数据比特就不会受到损坏(由0变成1,或者相反)或丢失,而其额所有数据都是按照其发送顺序进行交付。这恰恰就是TCP向调用它的因特网应用所提供的服务模型。
  • 我们现在一步步研究一系列协议,他们一个比一个更为复杂,最后得到一个无错、可靠的数据传输协议。
  • 底层信道使分组中的比特可能受损。在分组的传输、传播或缓存的过程中,这种比特差错通常会穿线在网络的物理部件中。我们先假设所有发送的分组将按其发送顺序被接收。
  • 肯定确认与否认确认。这些控制报文使得接收方可以让发送方知道哪些内容被正确接收,哪些内容接收有误并因此需要重复。在计算机网络环境中,基于这样重传机制的可靠数据传输协议称为自动重传请求协议。
  • 差错检测。需要一种机制以使接收方检测到何时出现了比特差错。
  • 接收方反馈。在口述报文情况下回答的“肯定确认“(ACK)和”否定去人“(NAK)就是这种反馈的例子。我们的协议将从接收方向发送方回送ACK与NAK分组。理论上,这些分组只需要一个比特长;如用0表示NAK,用1表示ACK。
  • 重传。接收方收到了有差错的分组时,发送方将重传该分组。
  • 注意到下列事实很重要:当发送方处于等待ACK或NAK的状态时,它不能从上层获得更多的数据;这就是说,rdt_send()事件不可能出现;仅当接收到ACK并离开该状态时才能发生这样的事件。因此,发送方将不会发送一块新数据,除非发送方确信接收方已正确接收当前分组。由于这种行为,这样的协议称为停等协议。
  • 以上方式存在一个致命的缺陷,没有考虑ACK或NAK分组受损的可能性。解决这个新问题的一个简单方法(几乎所有现有的数据传输协议中,包括TCP,都采用了这种方法)是在数据分组中添加一新字段,让发送方对其数据分组编号,即将发送数据分组的序号放在该字段。于是,接收方只需要检查序号即可确认接收到的分组是否一次重传。对于停等协议这种简单情况,1比特序号就足够了,因为它可让接收方知道发送方是否正在重传前一个发送分组(接收到的分组需要与最近收到的分组序号相同),或是一个新分组(序号变化了)。因为目前我们假设信道不丢失分组,ACK和NAK分组本身不需要指明他们要确认的分组序号,发送方知道锁接收的ACK和NAK分组(无论是否是含糊不清的)是为响应其最近发送的数据分组而生成的。
  • 发送方需要等待多久才能确定已丢失了某些东西呢?等待一个最坏情况的时延可能意味着要等待一段很长的时间,知道启动差错恢复为止。因此实践中采取的方法是发送方明智地选择一个时间值,以判断可能发生了丢包(尽管不能确保)。如果在这个时间内没有收到ACK,则重传该分组。注意到如果一个分组经历了一个特别大的时延,发送方可能会重传该分组,即使该数据分组及其ACK都没有丢失。这就在发送方到接收方的信道中引入了冗余数据分组的可能性。前面已经通过序号来处理冗余分组情况。
  • 从发送方的观点来看,重传是一种万能灵药。发送方不知道是一个数据分组丢失,还是一个ACK丢失,或者只是改分组或ACK过度延时。在所有这些情况下,动作是同样的:重传。为了实现基于时间的重传机制,需要一个倒计时定时器,在一个给定的时间量过期后,可中断发送方。因此,发送方需要能做到:1每次发送一个分组(包括第一次分组和重传分组)时,便启动一个定时器。2响应定时器中断(采取适当的动作)3终止定时器。
  • 现在我们归纳一下数据传输协议的要点。在检验和、序号、定时器、肯定和否定确定分组这些技术中,每种机制都在协议的运行中起到了必不可少的作用。
  • 以上是一个功能正确的协议,但并非人人都对它的性能满意,特别是在今天的高速网络中更是如此。核心问题在于它是一个停等协议。~~~~~~~~~~下回分解

标签:重传,ACK,NAK,可靠,发送,分组,原理,数据传输,接收
From: https://blog.51cto.com/u_12026373/5930792

相关文章

  • protobuf原理(一):编码原理
    protobuf自身是语言无关的,但是它所提供的编译器以及插件机制可以将我们编写的proto文件生成任意语言的代码,所以可以用来做IDL定义服务接口,可以很方便地让个类型的语言接入......
  • iOS UI 自动化测试原理以及在 Trip.com 的应用实践
    前言笔者入职​​Trip.com​​已满一年,回顾这一年的工作历程,约一半的时间都在做UI自动化测试相关内容。从而,笔者更深入地研究了iOS平台下的自动化测试技术,目前也在负......
  • DHorse日志收集原理
    实现原理基于k8s的日志收集主要有两种方案,一是使用daemoset,另一种是基于sidecar。两种方式各有优缺点,目前DHorse是基于daemoset实现的。如图1所示:图1在每个k8s集群中启......
  • 《3D计算机视觉:原理、算法及应用》一本全搞定
       1966年,人工智能学家Minsky在给学生布置的作业中,要求学生通过编写一个程序让计算机告诉我们它通过摄像头看到了什么,这也被认为是计算机视觉(ComputerVision,CV)最早的......
  • 能读懂硬件原理图,熟悉常见的硬件接口。
    能读懂硬件原理图,熟悉常见的硬件接口。能读懂硬件原理图,熟悉常见的硬件接口。能读懂硬件原理图,熟悉常见的硬件接口。能读懂硬件原理图,熟悉常见的硬件接口。能读懂硬件原......
  • 说说Nodejs高并发的原理
    导读ALLTHETIME,我们写的的大部分javascript代码都是在浏览器环境下编译运行的,因此可能我们对浏览器的事件循环机制了解比Node.JS的事件循环更深入一些,但是最近写开始深......
  • Vue响应式系统原理并实现一个双向绑定
    这一章就着重讲两个点:响应式系统如何收集依赖响应式系统如何更新视图我们知道通过Object.defineProperty做了数据劫持,当数据改变的时候,get方法收集依赖,进而set方法调用......
  • Vue响应式依赖收集原理分析-vue高级必备
    背景在Vue的初始化阶段,_init方法执行的时候,会执行initState(vm),它的定义在src/core/instance/state.js中。在初始化data和propsoption时我们注意initProps......
  • vue源码分析-diff算法核心原理
    这一节,依然是深入剖析Vue源码系列,上几节内容介绍了VirtualDOM是Vue在渲染机制上做的优化,而渲染的核心在于数据变化时,如何高效的更新节点,这就是diff算法。由于源码中关于d......
  • redux原理是什么
    前言相信很多人都在使用redux作为前端状态管理库进去项目开发,但仍然停留在“知道怎么用,但仍然不知道其核心原理”的阶段,接下来带大家分析一下redux和react-redux两个库的......