流量控制
背景:假设我是一个水果店老板,你是每天需要给我补货的人,我有一个仓库是放水果的,容量是3000,这是补货的人给我发的货数量就不能大于我仓库的容量,如果今天来补了3000,假设我第二天一箱都没卖出去,那么我就需要告诉你暂停发货了,等我卖出去了,仓库能有点空闲的位置的时候,你再来补货。
上面的例子中,水果店老板就是接收者;补货人就是发送者;仓库就是接收缓冲区
在前文提到的滑动窗口特性中,滑动窗口不能无限大,传输效率太快了接收方反应不过来,应该根据接收方的处理能力来反向制衡发送方的发送速度;这里的“接收方处理能力”就是指接收方剩余的能处理的空间大小,并且实际发送的数量还不能大于接收方剩余的大小。
接收缓冲区:从发送方发过来的数据都先到了接收缓冲区(相当于仓库),主机B的应用程序调用read()方法,就在接收缓冲区中读取数据,被read读到的数据就可以从缓冲区中删除了,这时接收方的剩余大小就会变大(相当于阻塞队列)
拥塞控制
在以上的流量控制介绍完,我们多少会有些疑问,第一个窗口大小是如何判断的,这就需要用到拥塞控制:它和流量控制共同决定发送方窗口的大小。
拥塞控制是靠路网络传输路径上的拥堵程度,只能通过“反复试探”的方式,逐渐时弹出应该用多大的窗口,
实际发送的滑动窗口大小 = min(拥塞窗口大小,流量控制窗口大小)
由上图可以看出来:
- 从一个较小的窗口开始试探
- 如果没有发生拥堵(没有丢包),就以指数形式扩大拥塞窗口
- 达到一定的阈值之后,线性增加窗口的大小
- 一直到出现丢包后,窗口回到初始值,调整阈值为出现丢包的窗口大小的一半
这以上也就可以说明滑动窗口其实是动态可变的
TCP拥塞控制这样的过程, 就好像 热恋的感觉