当您的应用程序遭受TCP延迟ack和Nagle算法之间不幸的交互时,提供的常见解决方案是关闭Nagle的算法。
然而,在一般的网络搜索中,Nagle的算法总体上似乎更好(基于一般的算法以及这、这、这等)。但是看起来很难关闭延迟的ack,即使您关闭它,tcp堆栈也会在随后的数据交换中再次打开它。另一方面,Nagle的算法可以很容易地使用TCP_NODELAY或类似的选项关闭,并且保持不变。
纳格尔算法偏重延迟的背后原因是什么?与Nagle的算法相比,选择延迟ack的技术/非技术原因是什么?
编辑:正如@Bart van Ingen Schenau所指出的,当您无法控制客户端时,您所能做的就是关闭Nagle的algo,但是对客户端的控制是相当常见的,我想知道原因。
发布于 2020-04-03 13:05:35
据我理解:
对Nagle算法的控制完全在你这一边。应用该算法的是您的本地TCP堆栈。另一方面,延迟ACK是由您的通信伙伴的TCP堆栈创建的,您对它没有太多的控制。尤其是不跨越不同的联系。
发布于 2020-09-01 08:57:08
看起来很难关闭延迟的ack,即使您关闭它,tcp堆栈也会在随后的数据交换中再次打开它。
我在过去减少了(而不是删除)延迟的ack计时器,特别是为了减少对等程序Nagle算法的影响,否则我无法直接接触它。它没有被重置,但它是一个内核范围的设置,而不是每个套接字。详细的细节将取决于您的具体网络堆栈,没有一般的答案。
纳格尔算法偏重延迟的背后原因是什么?
我不认为有一个-堆栈没有拼命地试图阻止你篡改延迟的问题,只是没有完全相同的理由来揭露它。
send()时实际发送数据)似乎是合理的。因此,虽然我同意添加一个sockopt来控制延迟的ack计时器可能是合理的,但它并没有干扰应用程序代码直接做的事情。它根本不应该对应用程序本身产生任何影响。
https://softwareengineering.stackexchange.com/questions/408318
复制相似问题