继续画图带你学习TCP 其他 7 大特性(三)
六、拥塞控制 (安全机制)
拥塞控制是考虑网络传输路径上的拥堵程度
虽然TCP有了滑动窗口这个大杀器,能够高效可靠的发送大量的数据;但是如果在刚开始阶段就发送大量的数据,仍然可能引发问题;因为网络上有很多的计算机,可能当前的网络状态就已经比较拥堵,在不清楚当前网络状态下,贸然发送大量的数据,是很有可能雪上加霜,因此,TCP引入 慢启动 机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据
线增积减 (和式增加,积式减少)
像上面这样的拥塞窗口增长速度,是指数级别的,“慢启动” 只是指初使时慢,但是增长速度非常快,具体的增长如下图:
刚开始的时候从1指数增长,到达阈值后开始线性增长,如果出现网络阻塞,直接减小到初始值,然后再次指数增长到达新的阈值(新阈值为上次阻塞窗口大小的一半),再次线性增长直到网络阻塞,一直这样动态变换循环
为啥要动态变化??
网络的拥堵情况是瞬息万变的,我们要随时根据网络的实际情况进行动态调整 (随时适应网络的变化过程)
七、延迟应答 (效率机制)
目的是为了提高效率,在流量控制的基础上,尽量返回一个合理但又比较大的窗口
在前面我们提到,在发送端发送数据后,接收数据的主机需要返回 ACK应答,此时若立刻返回,窗口可能比较小 (因为缓冲区的数据只处理了一部分),所以 TCP 采用了延迟应答机制,举例:
不带延迟应答:
有一个超市,假设泡面库存最多存放100箱,当前已经存了80箱,空余20箱;
第二天一早,送货小哥来问:“老板,你明天需要多少面?”
老板:“你最多送20箱就行。”
带延迟应答:
第二天一早,送货小哥来问:“老板,你明天需要多少面?”
老板:“我晚上的时候打电话告诉你需要多少。”
(可能白天又卖出了10箱,第二天最多送10箱即可)
延时应答其实就是让 ACK 的发送时间晚一会儿 (不影响可靠性的前提下);
延迟的时间中就会给应用程序提供更多的消费数据的机会,此时时间到了,再发送 ACK 的时候,得到的窗口大小(接收缓冲区的剩余空间就会更大一些)
窗口越大,网络吞吐量就越大,传输效率就越高;我们的目标是在保证网络不拥塞的情况下尽量提高传输效率
问:所有的包都可以延迟应答么?
肯定不是
- 数量限制: 每隔 N 个包就应答一次 (N一般为2)
- 时间限制: 超过最大延迟时间就应答一次 (时间一般取200 ms,延迟应答的等待时间不能超过超时重传的时间,不然就重传了)
文章转自公众号:三友的java日记