zoukankan      html  css  js  c++  java
  • TCP的拥塞控制

    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

  • 相关阅读:
    如何在Windows 10 IoT Core中添加其他语言的支持,如中文
    交易应用及网站驱动不兼容Windows 10的解决方案
    五步轻松实现对现代浏览器的兼容
    在Windows 10中开启开发者模式
    Modern.IE,创建现代网站的给力开发工具!
    Visual Studio的 Apache Cordova 插件CTP3.0发布!
    什么开发?什么是编程语言?你能学吗?你能做吗?
    IT'S NOT A JOKE!一篇博客让你玩转IT领域!你说我吹NB?请进来跟着浪一浪
    python为什么慢?
    编译错误 expected class-name before ‘{’ token
  • 原文地址:https://www.cnblogs.com/mengff/p/13246797.html
Copyright © 2011-2022 走看看