序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。这也是TCP传输可靠性的保证之一。
Delayed ACK(延迟确认):
如果只是单纯的发送一个确认,代价会比较高(IP头部20字节+TCP头部20字节)。
TCP Delayed ACK就是为了解决这个问题,进而改善网络性能。它将几个ACK响应组合在一起成为单个响应,或者将ACK响应与响应数据一起发送给对方,从而减少协议开销。
具体如下:
- 当有响应数据要发送时,ACK会随响应数据立即发送给对方;
- 如果没有响应数据,ACK将会延迟发送,以等待看是否有响应数据可以一起发送。在linux系统中,默认这个延迟时间是40ms;
- 如果在等待发送ACK期间,对方的第二个数据包又到达了,这时要立即发送ACK。
Nagle算法
Nagle算法是一种通过减少网络发送数据包来提高TCP/IP网络效率的方法。它使用发明人 John Nagle 的名字来命名的,John Nagle 在 1984 年首次用这个算法来尝试解决福特汽车公司的网络拥塞问题。
试想如果应用程序每次产生1个字节的数据,都以网络数据包的形式发送到远程服务器,那么就很容易导致网络因为太多的数据包而过载。在这种情况下,传送一个只有1个字节有效数据的数据包,却要花费40个字节长包头(即IP头部20字节+TCP头部20字节)的额外开销,这种有效载荷(payload)的利用率是极其低下的。
具体如下:
- 如果发送内容大于等于1个MSS(MSS为TCP数据包每次能传输的最大数据分段),立即发送;
- 如果之前有包没有被ACK,则缓存发送内容;
- 如果收到ACK,立即发送缓存内容。
Delayed ACK和Nagle算法同时使用
Nagle和Delayed ACK都能提高网络传输的效率,Nagle用在发送方,Delayed ACK用在接收方,一起使用就可能会出大问题。例如:
A和B进行数据传输,A运行Nagle算法,B运行Delayed ACK算法;如果A向B发送一个数据包,B由于Delayed ACK不会立即响应;而A使用Nagle算法,就会一直等待B的ACK,ACK不来一直缓存剩下的数据包;如果这两个数据包是应对同一个请求,那这个请求就会被耽误40ms。
网友评论