拥塞控制,捎带应答,延迟应答实际都与提高TCP的效率的机制
拥塞控制
上次我们谈到TCP通过滑动窗口来高效可靠的发送大量数据,但是当一开始就发送大量数据,当遇到网络比拥堵或者网络状态不佳的时候,就会引发一系列的问题。
为了解决这一问题,TCP引入慢启动机制,先发少量的数据,“探探路”,然后再决定数据的发送的速度。
- 这里引入一个拥塞窗口的概念
- 发送开始时,定义拥塞窗口大小为1
- 每次收到的一个ACK,拥塞窗口就加一
- 每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小进行比较,取较小的值作为实际发送的窗口大小
上图中的拥塞窗口增长速度是指数级别的,刚开始的时候比较慢,增长的时候还是非常快的
- 为了控制拥塞窗口的增长速度,引入了一个慢启动阈值
- 当拥塞窗口超郭这个阈值,就不再按指数方式增长,而是按线性增长,这里按照线性增长原因是防止拥塞(虽然增长到了一定的值,必定会再次拥塞)
- 当TCP开始启动的时候,慢启动阈值等于窗口最大值
- 在每次超时重传的时候,慢启动阈值会变成原来的一半,同时拥塞窗口置回1
注意:
当少量丢包出现的时候,我们仅仅触发超时重传,当大量丢包的时候,我们认为是网络拥塞
当TCP通信开始之后,网络吞吐量会逐渐上升,随着网络发生拥堵,吞吐量也会下降
拥塞控制实际是在保证保证传输效率的情况下,避免造成网络太大压力的折中方案
延迟应答
如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小
- 如果接收端缓冲区为1M,一次收到了500K的数据,如果立刻应答,返回的窗口是500K;
- 但实际上可能处理端处理的速度很快,10ms之内就把500k数据从缓冲区拿走了
- 在这种情况下,接收端处理还远远没有达到自己的极限,即使窗口再大一点也能够处理
- 如果接收端能够稍微等一下,再应答,比如等待200ms再应答,那么这个时候返回窗口大小就是1M
窗口越大,网络吞吐量越大,传输效率越高,在保证网络不拥塞的情况下要尽量提高传输速率
可以通过以下两种方式实现延迟应答
- 数量限制:每隔N个包就应答一次
- 时间限制:超过最大延迟时间就应答一次
具体是数量和时间与操作系统有关,一般N取2,超时时间取200ms
捎带应答
在延迟应答的基础上,很多情况下,客户端和服务器在应用层也是一收一发的,意味着客户端给服务器发送一个“hello”,服务端也会给客户端回一个“hi”,这时候ACK就可以搭顺风车,跟着服务端的“hi”,一起回到客户端。