核心机制:拥塞控制
限制滑动窗口的发送速率
流量控制,已经接受方的处理能力,进行限制
木桶效应 最短的一板
发生方的速率,不光要考虑接收方的速率,还要考虑传输路径,整个过程中所有的中间节点的情况
拥塞控制的核心思路是,"试试看",先按照比较小的速度发送数据,看一下是否丢包
如果丢包,说明中间链路已经有节点顶不住了,减小窗口大小,减小速度
如果不丢包,说明中间链路中的节点处于较好的状态,增大窗口的大小,增加速度
(面多加水,水多加面)
发送方的发送窗口的大小,同时取决于 流量控制 和 拥塞控制(谁小谁说的算)
发送方自己维护一个变量作为拥塞控制窗口
流量控制:接收方通过 ack 告诉对方流量控制窗口
选择两者中的较小值作为发送窗口的大小
拥塞窗口的大小变化过程,也是比较巧妙的设定,不是字节而是"份",一份多少个字节也是不确定的
1)初始状态下,窗口的大小是非常小的,刚开始,网络的畅通情况是未知的
2)慢启动之后如果不丢包,就会按照指数方式进行增长,短时间,快速的把窗口的大小给顶上去(刚开始的时候太小了)
3)指数增长到一定程度的时候(到达阈值),指数增长变成线性增长(主要怕指数增长的一次导致翻得倍数太大,超出上限太多)
4)线性增长到一定程度,终究会触发丢包(网络的承载能力到达上限了)
5.1)出现丢包,窗口的大小会一落千丈,回到最初的慢启动窗口额大小,接下来重复 指数增长/线性增长的过程
5.2)出现丢包,重新计算阈值(丢包窗口大小的 / 2),重阈值开始作为新的拥塞控制的窗口大小,继续线性增长(相比于旧版本,省略了指数增长的过程),使 tcp 的传输效率更加稳定,避免大起大落