• 传输层 TCP 拥塞控制(1):慢启动


    由于TCP协议向应用层提供不定长的字节流发送方法,使得TCP协议先天性的就有意愿占满网络中的整个带宽,但是网络中许多TCP连接同时去试图占满整个带宽的时候就有可能发生恶心拥塞事件,而TCP的拥塞控制算法则是非常有必要的,能够有效的降低网络当中的拥塞,提升所有TCP的发送速度。

    全局思考:拥塞控制


    慢启动
    拥塞避免
    快速重传
    快速恢复

    在网络拓扑中可以看到左边的client向右边的server进行链路通信的时候,这条链路的带宽是1000M每秒,理想条件下没有达到1000M的时候是缓慢上升,到了1000M是保持在这样一个水平,但是实际上是达不到的。

    比如从R1过来的流量是700M每秒,从R2过来的流量是600M每秒,实际上R3能够传出的流量是1000M每秒,所以一定有300M每秒的数据被R3丢弃了。

    当R3发生丢掉过载的数据包的时候,R3的队列也会非常的长使得每一个报文在网络当中呆的时间也会更加长,RTT时延也会过长,当轻度拥塞的时候吞吐量已经下降了,当重度拥塞的时候网络是非常糟糕的。

    而拥塞控制实际上是包含了4个部分, 慢启动,拥塞避免,快速重传,快速恢复。

    慢启动


    慢启动当中定义了一个概念叫做拥塞窗口,

    • 拥塞窗口             cwnd(congestion window)
    • 通告窗口             rwnd(receiver‘s advertised window,也就是对方的接受窗口)
    • 发送窗口             swnd = min(cwnd,rwnd)(等于对方的接受窗口和拥塞窗口的最小值
    • 每收到一个ACK,cwnd扩充一倍(最初只有一个mss,当我收到了ack之后,没有发生丢包,然后扩展为2个cwnd,同理收到之后4个cwnd,以指数级别的快速的去上升)

    慢启动在解决什么问题呢,也就是我不清楚当前的网络状态是不是已经非常繁忙了,所以我先悠着点,少发一点,当我确定网络中没有丢包的时候,那么我再去快速的增加我的拥塞窗口,这就是慢启动的意义所在。

    慢启动的初始窗口


  • 相关阅读:
    JavaScript Object 转 FormData
    LeetCode Hot100之三:128.最长连续序列
    我的创作一周年纪念日
    JavaSE_Java实现开散列哈希桶,测试重载hashCode方法
    Spring的IOC介绍
    Python飞行棋游戏源代码,基于socket网络通信的小游戏,可设置多个游戏房间及参与飞行棋游戏的玩家
    模式分类识别 | Python实现基于Xboost的股票走势识别预测
    vue2升级vue3:vue2 vue-i18n 升级到vue3搭配VueI18n v9
    【PyTorch】深度学习实践 02 线性模型
    openssl3.2 - exp - export ecc pubkey from ecc priv key
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/126557517