TCP协议之确认应答

TCP传输数据的过程中,每次接收方收到数据后,都会对传输方进行确认应答,也就是会发送ACK报文。这个ACK报文中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发。
TCP协议之确认应答_第1张图片

序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。这也是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。

参考:

https://mp.weixin.qq.com/s?__biz=MzUyMDE1ODQ3NQ==&mid=2247483877&idx=1&sn=14094b286c3a82818d65b73b085c1e19&chksm=f9efed81ce986497425387cc5a341e36aad6bc0fa1368f4565595fbb914ff48996932148b235&scene=0&xtrack=1&key=67f1291a8f8b0e0caedc032ecf4ea17ccadc06a109cf50bc6c150da5bed72491f2fe6035ec0af2ea118e68db8cbdbfc92d8e646444f379400c50e6252398afffb5b0e4f4ac67aa2261f32ec2646800f6&ascene=1&uin=MTM4NTAxOTAwMA%3D%3D&devicetype=Windows+10&version=62060833&lang=zh_CN&pass_ticket=KCCjrEW7nZtyLfaaJaHQd4lN6EY3WqsDUgOT1lLBtOaVVUytxJEU869XvRI%2FrY09

你可能感兴趣的:(TCP协议之确认应答)