Java 面试题:TCP重传机制与拥塞控制 --xunznux

文章目录

  • TCP重传机制
    • [1. 超时重传(Timeout Retransmission)](#1. 超时重传(Timeout Retransmission))
    • [2. 快速重传(Fast Retransmission)](#2. 快速重传(Fast Retransmission))
    • [3. 选择性确认(Selective Acknowledgment, SACK)](#3. 选择性确认(Selective Acknowledgment, SACK))
    • [4. D-SACK(Duplicate sAcK)](#4. D-SACK(Duplicate sAcK))
    • [5. 总结](#5. 总结)
  • TCP的拥塞控制机制
      • [1. **慢启动(Slow Start)**](#1. 慢启动(Slow Start))
      • [2. **拥塞避免(Congestion Avoidance)**](#2. 拥塞避免(Congestion Avoidance))
      • 拥塞发生
        • 超时重传:
        • [**快速重传(Fast Retransmit)**](#快速重传(Fast Retransmit))
      • [4. **快速恢复(Fast Recovery)**](#4. 快速恢复(Fast Recovery))
      • [5. **Tahoe 和 Reno 算法**](#5. Tahoe 和 Reno 算法)
      • [6. **NewReno 算法**](#6. NewReno 算法)
      • [7. **拥塞窗口回退**](#7. 拥塞窗口回退)
      • [8. **BBR (Bottleneck Bandwidth and RTT)**](#8. BBR (Bottleneck Bandwidth and RTT))
      • 总结

TCP重传机制

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的协议,它通过一系列机制来保证数据的可靠传输,其中之一就是重传机制。TCP 的重传机制能够确保在网络传输过程中,丢失的或损坏的数据包能够被重新发送,从而保证数据的完整性和可靠性。

TCP 实现可靠传输的方式之一,是通过序列号与确认应答。在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息但是如果传输的过程中,数据包丢失了,就会使用重传机制来解决。

TCP 重传机制主要包括以下几部分:

1. 超时重传(Timeout Retransmission)

  • 基本原理:每当 TCP 发送一个数据包时,都会启动一个定时器,如果在指定的时间内没有收到对应的 ACK(确认报文),则认为该数据包在传输过程中丢失,TCP 会重新发送该数据包。这种机制称为超时重传。
  • 超时重传的两种情况:发送方的数据包丢失;接收方的确认应答丢失。
  • 重传时间间隔(RTO, Retransmission Timeout):
    • 重传时间间隔(RTO)是根据往返时间(RTT, Round Trip Time)动态计算的,RTT 是指数据包从发送到接收到 ACK 的时间。TCP 使用一个名为 加权移动平均算法(EWMA, Exponential Weighted Moving Average)来计算 RTT,并以此来确定 RTO。
    • TCP 会根据网络状况调整 RTO 的值。如果 ACK 在预期的时间内没有收到,RTO 会呈指数级增长(指数退避算法),这样可以避免在网络拥塞时频繁重传导致的恶性循环。
    • RTO较长的影响:网络的空隙时间增大,降低了网络传输效率。
    • RTO较短的影响:发送方还未等到确认应答就进行了不必要的重传,导致网络负荷增大。
  • 重传次数限制:TCP 并不会无限次地重传数据包,而是会有一个最大重传次数的限制。如果超过这个次数,TCP 会放弃连接并通知应用程序发生了严重的网络错误。
  • 如果超时重发的数据,再次超时又要重传的时候,TCP的策略是将超时间隔加倍,也就是每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。避免由于网络拥塞造成的重传导致进一步加剧了拥塞情况。(拥塞控制)

2. 快速重传(Fast Retransmission)

  • 基本原理:当 TCP 接收方接收到一个失序的数据包(即后续的数据包),但未接收到预期的数据包时,它会立即发送一个重复的 ACK 报文来通知发送方已经接收到的数据包编号,并提示发送方丢失了某个特定的数据包。
  • 三次重复 ACK:当发送方连续收到三个相同的 ACK(称为 Triple Duplicate ACK),意味着很可能一个数据包丢失了。此时,发送方会立即重传这个丢失的数据包,而不必等待 RTO 超时。这种机制称为快速重传。
  • 优点:快速重传机制大大减少了数据包丢失后的等待时间,提高了网络的传输效率。快速重传解决了超时时间的问题,但还面临另外一个问题:重传的时候,是重传之前的一个,还是重传所有的问题。

3. 选择性确认(Selective Acknowledgment, SACK)

  • 基本原理:SACK 是 TCP 的一种扩展选项,用于提高重传效率。常规的 ACK 只能确认已经接收到的连续数据块,但如果某个数据块丢失,而后续的数据块已经接收到了,接收方无法通过常规的 ACK 来通知发送方哪些具体数据块需要重传。

  • SACK 机制:

    • SACK 选项允许接收方通知发送方,除了一部分丢失的数据包,其他的哪些数据包已经接收到了。这就使得发送方只需重传那些丢失的数据包,而无需重传已经成功接收的部分。
    • SACK 选项有效地减少了重传的数量,特别是在高丢包率的网络中,可以显著提高传输效率。
  • SACK 的作用:在没有 SACK 的情况下,TCP 可能不得不重传已经成功接收的数据包,这种不必要的重传会导致带宽的浪费和传输延迟。SACK 通过允许接收方精确指示丢失的字节范围,避免了不必要的重传。

4. D-SACK(Duplicate sAcK)

主要使用了SACK来告诉【发送方】有哪些数据被重复接收了。下面举例来说明D-SAcK 的作用:

使用D-SACK的好处:

(1) 可以让【发送方】知道,是发出去的包丢了,还是接收方回应的ACK包丢了;

(2) 可以知道是不是【发送方】的数据包被网络延时了;

(3) 可以知道网络中是不是把【发送方】的数据包给复制了。

发送方: 复制代码
接收方:  <---- ACK A  <---- ACK B  <---- ACK C
发送方:  (因误判重传) B ----> C
接收方:  <---- D-SACK: B (重复的B)  <---- D-SACK: C (重复的C)

D-SACK 与 SACK 的区别

  • SACK:SACK 主要用于通知发送方哪些字节范围的数据包已经成功接收,允许发送方仅重传丢失的部分数据,避免不必要的重传。
  • D-SACK:D-SACK 是 SACK 的一种扩展,它不仅通知发送方成功接收到的数据,还通知发送方重复接收到的数据,从而帮助发送方检测和优化重传机制。

5. 总结

TCP 重传机制是保证数据传输可靠性的核心。通过超时重传、快速重传、快速恢复以及 SACK 机制,TCP 能够有效地处理网络中的数据包丢失、乱序等问题。不同的 TCP 实现和版本可能会在这些基础机制上进行优化,以适应不同的网络条件和应用场景。在现代网络环境中,这些重传机制共同作用,确保了 TCP 的可靠性和高效性。

TCP的拥塞控制机制

TCP 的拥塞控制机制是为了防止网络过载而设计的一组算法,旨在确保网络稳定性和高效性。TCP 通过动态调整发送速率,确保网络资源合理分配,避免拥塞引发的丢包和延迟问题。TCP 拥塞控制主要由以下几个阶段和算法组成:

1. 慢启动(Slow Start)

  • 概述:慢启动是 TCP 连接建立后的初始阶段,目的是逐渐探测网络的可用带宽,防止突然增加的数据量造成网络拥塞。

  • 工作原理

    • TCP 连接建立后,拥塞窗口(Congestion Window, CWND)被初始化为一个较小的值(通常为1个MSS,最大报文段大小)。Maximum Segment Size 最大报文段长度 1500-20-20=1460字节。
    • 每次收到对方的确认 ACK 报文后,CWND 的大小会指数级增长,即每经过一个 RTT(Round-Trip Time),CWND 会翻倍,直到达到一个预设的阈值(Slow Start Threshold, SSTHRESH)或发生丢包。⼀般来说 ssthresh 的大小是65535字节。
  • 优点:能够在连接建立初期快速增加数据传输速率,迅速利用可用的网络带宽。

  • 缺点:如果网络带宽有限,指数增长的 CWND 可能会迅速引发拥塞。

2. 拥塞避免(Congestion Avoidance)

  • 概述 :当 CWND 达到慢启动阈值 SSTHRESH 时,TCP 进入拥塞避免阶段,逐步提高传输速率,避免网络过载。也就是说,将ssthresh换算为MSS单位,在慢启动阶段,每次全部收到cwnd的ACK后,cwnd值就翻倍了。而在拥塞避免阶段,是线性增加,每次收到一轮的ACK,也就是上一次cwnd发出的全部包的ACK后,cwnd才增加1个MSS。

  • 工作原理

    • 在拥塞避免阶段,CWND 以线性增长的方式缓慢增加。每经过一个 RTT,CWND 增加一个 MSS 的大小,而不是像慢启动阶段那样翻倍增长。
    • 这种方式使得网络能够逐渐适应流量的增加,避免因流量增长过快而引发拥塞。
  • 优点:通过线性增长 CWND,平衡了网络负载,减少了拥塞发生的可能性。

  • 缺点:当网络带宽充足时,线性增长的 CWND 增加较慢,可能无法充分利用网络资源。

那么,当进入拥塞避免,每次+1时,什么时候才会不再继续加?

随着每次发送的数量越发越多, 最终会超出带宽限制,于是就会有某条报文发生超时。有可能是发的中途丢了, 亦或者是返回的数据全阻塞住了,一条都回不来。这时就发生了超时重传。进入拥塞发生

阶段。

拥塞发生

超时重传:

这个时候,ssthresh 和 cwnd 的值会发生变化:

  • ssthresh 设为 cwnd/2
  • cwnd 重置为 1
    接着,就重新开始慢启动,慢启动是会突然减少数据流的。这真是一旦「超时重传」,马上回到解放前。但是这种方式太激进了,反应也很强烈,会造成网络卡顿。
快速重传(Fast Retransmit)
  • 概述:快速重传是指在收到三个重复的 ACK 报文后,TCP 立即重传被认为丢失的报文段,而不必等待超时。

  • 工作原理

    • 当发送方连续收到三个相同的 ACK 报文时,认为接收方可能丢失了下一个报文段,因此立即重传该报文段,而不是等待超时后再重传。

TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 cwnd 变化如下:

  1. cwnd=cwnd/2,也就是设置为原来的一半
  2. ssthresh=cwnd
  3. 进入快速恢复算法
  • 优点:快速重传缩短了丢包后的恢复时间,减少了网络延迟。

  • 缺点:快速重传机制依赖于重复 ACK 的数量,在高丢包率的网络环境下,可能误判或无法有效工作。

4. 快速恢复(Fast Recovery)

  • 概述:快速恢复是在快速重传后,避免进入慢启动阶段,通过调整 CWND 恢复数据传输速率。

  • 工作原理

    • 快速重传后,TCP 将 SSTHRESH 设置为当前 CWND 的一半,并将 CWND 设置为 SSTHRESH 的值。然后通过线性增长的方式恢复传输速率,避免重新进入慢启动阶段。
  • 优点:快速恢复能够在发生丢包后迅速恢复传输速度,提高网络利用率。

  • 缺点:在严重拥塞情况下,快速恢复可能无法有效工作,需要结合其他机制来调整。

5. Tahoe 和 Reno 算法

  • Tahoe:是早期的 TCP 拥塞控制算法,采用了慢启动、拥塞避免和超时重传的机制。每次发生丢包时,CWND 被重置为 1,进入慢启动阶段。

  • Reno:在 Tahoe 的基础上,Reno 增加了快速重传和快速恢复机制,提高了在轻微拥塞情况下的恢复能力。

6. NewReno 算法

  • 概述:NewReno 是 Reno 的改进版本,优化了部分丢包时的恢复过程。

  • 工作原理

    • 在快速重传阶段,如果有多个报文段丢失,NewReno 不会立即进入恢复阶段,而是保持在快速重传阶段,直到所有丢失的报文段都被重传完毕。这样可以避免多次进入恢复阶段,提高了传输效率。

7. 拥塞窗口回退

  • 概述:当网络出现拥塞(如丢包或延迟增大),TCP 会回退 CWND 的值,从而减少传输速率。

  • 工作原理

    • 当检测到丢包后,TCP 会将 CWND 降低到 SSTHRESH 的值,然后重新进入拥塞避免阶段,逐步提高传输速率。
  • 优点:通过降低传输速率,缓解了网络拥塞,减少了丢包率。

8. BBR (Bottleneck Bandwidth and RTT)

  • 概述:BBR 是一种新的拥塞控制算法,不依赖于丢包率,而是基于带宽和 RTT 的估算来确定最优的发送速率。

  • 工作原理

    • BBR 通过测量网络的瓶颈带宽和最小 RTT 来动态调整发送速率,确保数据流量不会超过网络的承载能力,从而减少拥塞。
  • 优点:BBR 在高带宽、低延迟网络中表现出色,能够更有效地利用可用带宽。

总结

TCP 的拥塞控制机制通过多种算法的结合,确保在不同网络条件下都能有效地调节传输速率,减少拥塞发生的概率,保障数据传输的可靠性和效率。各个阶段和算法相互配合,使得 TCP 能够在拥塞情况下迅速恢复并高效利用网络资源。

相关推荐
一只叫煤球的猫33 分钟前
写代码很6,面试秒变菜鸟?不卖课,面试官视角走心探讨
前端·后端·面试
bobz9651 小时前
tcp/ip 中的多路复用
后端
bobz9651 小时前
tls ingress 简单记录
后端
皮皮林5512 小时前
IDEA 源码阅读利器,你居然还不会?
java·intellij idea
你的人类朋友2 小时前
什么是OpenSSL
后端·安全·程序员
bobz9653 小时前
mcp 直接操作浏览器
后端
前端小张同学5 小时前
服务器部署 gitlab 占用空间太大怎么办,优化思路。
后端
databook5 小时前
Manim实现闪光轨迹特效
后端·python·动效
武子康6 小时前
大数据-98 Spark 从 DStream 到 Structured Streaming:Spark 实时计算的演进
大数据·后端·spark
该用户已不存在6 小时前
6个值得收藏的.NET ORM 框架
前端·后端·.net