延迟应答
在TCP中,有确认应答机制以保证数据的可靠传输,但是是不是接收方收到数据就立即返回ACK应答呢,如果是这样,这时候的缓冲区中接受的数据还没能够处理,缓冲区的剩余大小就是窗口大小。
在收到数据以后并不立即返回确认应答,延迟一会,等待缓冲区中数据被处理,那么剩余的缓冲区就会大些——这是延迟应答。
如果接受数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小。那是因为刚接受完数据,缓冲区已满。当某个接收端收到这个小窗口的通知以后,会以它为上限发送数据,从而又降低了网络的利用率,为此引入了延迟应答机制。
- 假设接受端缓冲区为1M,一次收到了500K的数据;如果立刻应答,返回的窗口就是500K;
- 但实际上可能处理端处理的速度很快,10ms之内就把500K数据从缓冲区消费掉了;
- 在这种情况下,接收端处理还远没有达到自己的极限,即使窗口再放大一些,也能处理过来;
- 如果接收端稍微等一会再应答,比如等待200ms再应答,那么这个时候返回的窗口大小就是1M;
一定要记得,窗口越大,网络吞吐量就越大,传输效率就越高,我们的目标是在保证网络不拥堵的情况下尽量提高传输效率;
那么所有的包都可以延迟应答吗?
不是的,与以下有关:
- 数量限制:每隔N个包就应答一次;
- 时间限制: