RDT 协议


可靠数据传输协议(RDT,Reliable Data Transfer Protocol)

RDT 是一种用于在不可靠的通信信道上实现可靠数据传输的协议。rdt 协议的主要目标是确保数据在传输过程中不会被丢失、重复、损坏或延迟,从而保证数据的完整性和可靠性。

不可靠的协议肯定叫 UDT 拉,Unreliable Data Transfer Protocol (≧︶≦))( ̄▽ ̄ )ゞ

RDT 1.0

FSM

有限状态机,Finite-State Machine

只是一种描述方式,不用过于在意。

箭头是变化方向,横向上是引起变化的原因,横线下是变化时的动作。

说人话就是:

  • 发送端:数据来了发出去

  • 接受端:收到数据了反馈

优点:

  1. 简单性:RDT 1.0 协议设计简单,易于理解和实现。

  2. 可靠性:通过使用确认应答和超时重传机制,RDT 1.0 可以在不可靠的通信信道上实现可靠的数据传输。

缺点:

  1. 无差错重传:RDT 1.0 缺乏差错检测和纠正机制,无法处理数据包的比特错误。如果数据包在传输过程中发生比特错误,接收方无法检测到并请求重传,导致数据的传输错误。

  2. 无乱序处理:RDT 1.0 不具备处理乱序数据包的能力。如果数据包在传输过程中出现乱序,接收方无法正确排序和组装数据包。

  3. 无流量控制:RDT 1.0 缺乏流量控制机制,发送方可能会连续发送大量的数据包,导致接收方无法及时处理和消化这些数据包,从而造成数据的丢失或溢出。

RDT 2

2.0

改进:
  1. 有限状态机:rdt2.0 使用有限状态机来描述发送方和接收方的行为。发送方有三个状态:等待 ACK0(等待确认0),等待 ACK1(等待确认1),发送。接收方有两个状态:等待0(等待序号为0的数据包),等待1(等待序号为1的数据包)。RDT2.0 确保了数据传输的顺序和正确性。

  2. 确认分组:rdt2.0 在确认消息中包含了一个确认序号,用于指示接收方期望接收的下一个数据包的序号。这样可以确保发送方按照正确的顺序发送数据包。

  3. 错误检测:rdt2.0 使用校验和来进行错误检测,发送方在每个数据包中附加一个校验和,接收方通过计算校验和来验证数据的完整性

关于校验和的使用请看 UDP 协议

FSM

说人话:

  • 发送端:

    1. 发送数据

    2. 等待答复(ACK or NAK)

      1. ACK 完成

      2. NAK 再次发送数据包,保持等待

> ACK,positive acknowledge 收到
> 
> NAK,negative acknowledge 请重复一遍
  • 接受端

    1. 收到数据校验失败

      1. 返回 NAK
    2. 收到数据校验成功

      1. 返回 ACK

      2. 向上层传递数据

缺点
  1. 慢启动问题:RDT 2.0在建立连接时使用慢启动机制,即开始时以较慢的速度发送数据,然后逐渐增加发送速度。这可能导致在连接建立初期传输速率较慢的问题。

  2. 信道利用率低:RDT 2.0中的流量控制机制采用停-等协议,即发送方发送一个数据包后必须等待确认才能发送下一个数据包。这种方式导致发送方在等待确认期间无法继续发送数据,降低了信道的利用率。(关于这点可以对比 3.0 与 2.0 的状态机。会发现 3.0 的状态机始终保持在可以被调用的状态,而 2.0 在等待 ACK 时不能被调用。)

  3. 高延迟:RDT 2.0的确认机制需要等待确认消息才能进行后续操作,这增加了传输的往返时间(Round Trip Time,RTT)。当出现丢包或延迟时,会导致传输延迟增加。

  4. 无拥塞控制:RDT 2.0没有拥塞控制机制,无法有效应对网络拥塞。当网络拥塞时,可能会导致数据包丢失或延迟增加,影响传输性能。

  5. 无差错恢复:虽然RDT 2.0具有确认机制,但它没有提供差错恢复机制。在传输过程中,如果数据包丢失或损坏,RDT 2.0无法自动进行重传或纠错,需要上层协议或应用程序处理这些问题。

  6. ACK 与 NAK 的受损:RDT2.0 没有考虑如果 ACK 与 NAK 受损了,那么基于这两者的操作自然也会发生相应错误。(毕竟你是在 UDT 上传输的)这点在 RDT2.1 上进行了改进。

2.1

改进:
  1. 序号和确认:rdt2.1引入了序号和确认的机制,发送方给每个数据包分配一个唯一的序号,并等待接收方发送确认消息来确认接收到的数据包。序号和确认机制可以帮助发送方检测丢失的数据包并进行重传。(解决了 ACK 与 NAK 的受损问题)

如图 udt_send 中多了序号0和1

FSM

发送方

接受方

说人话:

  • 发送端

    1. 上层调用

    2. 发送数据(在数据包中多了序号)

    3. 等到 ACK

      • NAK 或者 ACK 错误,则重发数据

      • 成功则进入下一个状态

    4. 重复 1-3,但是序号逐次递增

  • 接受端

    1. 接受数据

    2. 校验数据包、ACK 和序号校验

      • 数据包受损,则重发数据包

      • AKC 受损,则重发数据包

      • 序号是否符合

      • 均完好进入下一个状态

    3. 重复 1-2,但是序号逐次递增

2.2

改进

无 NAK ,在 RDT2.2 中通过发送同一分组的两个 ACK 来实现 NAK。(Replace NAK with duplicate ACK)。

FSM

发送方

接收方

RDT 3.0

改进

  1. 序列号和确认号:RDT 3.0 引入了序列号和确认号的概念,以支持对数据包顺序的控制和丢失的检测。序列号用于标识发送的数据包,而确认号用于指示期望接收的下一个数据包。

  2. 超时重传:RDT 3.0在发送方引入了超时重传机制。如果发送方在一定时间内未收到确认消息,它会重新发送当前的数据包,以确保数据的可靠传输。

  3. 错误检测:RDT 3.0使用校验和等机制对数据包进行错误检测,以确保数据的完整性和准确性。

FSM

发送方

改进:

  • 多了 timeout 的状态迁移

性能

限制因素:停等,RDT 2.0最大的限制就在于需要保持在等待 ACK 的状态,此时不能被上层调用。

信道利用率(utilization)

RTT 往返时间


如果本文帮助到了你,帮我点个广告可以咩(o′┏▽┓`o)


文章作者: Anubis
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Anubis !
评论
  目录