zoukankan      html  css  js  c++  java
  • 可靠数据传输基本原理(2)-解决数据丢失问题

    网络信道不可靠的点

    1. 数据在传输的过程中有可能会受损(上一篇文章说明了如何解决这个问题)

    2. 数据在传输的过程中有可能会丢失(本文说明如何解决这个问题)

    传输层的可靠性协议就是解决上面两个问题的。

    消除NAK,用ACK代替NAK

    在上一篇文章中如果接收方检测数据有失真,直接回复一个NAK给发送方,当发送方收到NAK之后对数据进行重新传递,从而实现可靠性传输,如下图所示。

    在上一篇文章的最后对每一次发送的数据引入了序列号,在序列号的基础上可以用ACK来代替NAK,彻底在数据传输过程中移除NAK。

    • 如果接收方检查数据没有损失,则直接ack当前数据的序列号
    • 如果接收方检查数据有损失,则直接ack上次成功接受的数据的序列号。
      •   发送方如果收到的ack序列号和期望的不一致,则说明数据有损,直接重传

    具体如下图所示。

    数据在传输过程中丢失怎么处理

    信道不稳定,或者路由器的缓存满了等都有可能导致传输的数据丢失。、

    具体到可靠性传输有两种类型的数据丢失:

    1. 数据本身丢失
    2. ACK丢失

    这两种丢失都可以交给发送方进行处理:重传。

    具体实现是在发送方设置一个定时器,当数据发送出去后,开启定时器,在给定的实际内(比如一个RTT)如果没有收到ACK,则认为超时,这个时候发送方启动重传。

    数据本身丢失

    数据再传输过程中丢失了,超时没有收到ack后发送方进行重新传递。

    ACK丢失

    ack丢失对于发送方来说和数据本身丢失是一样的,都是重新传送。

    但是对于接收方来说,因为已经收到了数据,需要做冗余检测,只需要简单返回ack即可。

    提前超时

    提前超时,对于接收方来说,需要做冗余检测 ,只需返回ack。对发送方,也会收到一个冗余的ack,直接忽略。

    作者:iBrake
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    CodingSouls团队项目冲刺(4)-个人概况
    第八周周总结
    CodingSouls团队项目冲刺(3)-个人概况
    CodingSouls团队项目冲刺(2)-个人概况
    线程中的join使用
    向线程传递数据的三种方法
    Java collections使用介绍
    Guava Collections使用介绍[超级强大]
    重构改善既有代码的设计--重新组织数据
    重构改善既有代码的设计--在对象之间搬移特性
  • 原文地址:https://www.cnblogs.com/Brake/p/13849806.html
Copyright © 2011-2022 走看看