拥塞现象是指到达通信子网中某一部分的分组数量过多,使得该部分网络来不及处理,以致引起这部分乃至整个网络性能下降的现象,严重时甚至会导致网络通信业务陷入停顿,即出现死锁现象。这种现象跟公路网中经常所见的交通拥挤一样,当节假日公路网中车辆大量增加时,各种走向的车流相互干扰,使每辆车到达目的地的时间都相对增加(即延迟增加),甚至有时在某段公路上车辆因堵塞而无法开动(即发生局部死锁)。 — 摘自百度百科

端到端TCP拥塞控制的本质思想是通过调整发送端的发送速率来控制网络的负荷量。具体地说,TCP不断地通过加大发送的速率来对当前网络的实际承载能力进行探测,根据超时或者丢包等现象判断当前网络是否已经"超负荷“,然后迅速减小向网络中发送信息的速率,并在新的起点上继续对网络进行试探。从而达到控制网络请求的目的,避免出现大规模的拥塞以致导致网络不可用

早期的TCP协议只有基于窗口的流量控制(flow control)机制而没有考虑到可能由于网络自己的传输能力不足,而导致整个网络发生崩溃(影响网络的因素实在太多了,传输过程中有很多不可预见的问题)。

1988年V.Jacobson在论文中提出了由“慢启动(Slow Start)”和“拥塞避免(Congestion Avoidance)”组成的TCP的网络拥塞控制。在20多年的发展过程中,后人在此算法基础上又进行了多次的改进和优化

与拥塞控制相关的有四个比较重要的版本:TCP Tahoe、TCP Reno、TCP NewReno和TCP SACK。
TCP Tahoe是早期的TCP版本,它包括了3个最基本的算法-“慢启动”、“拥塞避免”和“快速重传(Fast Retransmit)”。TCP Reno则在TCP Tahoe基础上增加了“快速恢复(Fast Recovery)”算法,针对快速重传作出特殊处理,避免了网络拥塞不严重时采用“慢启动”算法而导致过度减小发送窗口大小的问题。

TCP NewReno的主要改进在于一个窗口内多个报文段丢失的问题。这样可以避免TCP Reno中的多次重传超时。另外,TCP NewReno算法在快速恢复中引入了部分确认(Partial ACK)。它在快速恢复阶段到达并且确认新数据,但它只确认进入快速重传之前发送的一部分数据。

TCP SACK(Selective Acknowledgement)也是对TCP Reno的改进,当检测到拥塞后,不必重传从数据丢失到检测到丢失这段时间发送端发送的所有报文段,而是对这些报文段进行有选择的确认和重传,避免不必要的重传。

基于丢包/超时的拥塞控制

这种算法就是在发送方维护一个拥塞窗口(cwnd),大小等于发送窗口,如果发送方没有在规定的时间间隔内收到接收方的应答,则就可以认为出现了网络拥塞。

Slow Start 慢开始算法

所谓慢启动,也就是在建立好连接的时候,先从较低的发送速率开始,一点点提速,试探一下网络的承受能力,由于一开始的速率较低,所以提升速度可以快一点

慢启动算法:
(1) 连接建立后先初始化拥塞窗口cwnd,其大小为1MSS( Maximum Segment Size 最大报文段长度)
(2) 客户端收到服务端的ack后.就会将cwnd大小*2, 呈指数上升
(3) 当cwnd 达到慢开始门限 (ssthresh, slow start threshold)时,停止慢开始算法,进入“拥塞避免算法”

Congestion Avoidance 拥塞避免算法

拥塞避免算法思路是将增长速率变为线性增长,也就是每经过一个往返RTT时间就把发送方的cwnd加1

过了慢开始门限后,拥塞避免算法可以避免窗口增长速度过快导致窗口拥塞,采用缓慢增加的方式调整到网络的最佳值。

简单来说:

  • 当cwnd < ssthresh ,使用慢开始算法;
  • 当cwnd = ssthresh,可以使用慢开始算法,也可以使用拥塞算法;
  • 当cwnd > ssthresh,使用拥塞算法;

通过上述两个算法可以使得网络传输速率一直增大,直到出现超时,这时候需要将cwnd重新调整到1 MSS开始,使用慢开始算法,同时将慢开始门限ssthresh调整为cwnd超时点的一半 ,然后继续执行慢开始、拥塞避免算法。

