博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
可靠数据传输原理
阅读量:4229 次
发布时间:2019-05-26

本文共 2025 字,大约阅读时间需要 6 分钟。

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

转载地址:http://hmjqi.baihongyu.com/

你可能感兴趣的文章
机器学习、NLP和Python教程分享
查看>>
AWS Serverless培训分享
查看>>
python生成二维码
查看>>
在ubuntu上搭建文件服务器
查看>>
ServiceFabric: 在Windows上创建容器应用并部署到ServiceFabric中
查看>>
paramiko——一个专门为Linux设计的模块
查看>>
一个有趣的python项目---一个好玩的网站
查看>>
git常用命令总结
查看>>
Protobuf了解一下?
查看>>
超越Selenium的存在---Pyppeteer
查看>>
复仇者联盟4:终局之战剧透
查看>>
Msgpack有没有兴趣了解一下?
查看>>
探索一家神秘的公司
查看>>
PDF转Word完全免费?这么好的事情我怎么不知道????
查看>>
数据解读---B站火过蔡徐坤的“鬼畜“区巨头们
查看>>
Squid代理服务器搭建亿级爬虫IP代理池
查看>>
JupyterNotebook‘s Magic
查看>>
在Linux 上部署Jenkins和项目
查看>>
Python+requests+unittest+excel实现接口自动化测试框架
查看>>
那些年我们听过的互联网公司的套路?
查看>>