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

TCP拥塞控制

文章目录

    • 概述
    • 拥塞控制的主要算法
      • 慢启动(Slow - Start)
      • 拥塞避免(Congestion - Avoidance)
      • 快重传(Fast Retransmit)
      • 快恢复(Fast Recovery)
      • 拥塞控制的重要性

概述

TCP 拥塞控制是一种用于防止网络拥塞的机制。当网络中的数据流量过大,超过了网络的承载能力时,就会出现拥塞现象,如数据包丢失、延迟增加等。TCP 拥塞控制通过调节发送方的数据发送速率,来避免过度占用网络资源,确保网络的稳定和高效运行。

拥塞控制的主要算法

慢启动(Slow - Start)

这是 TCP 拥塞控制的初始阶段。在连接建立初期,发送方不知道网络的拥塞状况,所以会以比较保守的方式开始发送数据。发送方会设置一个拥塞窗口(congestion window,cwnd),初始值通常为 1 个最大报文段长度(MSS)。
每收到一个接收方返回的确认(ACK),拥塞窗口就会翻倍。例如,发送方发送了 1 个 MSS 大小的数据包,收到一个 ACK 后,cwnd 就变为 2 个 MSS;再发送 2 个 MSS 大小的数据包,收到这 2 个 ACK 后,cwnd 就变为 4 个 MSS,以此类推。这种指数增长的方式可以快速探测网络的可用带宽。
但是,慢启动并不意味着发送速率真的很慢。它只是相对后面的阶段而言,在网络状况良好的情况下,拥塞窗口会迅速增大,发送速率也会快速提升。

拥塞避免(Congestion - Avoidance)

当拥塞窗口增长到一定程度(慢启动阈值,ssthresh)后,就会进入拥塞避免阶段。这个阶段的目的是避免网络拥塞,发送方不再像慢启动阶段那样指数增长拥塞窗口,而是线性增长。
具体做法是,每收到一个 ACK,拥塞窗口 cwnd 就增加 1 个 MSS。例如,cwnd 为 16 个 MSS 时,发送 16 个 MSS 大小的数据包,收到这 16 个 ACK 后,cwnd 变为 17 个 MSS。这种线性增长方式可以更稳健地利用网络带宽,降低拥塞的风险。
在这里插入图片描述

快重传(Fast Retransmit)

快重传主要是为了快速恢复丢失的数据包。当接收方收到一个失序的数据包时,它会立即发送一个重复的 ACK,这个 ACK 的序列号是期望收到的下一个数据包的序列号。
如果发送方连续收到 3 个(或更多)相同序列号的重复 ACK,就会认为这个数据包丢失了,而不是等待超时重传定时器(RTO)超时。发送方会立即重传这个丢失的数据包,而不需要等待 RTO 超时,这样可以大大减少数据传输的延迟。

快恢复(Fast Recovery)

在快重传之后,发送方会进入快恢复阶段。在这个阶段,发送方会调整拥塞窗口和慢启动阈值。
一般情况下,发送方会将慢启动阈值 ssthresh 设置为当前拥塞窗口 cwnd 的一半,然后将 cwnd 设置为 ssthresh 加上 3(这是因为收到了 3 个重复的 ACK)。之后,发送方会继续以拥塞避免的方式增长拥塞窗口,也就是每收到一个 ACK,cwnd 就增加 1 个 MSS。这种方式可以在快速恢复数据传输的同时,避免网络进一步拥塞。

在这里插入图片描述

拥塞控制的重要性

从网络资源利用角度看,拥塞控制能够合理分配网络带宽。如果没有拥塞控制,多个 TCP 连接可能会无节制地发送数据,导致网络资源被少数连接过度占用,而其他连接无法正常通信。通过拥塞控制,各个连接可以根据网络状况调整自己的发送速率,使得网络带宽能够被公平、高效地利用。
从数据传输质量角度讲,拥塞控制可以减少数据包丢失和传输延迟。当网络拥塞时,数据包丢失的概率会大大增加,传输延迟也会变得不可预测。拥塞控制机制通过及时调整发送速率,能够降低数据包丢失的风险,保证数据能够以较为稳定的延迟进行传输,从而提高了数据传输的可靠性和服务质量。


http://www.mrgr.cn/news/80798.html

相关文章:

  • PlantUML 总结
  • 基于Ubuntu2404搭建k8s-1.31集群
  • 解决VsCode的 Vetur 插件has no default export Vetur问题
  • 【Java 面试 八股文】Redis篇
  • centos7 升级openssl并安装python3
  • 【GeeRPC】Day5:支持 HTTP 协议
  • 2024年12月英语六级CET6写作与翻译笔记
  • 实现线程同步的方法
  • WSL Ubuntu
  • 1、数据库概念和mysql表的管理
  • AQS源码学习
  • 实现星星评分系统
  • 【阻塞队列】- 生产者和消费者模式
  • 深度学习0-前置知识
  • 关于Unity VFX 在Spawn状态的一些笔记
  • Pytorch | 从零构建ParNet/Non-Deep Networks对CIFAR10进行分类
  • 本地虚拟机 docker 中安装体验 qwen2.5 大模型
  • Reactor
  • shell加减乘除运算
  • 电感的基本概念
  • [创业之路-199]:《华为战略管理法-DSTE实战体系》- 3 - 价值转移理论与利润区理论
  • Nautilus源码编译傻瓜式教程二
  • 实操给桌面机器人加上超拟人音色
  • C++算法第十一天
  • Autosar入门_汽车电子控制器
  • [SAP ABAP] ALV报表练习1