当前位置:网站首页>TCP的拥塞控制
TCP的拥塞控制
2022-07-25 12:55:00 【贪玩的木木】
前言
本文为个人学习笔记的整理,其中很多借鉴了小林coding的图解网络。
为了避免发送方无节制地发送数据,从而造成网络拥堵,所以 TCP 设计了拥塞控制。
流量控制和拥塞控制的区别
流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况。
拥塞窗口
拥塞窗口 cwnd(congestion window)是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。拥塞控制的本质就是使用算法控制拥塞窗口,从而避免过多的数据注入到网络。
但是其实真正决定传输速率的是发送方的滑动窗口大小,发送窗口 = min(拥塞窗口,接收窗口)
当发生了重传,就会认为网络出现了拥塞,拥塞窗口减小;否则拥塞窗口增大。
拥塞控制算法
拥塞控制算法:慢启动、拥塞避免、快速重传、快速恢复(这是官方定义的四大算法,但是个人认为不方便记忆和理解)。整体过程大约如下:
- 在 TCP 连接建立完毕后,会先使用慢启动算法,指数级逐渐增大拥塞窗口(+1 +2 +4 +8…)。
- 当拥塞窗口达到慢启动门限 ssthresh(slow start threshold)时,会使用拥塞避免算法,线性逐渐增大拥塞窗口。(+1 +1 +1…)
- 当发生超时重传或快速重传时,会使用拥塞发生算法:
- 发生超时重传,将 ssthresh 设为 cwnd/2,将 cwnd 设为初始值,然后会再次使用慢启动算法。
- 发生快速重传,使用快速恢复算法,然后进入拥塞避免阶段。
慢启动
TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量,当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1。慢启动算法发包的个数是指数性的增长。
有一个叫慢启动门限 ssthresh (slow start threshold)的状态变量。
- 当
cwnd<ssthresh时,使用慢启动算法。 - 当
cwnd>=ssthresh时,就会使用「拥塞避免算法」。
拥塞避免
规则:每当收到一个 ACK 时,cwnd 增加 1/cwnd。
拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长。就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,当触发了重传机制,也就进入了「拥塞发生算法」。
拥塞发生
当触发 TCP 重传机制时,就视为拥塞发生。TCP 的重传包括超时重传和快速重传,两种重传表示两种不同的网络情况,对应的也有两种拥塞控制手段。
超时重传
当发送方未在规定时间内接收到 ACK 确认包时,就会超时重传。每当遇到一次超时重传的时候,都会将下一次超时时间间隔设为先前值的两倍。两次超时,就说明网络环境差,不宜频繁反复发送。
当发生「超时重传」,就会使用拥塞发生算法,重新进入慢启动阶段。
这个时候,ssthresh 和 cwnd 的值会发生变化:
ssthresh设为cwnd/2。cwnd重置为初始值。
快速重传
快速重传不以时间为驱动,而是以数据驱动重传。
如果接收方收到一个失序的报文段,就即回送一个 ACK 给发送方。
快速重传的工作方式是当收到三个相同的 ACK 报文时,会在定时器过期之前,重传丢失的报文段。
当发生「快速重传」,TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 cwnd 变化如下:
cwnd = cwnd/2;ssthresh = cwnd;- 进入快速恢复算法阶段
快速恢复
快速恢复算法如下:
- 拥塞窗口
cwnd = ssthresh + 3( 3 的意思是已经确认收到了 3 个重复的数据包); - 重传丢失的数据包;
- 如果再收到重复的 ACK,那么 cwnd 增加 1(1 代表每个收到的重复的 ACK 包,都已经离开了网络。)
- 如果收到新数据的 ACK 后,把 cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;
首先,快速恢复是拥塞发生后慢启动的优化,其首要目的仍然是降低 cwnd 来减缓拥塞,所以必然会出现 cwnd 从大到小的改变。
其次,过程2(cwnd逐渐加1)的存在是为了尽快将丢失的数据包发给目标,从而解决拥塞的根本问题(三次相同的 ACK 导致的快速重传),所以这一过程中 cwnd 反而是逐渐增大的。
TCP 拥塞控制算法也有很多个版本,最早的 TCP Tahoe,是没有快速恢复算法的,当发生快速重传时,也会进入慢启动过程。
这里说的是 TCP Reno,除此之外,还有很多版本进行了各自的优化。
另外,网上的许多资料都对快速恢复算法进行了简化,跳过了中间过程而直接进入到拥塞避免阶段。文中的详细过程可以参考 RFC2581文档。
扩展-快速恢复失败:快速恢复算法会重传丢失的数据包,如果此时再次发生快速重传,就不会再使用快速恢复,而会直接进入慢启动阶段。
边栏推荐
- 零基础学习CANoe Panel(13)—— 滑条(TrackBar )
- EMQX Cloud 更新:日志分析增加更多参数,监控运维更省心
- Word style and multi-level list setting skills (II)
- Shell Basics (exit control, input and output, etc.)
- 机器学习强基计划0-4:通俗理解奥卡姆剃刀与没有免费午餐定理
- Selenium uses -- XPath and analog input and analog click collaboration
- web安全入门-UDP测试与防御
- [rust] reference and borrowing, string slice type (& STR) - rust language foundation 12
- Mlx90640 infrared thermal imager temperature sensor module development notes (V)
- CONDA common commands: install, update, create, activate, close, view, uninstall, delete, clean, rename, change source, problem
猜你喜欢

【AI4Code】《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》 EMNLP 2020

Convolutional neural network model -- lenet network structure and code implementation

massCode 一款优秀的开源代码片段管理器

2022 年中回顾 | 大模型技术最新进展 澜舟科技

R语言GLM广义线性模型:逻辑回归、泊松回归拟合小鼠临床试验数据(剂量和反应)示例和自测题

Connotation and application of industrial Internet

Make a general cascade dictionary selection control based on jeecg -dictcascadeuniversal

Zero basic learning canoe panel (14) -- led control and LCD control

EMQX Cloud 更新:日志分析增加更多参数,监控运维更省心

word样式和多级列表设置技巧(二)
随机推荐
Pytorch creates its own dataset and loads the dataset
[300 opencv routines] 239. accurate positioning of Harris corner detection (cornersubpix)
"Autobiography of Franklin" cultivation
The world is exploding, and the Google server has collapsed
《富兰克林自传》修身
跌荡的人生
【运维、实施精品】月薪10k+的技术岗位面试技巧
I want to ask whether DMS has the function of regularly backing up a database?
【AI4Code】《GraphCodeBERT: Pre-Training Code Representations With DataFlow》 ICLR 2021
感动中国人物刘盛兰
MLX90640 红外热成像仪测温传感器模块开发笔记(五)
7行代码让B站崩溃3小时,竟因“一个诡计多端的0”
Chapter5 : Deep Learning and Computational Chemistry
手写一个博客平台~第一天
并发编程 — 内存模型 JMM
ESP32-C3 基于Arduino框架下Blinker点灯控制10路开关或继电器组
Mid 2022 review | latest progress of large model technology Lanzhou Technology
yum和vim须掌握的常用操作
Chapter5 : Deep Learning and Computational Chemistry
Use of Spirng @conditional conditional conditional annotation