计算机网络:运输层 —— TCP 的超时重传机制

时间:2024-11-24 06:58:01

文章目录

    • TCP 的超时重传
      • 超时重传时间的选择
      • 重传策略
      • 与拥塞控制的关联

TCP 的超时重传

TCP 的超时重传是保证数据可靠传输的重要机制之一

  • 保证数据可靠性:通过超时重传机制,即使在网络状况不佳,出现数据包丢失等情况时,也能够确保数据最终能够完整、准确地被接收方接收,从而保证了数据传输的可靠性。

  • 自适应网络变化:能够根据网络的实时状况动态调整超时时间和重传策略,较好地适应不同网络环境下的传输需求,提高网络资源的利用率和数据传输效率。

超时重传时间的选择

发送方在发送数据后会启动一个定时器,若在规定时间内未收到接收方的确认报文(ACK),则认为该数据丢失,进而触发重传机制,重新发送该数据,直至发送成功。

TCP 超时重传时间 RTO的选择是TCP最复杂的问题之一,超时重传时间RTO应略大于往返时间RTT

TCP下层是复杂的因特网环境:主机 A 所发送的报文段可能只经过一个高速率的局域网,也可能经过多个低速率的网络,并且每个IP数据报的转发路由还可能不同。

不能直接使用略大于某次测量得到的往返时间 RTT 样本的值作为超时重传时间 RTO。但是,可以利用每次测量得到的 RTT 样本,计算加权平均往返时间 R T T S RTT_S RTTS,这样可以得到比较平滑的往返时间。

在这里插入图片描述

超时重传时间RTO的值应略大于加权平均往返时间 R T T S RTT_S RTTS 的值(而不是某个 RTT 样本的值)

[RFC 6298] 建议使用下式来计算超时重传时间 RTO

在这里插入图片描述

在 TCP 连接建立初期,超时重传时间(RTO)会被赋予一个初始值。例如,根据最初的简单公式,初始值可能为 1 秒;而依据修正公式,初始 RTO 应为 a + 4 d a+4d a+4d,其中 a 、 d a、d ad 为相关参数,如初始化 a a a 为 0,初始化 d d d 为 3 秒

如果所测量到的 RTT 样本不正确,那么所计算出的 R T T S RTT_S RTTSRTT,自然就不正确,进而所计算出的 RTO 也就不正确。然而,RTT 的测量确实是比较复杂的。

在这里插入图片描述

通过上述两个例子可以看出:当发送方出现超时重传后,收到确认报文段时,是无法判断出该确认到底是对原数据报文段的确认还是对重传数据报文段的确认,也就是无法准确测量出RTT,进而无法正确计算RTO。

基于以上问题,Karn 提出了一种算法,但该算法又引出了新问题,因此要对 Karn算法 进行修正:

在这里插入图片描述
也就是说:报文段每重传一次,就把 RTO 增大一些。典型的做法是将新 RTO 的值取为I日 RTO2 倍

在数据正常传输过程中,发送方会根据往返时间(RTT)不断更新 RTO 的值。RTT 是指数据包从发送方发送出去到接收方返回确认报文所需的时间 。发送方通常使用特定的公式来综合旧的 RTT 值和新测量到的 RTT 值,以更准确地估计当前网络状况下合适的 RTO

但在重传情况下,RTO 不使用上述正常传输时的公式计算,而是采用指数退避的方式。比如,当 RTO 为 1 秒时发生数据重传,下一次重传的 RTO 会变为 2 秒,再下次变为 4 秒,以此类推,直至达到 64 秒。

重传策略

  • 普通超时重传:发送方等待 ACK 的定时器超时后,会重传未被确认的数据报文段。并且,每次重传后会重新启动定时器,等待接收方的确认。

  • 快速重传:当接收方收到失序的报文段时,会立即发送一个重复的 ACK。如果发送方连续收到三个重复的 ACK,就可推断有一个报文段丢失,此时发送方不必等待定时器超时,会立即重传丢失的报文段,这就是快速重传机制。快速重传能够有效减少因等待超时带来的延迟,更快地恢复数据传输。

  • 选择性确认重传:这是一种 TCP 扩展机制,接收方可以通过选择性确认SACK)告知发送方哪些数据包已成功接收,哪些需要重传。发送方根据这些信息,仅重传丢失的数据包,避免了不必要的全量重传,提高了传输效率.

与拥塞控制的关联

相关阅读计算机网络:运输层 —— TCP 的拥塞控制

  • 慢启动阶段:当发生超时重传时,通常意味着网络可能出现了拥塞或其他问题。此时,会将慢启动门限(ssthresh)设置为当前拥塞窗口(cwnd)的一半,同时将 cwnd 重新设置为 1 个报文段大小,重新进入慢启动阶段,以较慢的速度重新探测网络的承载能力,避免再次造成网络拥塞

  • 快速恢复阶段:在快速重传之后,发送方进入快速恢复阶段。此时,ssthresh 同样被设置为当前 cwnd 的一半,而 cwnd 则被设置为 ssthresh 加上 3 倍的报文段大小。之后,发送方每收到一个新的 ACK,就将 cwnd 增加 1 个报文段大小并发送 1 个分组,直到再次检测到拥塞。