TCP的拥塞窗口和快速恢复机制的一些备忘及一点想法
rwnd(窗口,代表接收端的处理能力)、cwnd(拥塞窗口,从发送端看当前网络整体承载能力)、ssthresh(快速增长切换成慢速增长的界限值)
1.慢启动,是指数增长(对面确认多少个包,就增加多少),并不慢,只是它的起点低,所以慢启动阶段仍需要时间。实际是起点低(1),快增长阶段,每一轮将当前拥塞窗口翻倍。
2.拥塞避免,引入了ssthresh(这个是个变量,初始往往是最大值65536,随后续拥塞发生不断调整),控制慢启动阶段区间是在窗口超过ssthresh之后,就开始线性增长(是让cwnd缓慢的增加而不是如慢启动时加倍的增长,每经历过一次往返时间就使cwnd增加1,而不是加倍,这样使cwnd缓慢的增长,比慢启动要慢的多。 一种通用的方法是对于TCP发送方无论何时到达一个新的确认,就将cwnd增加一个MSS(MSS/cwnd))。 实际是慢速逼近最大值。
3.拥塞状态,RTO超时且还没有得到数据确认,TCP就会对该报文段进行重传。 超时重传的发生就是拥塞状态进入标志。
拥塞状态发生后,1.把ssthresh降低为cwnd值的一半 2.把cwnd重新设置为1 3.重新进入慢启动过程。
4.仅存在慢启动和拥塞避免实际TCP也可以工作,不断在慢启动和拥塞避免之间循环:
慢启动出现拥塞(ssthresh初始值65536,不会达到),重新进入慢启动。
慢启动cwnd超过ssthresh(ssthresh此时是上次丢包是cwnd的一般,可以超过),进入拥塞避免。
拥塞避免出现拥塞,重新进入慢启动。
......
5.虽然慢启动和拥塞避免 配合拥塞状态也能工作,但发生拥塞后慢启动的起点低,耗时仍比较长,所以有必要叠加快速重传机制。
6.TCP利用3个相同的ACK来判定数据包丢失,这个可以认为是拥塞状态2,这个拥塞状态由接收端判定触发,此时RTO并未超时,只是接收端认为收到了很多大于某个序号seqx的包,但是seqx本身却没收到。 此时进行快速重传操作(每收到一个后面的包就会发一个未收到包的ack),快速重传机制实际就是拥塞状态2发生时的一个处理机制,或者说,拥塞状态2直接命名为快速重传2也可以。
拥塞状态2发生后,1.把ssthresh设置为cwnd的一半 2.把cwnd再设置为ssthresh的值(具体实现有些为ssthresh+3) 3.重新进入拥塞避免阶段。
8.有了拥塞状态2和快速重传机制后,拥塞避免就可以再次进入拥塞避免,这种情况下避免慢启动再次经历耗费时间,对网络的短暂波动适应能力强:
出现拥塞1(超时),则进入慢启动。
出现拥塞2(3ACK),则进入拥塞避免。
可以猜想:
在报文发送较少,低速状态时,发送了一个包,后面又没有什么后续报文。倘若该报文被丢了,此时接收端并不会感知到啥,只能依靠拥塞1来检测进入慢启动了。实际此时慢启动也关系不大,因为本身速率较低。
在报文发送较多,高速状态时,发送了一个包,后续还有很多后续报文。倘若该报文丢了,此时接收端可以更快感知到某个报文被丢弃,因为他会发现后续大部分甚至所有报文都到了,唯独缺了这个报文,就正常分析看,那个报文被丢弃可能性很大。 由于接收端此时对于丢包感知更快,主要会依靠拥塞2来检测,调整ssthresh和cwnd之后再次快速重传进入拥塞避免阶段。 这样避免了重新经历慢启动,节约了部分时间,避免了对速率造成更大影响。
9.通过拥塞2进入拥塞避免会经历快速恢复阶段(也有一种提法根本就没有快速恢复阶段,所谓快速恢复只是指出现拥塞2时直接转入拥塞避免的一个处理机制)。
快速恢复的流程:
1.当收到3个重复ACK时,把ssthresh设置为cwnd的一半,把cwnd设置为当前ssthresh的值加3,然后重传丢失的报文段,加3的原因是因为收到3个重复的ACK,表明有3个“老”的数据包离开了网络到达对岸。
2.再收到重复的ACK时,拥塞窗口增加1。
3.当收到新的数据包的ACK时,把cwnd设置为第一步中保存的ssthresh的值。原因是因为该ACK确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态。
TCP的拥塞窗口和快速恢复机制的一些备忘及一点想法的更多相关文章
- TCP之拥塞窗口原理
学过网络相关课程的,都知道TCP中,有两个窗口: 滑动窗口(在我们的上一篇文章中有讲),接收方通过通告发送方自己的可以接受缓冲区大小(这个字段越大说明网络吞吐量越高),从而控制发送方的发送速度. 拥塞 ...
- 一文带你掌握【TCP拥塞窗口】原理
❝ 关注公众号:高性能架构探索.后台回复[资料],可以免费领取 ❞ 学过网络相关课程的,都知道TCP中,有两个窗口: 滑动窗口(在我们的上一篇文章中有讲),接收方通过通告发送方自己的可以接受缓冲区大小 ...
- TCP 拥塞窗口原理
学过网络相关课程的,都知道TCP中,有两个窗口: 滑动窗口(在我们的上一篇文章中有讲),接收方通过通告发送方自己的可以接受缓冲区大小(这个字段越大说明网络吞吐量越高),从而控制发送方的发送速度. 拥塞 ...
- tcp协议头窗口,滑动窗口,流控制,拥塞控制关系
参考文章 TCP 的那些事儿(下) http://coolshell.cn/articles/11609.html tcp/ip详解--拥塞控制 & 慢启动 快恢复 拥塞避免 http://b ...
- TCP 滑动窗口和 拥塞窗口
转http://coolshell.cn/articles/11609.html 滑动窗口 -- 表征发送端和接收端的接收能力 拥塞窗口-- 表征中间设备的传输能力 TCP滑动窗口 需要说明一下,如果 ...
- TCP的滑动窗口机制【转】
原文链接:http://www.cnblogs.com/luoquan/p/4886345.html TCP这个协议是网络中使用的比较广泛,他是一个面向连接的可靠的传输协议.既然是一个可靠的 ...
- tcp 两个重要窗口:滑动窗口 和 拥塞窗口
一:滑动窗口是接受数据端使用的窗口大小,用来告知发送端接收端的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制的目的,对应==>rwnd:接收端窗口(receiver window) ...
- TCP/IP详细解释--TCP/IP可靠的原则 推拉窗 拥塞窗口
TCP和UDP在同一水平---传输层.但TCP和UDP最不一样的地方.TCP它提供了一个可靠的数据传输服务,TCP是面向连接的,那.使用TCP两台主机通过第一通信"拨打电话"这个过 ...
- TCP/IP详细说明--滑模、拥塞窗口、慢启动、Negle算法
TCP的数据流大致能够分为两类,交互数据流与成块的数据流. 交互数据流就是发送控制命令的数据流.比方relogin,telnet.ftp命令等等.成块数据流是用来发送数据的包,网络上大部分的TCP包都 ...
随机推荐
- centos7下使用x11远程带窗口安装Oracle
目录 centos7静默安装oracle11gR2 文章目录 一.检查硬件要求 1.内存要求: 2.安装包: 二.环境准备 1.安装必要的工具 2.关闭防火墙 3.关闭Selinux 4.安装Orac ...
- WinServer-the security database on the server does not have a computer account for
用了本地的administrator登陆
- centos在线安装ffmpeg
简介: 跨平台解决方案,用于记录,转换和流式传输音频和视频 挂载yum源 https://rpmfusion.org/Configuration RHEL 7 or compatible like C ...
- 四、Linux_用户切换
四.用户切换 # 切换用户的命令为: su username # 从普通用户切换到root用户,还可以使用命令: sudo su
- 升级openssh漏洞
升级openssl和openssh 最近接收到客户的漏洞提醒,openssl和openssh的漏洞,解决办法就只有升级. 升级前环境 ~]# ssh -V OpenSSH_5.3p1, OpenSSL ...
- ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索
ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...
- Flume知识扩展
1 常见正则表达式语法 元字符 描述 ^ 匹配输入字符串的开始位置.如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置. $ 匹配输入字符串的结束位置.如果设置了 ...
- SQL操作Spark SQL--CatalogApiTest
object CatalogApiTest { def main(args: Array[String]): Unit = { val spark = SparkSession .builder() ...
- [NOIp 2018]all
Description 题库链接: Day1 T1 铺设道路 Day1 T2 货币系统 Day1 T3 赛道修建 Day2 T1 旅行 Day2 T2 填数游戏 Day2 T3 保卫王国 Soluti ...
- LeetCode 428. Serialize and Deserialize N-ary Tree
原题链接在这里:https://leetcode.com/problems/serialize-and-deserialize-n-ary-tree/ 题目: Serialization is the ...