DJ3-3 传输层(第三节课)

目录

一、流水线技术

1. 流水线技术简介

2. 流水线技术的两种通用形式

3. 流水线技术提高利用率

二、回退 N 步法(GBN)

0. GBN 中的发送方和接收方

1. 一次性发送窗口内的 N 个报文

2. 报文得到确认时

3. 报文丢失时

4. 确认信息超时时

5. 确认信息丢失时

6. 举例说明

三、选择性重传法(SR)

1. SR 中的发送方和接收方

2. 举例说明

3. 选择重传的窗口大小选择


一、流水线技术

1. 流水线技术简介

流水线:允许发送方允许发送多个 “在路上的” 且还没有被确认的报文。

  • 必须扩大序号的覆盖范围
  • 必须在发送方/接收方处设置缓冲区

2. 流水线技术的两种通用形式

  • 回退 N 步法(Go-Back-N,GBN)
  • 选择重传法(Selective Repeat,SR)

3. 流水线技术提高利用率

U 代表利用率,在这里是指发送方忙于发送的时间的占比。

U_{sender}=\frac{L/R}{RTT+L/R}

采用流水线技术,如下图所示。

首个分组的 RTT 以接收到 ACK 的第一个 bit 为止。

此时发送者的利用率为:

U_{sender}=\frac{3L/R}{RTT+L/R}

可见,在这里流水线技术将发送者的利用率提高了 3 倍。

二、回退 N 步法(GBN)

0. GBN 中的发送方和接收方

1)发送方需要做的:

  • 在分组头中规定一个 k 位的序号,则序号范围为 [0,2^k-1]
  • 设置窗口:允许连续发送 N 个未被确认的报文
  • 设置一个定时器:记录最早的未被确认的报文的发送时间

发送方窗口里报文的状态:

  • 已发送但未确认
  • 未发送

2)接收方需要做的:

  • 设置窗口:每次只接收 1 个期待接收的报文
  • 只需要记住被期待接收的序号 ExpectedSeqNum
  • 总是为正确接收的最高序号的分组发送 ACK
  • 可能生成重复的 ACKs

若接收到失序分组:

  1. 丢弃该分组,并不会缓冲,因为没有接收缓冲区!
  2. 重发最高序号的分组的 ACK

1. 一次性发送窗口内的 N 个报文

发完这 N 个报文,就停止发送。

2. 报文得到确认时

receiver 确认收到 1 号报文,sender 得到确认,窗口右移一格,sender 发送此前未发送的 5 号报文。

3. 报文丢失时

假设 2 号报文在传输过程中丢失了,那么即使 3 号报文到达了 receiver,receiver 也会拒绝接收它,更不用说反馈确认信息了。对于 4 号报文和 5 号报文也不例外。

在拒绝接收 3 号报文的同时,接收方还会反馈 ack1,以告诉 sender 2 号报文丢失。对于 4 号报文和 5 号报文也不例外。

4. 确认信息超时时

由于 receiver 是一个很专一的人,它拒绝除 2 号报文以外的所有报文,然而 2 号报文又丢失了,因此 receiver 无法反馈确认信息,从而导致 sender 长时间无法收到确认信息。

幸好有一个定时器在记录 2 号报文的确认时间,该 计时器 用于记录最早的未被确认报文的发送时间。它告诉 sender 超时了,于是 sender 重发窗口里的所有报文。

5. 确认信息丢失时

假设 receiver 接收了 2 号报文和 3 号报文,但是相应的确认信息在传输过程中丢失了。而之后 receiver 又接收了 4 号报文,并且其确认信息顺利传输给了 sender 。

sender 认为像 receiver 这样专一又负责的人,一定是已经接收到了 4 号报文之前的所有报文才会反馈 4 号报文的确认信息。因此 sender 放心的右移三次窗口,并且发送在窗口里出现的新报文。

  • 暗示当前分组之前的所有分组都被正确接收了
  • 窗口可以一次性右移多个位置

6. 举例说明

三、选择性重传法(SR)

1. SR 中的发送方和接收方

1)发送方需要做的:

  • 在分组头中规定一个 k 位的序号,则序号范围为 [0,2^k-1]
  • 设置窗口:允许连续发送 N 个未被确认的报文
  • 设置多个定时器:必须为每个已发送未确认的报文设置一个定时器

发送方窗口里报文的状态:

  • 未发送
  • 已发送但未确认
  • 已发送且已确认

2)接收方需要做的:

  • 设置窗口:接收所需的所有分组,包括失序分组和有序分组
  • 总是为正确接收的分组发送 ACK,无论是失序分组还是有序分组

接收方窗口里报文的状态:

  • 期待接收
  • 已接收但未确认
  • 已接收且已确认

当接收到分组时,若序号在窗口范围之中:

[rcvbase, rcvbase + N -1]
  1. 对于失序分组,缓冲但并不交付上层
  2. 对于有序分组,交付上层,右移窗口(可能不止一格)

 个人感觉,有序分组就是序号等于接收窗口基序号的分组。

当接收到分组时,若序号在窗口范围之前:

[rcvbase - N, rcvbase -1]

说明:接收方正确接收了该分组,但是该分组的确认信息丢失了,因此在超时时发送方重发了该分组。解决方法为:接收方重发该分组的确认信息 ACK 。至于范围为什么是这个,是因为发送方只有接收到了接收方的确认信息才能右移窗口。由于发送窗口长度为 N,因此至多可能比接收方少移 N 格。

2. 举例说明

1)接收方总是发送分组自己的 ACK

即使是分组 2 丢失了,接收方反馈的分组 3 确认信息仍为 ack3,而不像 GBN 那样返回 ack1(因为重复的 ack = nak)。

2)接收方接收到缝隙分组将会一起交付

3)发送方在分组超时时自动重发分组

4)发送方接收到失序确认信息将不会右移窗口

3. 选择重传的窗口大小选择

由于在 SR 中,发送方窗口和接收方窗口的滑动是异步的,因此可能出现如下问题。

注意:分组是不同的分组,只不过序号可能相同罢了。

sender 发了 0、1、2 三个分组,receiver 正确接收了并右移窗口三格,但由于 receiver 反馈的 ack0、ack1、ack2 全部丢失了,因此 sender 的窗口无法移动。一段时间后,pkt0 超时,sender 重发 pkt0 。此时接收窗口中的是下一轮的 pkt0,但它会误以为 sender 重发的 pkt0 是这一轮的pkt0,从而导致数据错误。

发生问题的原因是:sender 和 receiver 不知道互相窗口的移动情况。

它们之间有一层厚障壁!

解决方法:使序号范围覆盖两个窗口,即序号范围 ≥ 发送窗口长度 + 接收窗口长度。

从而使序号能够在两窗口间保证唯一性。

猜你喜欢

转载自blog.csdn.net/m0_64140451/article/details/129993550