可靠数据传输原理

Reliable Data Transmission

Posted by Chase Gu on November 6, 2019

3.4 可靠数据传输原理

目录:计算机网络-课程笔记目录

前言

  • 什么是可靠

    • 不错、不丢、不乱
  • 可靠数据传输协议

    • 网络Top-10问题
    • 信道的不可靠特性决定了可靠数据协议(rdt)的复杂性
  • PS:

    • 物理层:比特率

    • 数据链路层:帧(frame)

    • 网络层:包(package)

    • 传输层:数据报(datagram)

      再上面称之为段(Segment)

  • 可靠数据传输1

    • rdt_send() 和 deliver_data() 都是单向的
    • udt_send() 和 rdt_rcv() 都是双向的
  • 接下来只考虑单向数据流动

    • 但是控制信息是双向流动的:如 udt_send() 和 rdt_rcv()

rdt 1.0:可靠信道上的可靠数据传输

  • 底层信道完全可靠
    • 不会发生错误(bit error)
    • 不会丢弃分组
  • 发送方和接收方的FSM(有限状态机)独立
    • 都是只有一个状态:等待调用

rdt 2.0:产生位错误的信道

  • 缺陷
    • NAK、ACK发生错误
  • 分组不会丢失,按顺序到达
  • 底层信道可能翻转分组中的位(bit)
    • 利用校验和检测位错误(难度高)
  • 从错误中恢复
    • 确认机制(Acknowledgements, ACK):接收方显式地告知发送方分组已正确接收
    • NAK机制:接收方显式地告知发送方分组有错误
    • 重传机制:发送方收到NAK后,重传分组
  • 基于这种重传机制的rdt协议称为ARQ(Automatic Repeat Request)协议
  • rdt 2.0中引入的新机制
    • 差错检测
    • 接收方反馈控制信息:ACK、NAK
    • 重传
  • 停 - 等协议(考点)
    • 发送方
      • 状态一:等待上层调用
      • 状态二:等待ACK或NAK
      • 一 -> 二:加入校验和,发送
      • 二 -> 一:重发
      • 二 -> 二:收到ACK
    • 接收方
      • 状态一:等待下层调用
      • 有错误:反馈NAK
      • 没错误:提取数据,向上传递,反馈ACK

rdt 2.1:应对ACK/NAK破坏和重传重复

  • 解决重复分组的问题:发生错误不能简单重传,会产生重复分组

    • 产生重复分组的情况:正确接收,ACK坏了,发送方再次发送,接收方又正确接收

    • 序列号(Sequence number):发送方给每个分组增加序列号
    • 接收方丢弃重复分组
  • 状态数量翻倍:需要记住当前分组的序列号

  • 有限状态机

    • 发送方

    rdt2.1发送方有限状态机

    • 接收方:应对ACK/NAK破坏

    rdt2.1接收方有限状态机

    • 分组坏掉了:NAK

    • 序列号出错:发送ACK,不是NAK也不可以置之不理(Why?)

rdt 2.2:无NAK消息协议

  • 与2.1功能相同,但是只是用ACK
  • 实现
    • 接收方通过ACK告知最后一个被正确接收的分组
    • 在ACK消息中显式地加入被确认分组的序列号
  • 发送方收到重复的ACK之后,采取与接收到NAK相同的动作
    • 重传当前分组

rdt 3.0:丢失分组

  • 如果信道既可能发生错误也可能丢失分组
    • “校验和+序列号+ACK+重传”够用吗?
    • 没有分组到达,死锁
  • 方法:发送方等待“合理”时间
    • 如果没有接收到ACK,重传
    • 如果分组或ACK只是延迟而不是丢失
      • 重传会产生重复,序列号机制能够处理
      • 接收方需在ACK中显示告知所确认的分组
    • 需要定时器
  • 发送时启动计时器,随后进入等待ACK,超时重发,启动计时器
  • 正确接收,定时器重置
  • 发现重复:接收方丢弃,发送ACK,序列号为最后一个接收的序列号

性能分析

  • Edt 3.0能够工作但是性能很差

  • 1Gbps链路、15ms端到端传播延迟、1KB分组

    • b = bit,B = byte(kamo)

    • T transmit = L / R = 8kb / 10^9 = 8 microsec(微秒)

    • 发送方利用率:发送方发送时间百分比

      U sender = (L/R) / (RTT + L/R) = 0.008 / 30.008 = 0.00027