TCP有流量控制和拥塞控制。
流量控制 Flow Control
拥塞控制 Congestion Control
流量控制是防止发送方的数据填满接收方的缓存,调节的是两个端点的流量。
拥塞控制是防止链路中的节点的阻塞。链路中节点故障,或处理能力弱,也会造成阻塞,就像堵车一样。
发送方需要根据网络状况,调节发送数据量的大小。
1. TCP的拥塞控制算法
TCP的拥塞控制算法有很多种,常见的有Liunx内核默认的 Reno 算法 和 Google的 BBR 算法。
Reno算法是《计算机网络》收录的算法,下面详述该算法。
Reno算法的拥塞控制过程,分为4个阶段:
基本过程就是,先快速增长,然后慢速增长语法拥塞。还有就是发生拥塞后的措施和快速恢复。
名词解释:
cwnd -- 拥塞窗口
ssthresh(slow start threshold)-- 慢启动到拥塞避免到阈值
RTT——Round Trip Time,也就是一个数据包从发出去到回来的时间
RTO(Retransmission TimeOut)重发超时时间
1. 慢启动
拥塞窗口一开始是一个很小的值,不同的版本会有不同,一般是1,3,10等。
数据包发出后,每收到一个ack,拥塞窗口就加1。
如此,3个数据包,收到3个ack,就会变成6,翻倍。
慢启动过程,拥塞窗口成倍增长,即指数级增长。
2. 拥塞避免
当拥塞窗口达到阈值,就会进入拥塞避免阶段。
此阶段,每收到一个ACK,拥塞窗口就会加1,拥塞窗口成线性增长。
发送拥塞,分为两种情况:
2.1 RTO超时,重传数据包。TCP认为这种情况很糟,反应强烈。
sshthresh = cwnd/2
cwnd 重置为初始值,是1 ?
进入慢启动过程
2.2 收到3个duplicate ACK,这种情况较轻,反应不强烈。
cwnd = cwnd / 2
sshthresh = cwnd
进入快恢复阶段
3. 快重传
快重传,就是,发送只要连续收到3个重复确认,就会立即重传刚才丢失的包。例如,收到3个序号2的重复确认,
就会立即重传2号包。因为2号包没到,没有ACK,所有才有的3个重复的2号包ACK。
4. 快恢复
收到3个重复确认,阈值ssthresh减半,cwnd=ssthresh,直接进入拥塞避免算法,收到新的ACK,线性增大拥塞窗口
快恢复的关键点就是,不从慢启动开始,而是直接从拥塞避免开始,拥塞窗口线性增长。
2. ssthresh的值该设置成多少?
动态的,因为不同设备,不同网络环境中网络等承载能力是不同的,初始值会设置很大,
然后按照上面介绍的到了拥塞发生阶段,sshthresh会被设置成拥塞发生时候,拥塞窗口的一半。
3. 收到多个重复ACK比RTO网络情况好?
收到多个重复的ACK,说明中间有一个包没有正常接收,后面的包还能正常接收。
而RTO,超时,则说明中间的一个包,以及后面的所有包都没有正常的接收,这个拥塞就比较严重了。
参考:
https://blog.csdn.net/qq_26896213/article/details/84594060?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase
https://zhuanlan.zhihu.com/p/76023663
https://www.cnblogs.com/bewolf/p/11077721.html