Fast retransmit 快重传算法 和 Fast Recovery 快速恢复算法

TCP拥塞控制默认认为网络丢包是由于网络拥塞导致的,所以一般的TCP拥塞控制算法以丢包来判断网络是否进入拥塞状态。对于丢包有两种判定方式,一种是超时重传RTO[Retransmission Timeout],另一个是收到三个重复确认ACK(因为TCP一旦超时就会重新发送数据包)。

重传定时器 :
判断报文段丢失的依据,发送端发送一个报文段同时启动重传定时器,如果重传定时器超时,但发送端还没有收到接收端的ACK,就判断该报文段丢失,重传丢失报文段并重新启动重传定时器。
TCP采用动态重传超时估计,即以往返时间RTT为基础来确定重传超时时间。其中最常用的是设置重传超时时间为往返时间RTT的两倍,即重传超时时间= 2* RTT

Tahoe算法的不足之处在于,收到3个重复ACK或在超时的情况下,Tahoe设置cwnd为1,然后进入慢启动阶段,大大降低了网络的利用率。
而Reno算法针对上述问题进行了改进:
1)对于收到连续3个重复的ACK确认,算法不经过慢启动阶段,而直接进入拥塞避免阶段;
2)增加了快速重传和快速恢复机制

所谓的快速重传就是说如果发送方接收到3个以上的重复ACK,TCP就认为发生了网络拥塞(有报文丢失),需要重传。此时不需要等到重传定时器超时,所以称之为快速重传,而在快速重传后没有使用慢启动算法,而是直接进入拥塞避免算法(将慢开始门限值(ssthresh)和cwnd 调整为此时cwnd的一半),所以这又叫做快速恢复算法。

其他拥塞控制算法

除了上述基于超时/丢包的拥塞控制,TCP还有很多不同维度的拥塞控制算法

比如:
基于丢包的拥塞控制:将丢包视为出现拥塞,采取缓慢探测的方式,逐渐增大拥塞窗口,当出现丢包时,将拥塞窗口减小,如Reno、Cubic等。
基于时延的拥塞控制:将时延增加视为出现拥塞,延时增加时增大拥塞窗口,延时减小时减小拥塞窗口,如Vegas、FastTCP等。
基于链路容量的拥塞控制:实时测量网络带宽和时延,认为网络上报文总量大于带宽时延乘积时出现了拥塞,如BBR。
基于学习的拥塞控制:没有特定的拥塞信号,而是借助评价函数,基于训练数据,使用机器学习的方法形成一个控制策略,如Remy。

