当前位置:网站首页>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文档。
扩展-快速恢复失败:快速恢复算法会重传丢失的数据包,如果此时再次发生快速重传,就不会再使用快速恢复,而会直接进入慢启动阶段。
边栏推荐
- 【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享
- Can flinkcdc import multiple tables in mongodb database together?
- web安全入门-UDP测试与防御
- Chapter5 : Deep Learning and Computational Chemistry
- A turbulent life
- Mid 2022 review | latest progress of large model technology Lanzhou Technology
- Connotation and application of industrial Internet
- 【AI4Code】《CodeBERT: A Pre-Trained Model for Programming and Natural Languages》 EMNLP 2020
- Moving Chinese figure liushenglan
- 【重温SSM框架系列】15 - SSM系列博文总结【SSM杀青篇】
猜你喜欢

Mid 2022 review | latest progress of large model technology Lanzhou Technology

卷积神经网络模型之——AlexNet网络结构与代码实现

Selenium use -- installation and testing

web安全入门-UDP测试与防御

基于JEECG制作一个通用的级联字典选择控件-DictCascadeUniversal

B树和B+树
![[rust] reference and borrowing, string slice type (& STR) - rust language foundation 12](/img/48/7a1777b735312f29d3a4016a14598c.png)
[rust] reference and borrowing, string slice type (& STR) - rust language foundation 12

【AI4Code】《CoSQA: 20,000+ Web Queries for Code Search and Question Answering》 ACL 2021

yum和vim须掌握的常用操作

工业互联网的内涵及其应用
随机推荐
《富兰克林自传》修身
AtCoder Beginner Contest 261 F // 树状数组
2022.07.24 (lc_6126_design food scoring system)
EMQX Cloud 更新:日志分析增加更多参数,监控运维更省心
CONDA common commands: install, update, create, activate, close, view, uninstall, delete, clean, rename, change source, problem
Substance Designer 2021软件安装包下载及安装教程
迁移PaloAlto HA高可用防火墙到Panorama
JS 中根据数组内元素的属性进行排序
Pytorch creates its own dataset and loads the dataset
Lu MENGZHENG's "Fu of broken kiln"
【视频】马尔可夫链蒙特卡罗方法MCMC原理与R语言实现|数据分享
Atcoder beginer contest 261e / / bitwise thinking + DP
Substance designer 2021 software installation package download and installation tutorial
Date and time function of MySQL function summary
Zero basic learning canoe panel (14) -- led control and LCD control
Convolutional neural network model -- vgg-16 network structure and code implementation
卷积神经网络模型之——VGG-16网络结构与代码实现
The world is exploding, and the Google server has collapsed
OAuth,JWT ,OIDC你们搞得我好乱啊
零基础学习CANoe Panel(13)—— 滑条(TrackBar )