Java 面试题:TCP重传机制与拥塞控制 --xunznux
文章目录
- TCP重传机制
- 1. 超时重传(Timeout Retransmission)
- 2. 快速重传(Fast Retransmission)
- 3. 选择性确认(Selective Acknowledgment, SACK)
- 4. D-SACK(Duplicate sAcK)
- 5. 总结
- TCP的拥塞控制机制
- 1. **慢启动(Slow Start)**
- 2. **拥塞避免(Congestion Avoidance)**
- 拥塞发生
- 超时重传:
- **快速重传(Fast Retransmit)**
- 4. **快速恢复(Fast Recovery)**
- 5. **Tahoe 和 Reno 算法**
- 6. **NewReno 算法**
- 7. **拥塞窗口回退**
- 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 变化如下:
- cwnd=cwnd/2,也就是设置为原来的一半
- ssthresh=cwnd
- 进入快速恢复算法
-
优点:快速重传缩短了丢包后的恢复时间,减少了网络延迟。
-
缺点:快速重传机制依赖于重复 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 能够在拥塞情况下迅速恢复并高效利用网络资源。