由于TCP的复杂性,已经用多篇文章来介绍 TCP保证可靠性的机制了(有序列号(按序到达)、确认应答、校验和(华为网络基础 | IP包校验和算法实例抓包验证、华为网络基础 | TCP校验和算法实例抓包验证及华为网络基础 | TCP校验和错误原因及再次实例抓包验证)、连接管理(华为网络基础 | TCP连接管理机制及华为网络基础 | TCP断开连接管理机制)和超时重传机制)和流量控制及拥塞控制, 上篇已经介绍了TCP尽可能提高性能的滑动窗口、快速重传机制,今天继续讲解延迟应答与捎带应答机制,来提高TCP的性能。
一、延迟应答
1、什么是延迟应答?
数据传输的时候,发送端给接收端发送数据,接收端给发送端发去确认应答信息,这样比较耗时,效率低下,延迟应答就是接收端收到数据之后,稍微等一会再应答,这样可以提高数据的传输效率,因为发送端发好几次数据,接收端只需要一次来确认应答,这样可以降低网络拥塞的概率。
假设接收端缓冲区为1M. 一次收到了500K的数据; 如果立刻应答, 返回的窗口大小也就是500K;然后可能处理端处理的速度很快,10ms之内就把增加到缓冲区的500K数据处理掉了; 在这种情况下, 接收端处理还远没有达到自己的极限, 即使窗口再放大一些, 也能处理过来。
如果接收端稍微等一会儿再应答, 比如等待200ms再应答, 那么这个时候返回的窗口大小就是1M,窗口越大, 网络吞吐量就越大, 传输效率就越高。
2、所有的包都可以延迟应答吗?
答案是否定的,他有两个限制:
数量限制: 每隔N个包就应答一次;
时间限制: 超过最大延迟时间就应答一次。
ps:具体的延迟应答数量和超时时间,依操作系统不同也有差异,一般N取2,超时时间取200ms。
二、捎带应答
1、什么是捎带应答?
虽然有延迟应答,但是客户端和服务器在应用层还是还是”一发一收”,此时就会导致数据传输效率低下,捎带应答就是接收端在给发送端发送数据的时候,捎带着向发送端发去确认应答,应答的内容是接收端已经收到发送端发送的数据。
2、使用捎带应答之前
客户端:你好吗?
服务器:我收到你发的消息了(即:接收端的ACK应答)
服务器:我很好
3、使用捎带应答
客户端:你好吗?
服务器:我很好(接收端给发送端发送的数据),我也收到你发的消息了(即:接收端的ACK应答)
使用捎带应答后,ACK就可以搭顺风车了,在接收端给发送端发送数据的时候,ACK就可以捎带着给发送端发送过去。