当前位置: 首页 > article >正文

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 变化如下:

  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 能够在拥塞情况下迅速恢复并高效利用网络资源。


http://www.kler.cn/a/291185.html

相关文章:

  • oracle linux8.10+ oracle 23ai安装
  • 【论文阅读笔记】Scalable, Detailed and Mask-Free Universal Photometric Stereo
  • 004-spring-注解aop的使用
  • 大模型-使用Ollama+Dify在本地搭建一个专属于自己的聊天助手与知识库
  • 基于earthSDK三维地图组件开发
  • 《计算机网络(第7版)-谢希仁》期末考试复习题和答案(总结整理)
  • 在VitePress中进行页面链接:最佳实践与实例
  • 90分钟实现一门编程语言——极简解释器教程
  • 巧用 HTML 列表:<ul>、<ol>、<dl>的实用指南
  • 美团转正成功,实习经验大分享!
  • 若依系统的学习
  • 我与Linux的爱恋:Linux的基本指令
  • C++11新增特性:列表初始化(std::initializer_list) decltype、auto、nullptr、范围for
  • RISC-V最先进CPU微架构分析
  • Flutter修改Android包名
  • 3.js - modelPosition.z = sin((modelPosition.x+uTime)*10.0)*0.05;
  • # Windows下配置Redis以服务方式启动
  • 创新大赛国赛路演:如何准备一份打动人心的路演稿
  • 数学建模笔记
  • 8月29日wpf
  • vue原理分析(四)Vue实例挂载到app上面
  • C++系列-STL容器的应用举例
  • AI自动生成PPT哪个软件好?如何自动生成专业级PPT?
  • 浙大数据结构:01-复杂度1 最大子列和问题
  • 解决el-table中使用el-input无法聚焦问题
  • OpenAI transcription API bad request