DJ3-5 传输层(第五节课)

目录

一、TCP 可靠数据传输机制

1. 发送方的事件

2. TCP 的重复确认

3. TCP 的重发场景

二、TCP 采用快速重传

三、产生 TCP ACK 的建议


一、TCP 可靠数据传输机制

  • TCP 在 IP 不可靠服务之上创建 rdt 服务
  • 流水线技术处理报文段
  • 累积确认
  • TCP 使用单个重发定时器
  • 触发重发:超时事件或 3 次重复确认

3 次重复确认是相对于 GBN 和 SR 新增的机制。

1. 发送方的事件

1)sender 从应用程序接收数据

① 用序号 NextSeqNum 创造一个新的报文段

② 如果没有启动定时器,则启动定时器

  • 定时器是最早没有被确认的报文发送时启动的
  • 设置超时间隔:TimeOutInterval

2)超时

  1. 重发导致超时的报文
  2. 重新启动定时器

3)收到确认

当 ACK>sendbase 时,

  1. 确认对应的报文段并滑动窗口
  2. 如果还有未确认的报文,则重新启动定时器

② 当 ACK=sendbase 时,

不做任何操作:“目前” 只有在超时时才会重传该报文段。

2. TCP 的重复确认

由上图可知,在上一次窗口移动时,发送方必定收到了来自接收方的 ack=1,即接收方确认收到了 1 号字节之前的所有字节,并且期望下一个收到的是 seq=1 的报文段。

假设 seq=1 丢失了,但 receiver 收到了 seq=2、seq=3、seq=4、seq=6 。

当 TCP 接收方收到一个具有这样序号的报文段时,即其序号大于下一个所期望的、按序的报文段,它检测到了数据流中的一个间隔,这就是说有报文段丢失。这个间隔可能是由于在网络中报文段丢失或重新排序造成的。

因为 TCP 不使用否定确认,所以接收方不能向发送方发回一个显式的否定确认。相反,它只是对已经接收到的最后一个按序字节数据进行重复确认(即产生一个冗余 ACK)即可。

由上图可知,即使接收方接收到了 seq=2、seq=3、seq=4、seq=6,它也不会移动窗口,因为它期待的是 seq=1 。此外,接收方还会在接收 seq=2、seq=3、seq=4、seq=6 的同时一直反馈 ack=1 。

当 seq=1 重传成功时,接收方将能移动窗口:

随后,当 seq=9 反馈的 ack=10 到达发送方时,发送方将能移动窗口:

小结:

  • ack=sendbase 时,往往是当前窗口中序号最大的报文段丢失了
  • ack>sendbase 时,往往是正常的确认信息,并且采用的是累积确认

3. TCP 的重发场景

1)丢失 ACK 的情况

sendbase!=92:由于在 seq=92 超时前主机 A 没有再发送任何报文段,因此 seq=92 应该是窗口中唯一未被发送的报文段。

2)过早的超时设置

seq=92 重传成功,反馈 ack=120,由于 ack 的值没有大于 sendbase 的值,因此 sendbase 的值保持不变。

3)累积 ACK 的情况

seq=100 接收成功,反馈 ack=120,表明 120 字节之前的字节全部被接收成功,因此 sendbase 放心地修改为 120 。

4)丢失报文段的情况

seq=100 接收成功,但反馈 ack=92,表明 seq=92 丢失了,主机 B 期待接收 seq=92 。seq=92 重传成功,反馈 ack=120。由于 TCP 采用累积确认,因此 sendbase 的值直接修改为 120 。

二、TCP 采用快速重传

超时触发重传存在问题:超时间隔往往太长。

  • 重传丢失报文段需要等待很长时间,从而增加了网络的时延。

解决方法:在超时之前,发送方可以通过重复的 ACK 来检测丢失的报文段。

  • 发送方常常一个接一个地发送很多报文段
  • 如果报文段丢失,则发送方将会接收到很多重复的 ACKs
  • 如果发送方收到 3 次重复确认,则发送方认为该报文段已经丢失

3 次重复确认 = 对同一报文段的 4 个确认信息

启动快速重传:在定时器超时之前重发丢失的报文段。

三、产生 TCP ACK 的建议

猜你喜欢

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