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
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    git 比较两个分支日志和文件的差异
    Interspeech 2020调研:文本前端
    centOS 7 修改分辨率、图形与命令行界面切换
    pdf表格提取camelot安装教程
    CFS任务的负载均衡——2
    CFS任务的负载均衡(框架篇)——(1)
    ftrace笔记一
    红黑树rbtree学习笔记
    一. scheduler相关结构体简介
    cpu_capacity、task_util、cpu_util计算方法
  • 原文地址:https://www.cnblogs.com/Brake/p/13849806.html
Copyright © 2011-2022 走看看