TCP的拥塞控制--慢启动,拥塞避免,快重传,快速恢复相关推荐

  1. 【计算机网络】传输层 : TCP 拥塞控制 ( 慢开始 | 拥塞避免 | 快重传 | 快恢复 )

    文章目录 一.TCP 拥塞控制 二.TCP 拥塞控制算法 三.慢开始 和 拥塞避免 算法 四.快重传 和 快回复 算法 一.TCP 拥塞控制 TCP 拥塞控制 : ① 拥塞出现表现 : 资源需求总和 ...

  2. 5.3.3 计算机网络传输层之TCP拥塞控制(慢开始与拥塞避免、快重传和快恢复)

    文章目录 1.什么是拥塞控制? 2.拥塞控制与流量控制的区别 3.拥塞控制的4种算法 (1)慢开始与拥塞避免 (2)快重传和快恢复 1.什么是拥塞控制? 所谓拥塞控制,是指防止过多的数据注入网络,保证 ...

  3. 【计算机网络】-TCP的拥塞控制及拥塞控制方法

    TCP的拥塞控制及拥塞控制方法 TCP的拥塞控制 TCP的拥塞判断 TCP拥塞控制的方法 基于窗口的拥塞控制 拥塞窗口 慢开始 拥塞避免 快重传 快恢复 TCP拥塞控制总体流程图 TCP拥塞控制综合例 ...

  4. Linux_网络_传输层协议 TCP通信滑动窗口(快重传),流量控制,拥塞控制(慢启动),延迟应答,捎带应答,TCP常见问题(字节流,粘包),Listen半连接队列

    紧跟Linux_网络_传输层协议 TCP/UDP继续补充 文章目录 1. TCP通信时滑动窗口(效率) 2. 流量控制(可靠性) 3. 拥塞控制(慢启动) 4. 延迟应答 5. 捎带应答(提高通信效率 ...

  5. UDP(首部)和TCP(首部、三次握手、四次挥手、可靠传输、滑动窗口、流量控制、拥塞控制(慢开始、拥塞避免、快重传、快恢复))

    1.UDP 用户数据报协议 UDP(User Datagram Protocol): 是无连接的,尽最大可能交付,没有拥塞控制,面向报文(对于应用程序传下来的报文不合并也不拆分,只是添加 UDP 首部 ...

  6. TCP的慢启动、拥塞避免、重传、快恢复乱七八糟总是记不清?11个连环问让你一次性打通任督二脉

    摘要:如果你的开发过程涉及数据传输,一直在重传.超时之类的方案里有困惑的话,不妨重新学一学可靠性最精致的TCP协议. 本文分享自华为云社区<TCP的慢启动.拥塞避免.重传.快恢复乱七八糟总是记不 ...

  7. 网络:TCP停止等待、超时重传、滑动窗口、拥塞控制、快重传和快恢复

    TCP超时与重传机制 TCP协议是一种面向连接的可靠的传输层协议,它保证了数据的可靠传输,对于一些出错,超时丢包等问题TCP设计的超时与重传机制.其基本原理:在发送一个数据之后,就开启一个定时器,若是 ...

  8. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识

    原文:https://www.cnblogs.com/lshs/p/6038722.html 一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机 ...

  9. 【网络通信与信息安全】之深入解析TCP的“拥塞控制”原理

    一.前言 ① TCP 与 UDP 概念 在涉及到网络知识的面试中,TCP 和 UDP 是经常被提及的两个概念,它们是 OSI 模型中的运输层中的协议: TCP 全称为传输控制协议.这种协议可以提供面向 ...

最新文章

  1. python构建一个简单的备份脚本
  2. 如何解决Keil5打红叉的问题
  3. 【PHP】curl_init() 如何排错????
  4. wxWidgets:wxFontPickerCtrl类用法
  5. 极光推送指定用户推送_App用户都睡着了?是时候用推送和活动唤醒一波了!
  6. 3.Java 面试题整理(线程篇)
  7. 【作者解读】ERNIE-GEN : 原来你是这样的生成预训练框架!
  8. 服务器取绝对路劲的问题
  9. 拓端tecdat|R语言可视化渐近正态性、收敛性:大数定律、中心极限定理、经验累积分布函数
  10. 【数据可视化】AntV L7实现地图可视化,DrillDownLayer钻取异步获取数据,悬浮预警框
  11. 【ABMDRNet2021】 Adaptive-weighted Bi-directional Modality Difference Reduction Network for RGB-T Sema
  12. 模型矩阵、视图矩阵、投影矩阵
  13. ews java 新建邮箱_通过EWS JAVA API订阅邮箱更新
  14. Codeforces Gym 2015 ACM Arabella Collegiate Programming Contest
  15. chrome及Firefox各版本浏览器下载地址
  16. java数组常见异常:下标越界、空指针异常
  17. 【jQuery】 # jQuery选择器
  18. Redis缓存雪崩缓存击穿缓存穿透
  19. PDF如何设置注释字体大小
  20. 牛客小白月赛27 B.乐团派对

热门文章

  1. 科技文明等级那一级有量子计算机,人类科技在宇宙中属于几级文明,最高级文明多强?...
  2. java xml字符串提取元素,如何从Java中将子元素从XML提取到字符串?
  3. 简易 IM 双向通信电脑端 GUI 应用——基于 Netty、WebSocket、JavaFX 、多线程技术等
  4. 指定版本的python运行和指定python版本的pip
  5. 复习webpack4之Code Splitting
  6. 纳税服务系统八【系统、子系统首页】
  7. Wikioi 1081 线段树成段更新单点查询
  8. 如何提高码农产量,基于ASP.NET MVC的敏捷开发框架之自定义表单开发随笔四
  9. centos操作系统搭建Lamp环境(apache php mysql)
  10. 一条insert语句导致的性能问题分析(一)