N*(连接 + 发送 + 关闭) vs (Nagle 禁用 + 连接 + N*发送 + 关闭) , N > 1

N*(connect + send + close) vs (Nagle disable + connect + N*send + close) , N > 1

本文关键字:发送 关闭 连接 gt 禁用 vs Nagle      更新时间:2023-10-16

我是套接字编程的新手(正如你已经通过我愚蠢的问题了解到的那样),但抛开我的羞耻感不谈,我正在使用TCP posix编写一个程序。我的限制如下:从客户端发送到服务器的消息应该以字节流的形式读取,虽然我的应用程序性能不高,但应该尽快发送消息。我编写了一个TCP客户端类,目的是执行以下操作:1个连接-多个发送-和1个在流式传输结束时关闭。问题是消息不能近乎实时地传递(我认为它在等待一个更大的包来更好吞吐量)在网上做了一些研究后,我发现虽然你可以禁用Nagle算法(NA),但这样做是一个非常糟糕的主意。由于我是套接字编程的新手,我不想禁用我不完全理解的功能。所以我只剩下两个(糟糕的?)选项:

  1. 每条消息连接-发送-关闭
  2. 1个连接-发送多次,并在NA禁用的情况下在最后关闭1个。当我读到禁用NA的后果时,在我看来,每次打开和关闭套接字只是为了发送消息也是一个昂贵的代价

有没有其他不留插座的解决方案?

谢谢。

在您的情况下,禁用Nagle正是您想要做的。

请记住,每次对write()的调用都会立即传输数据。因此,请确保将整个消息打包在一起,然后在准备发送时调用write()(或writev())一次;不要用较小的有效负载重复调用write(),因为这会很慢。

像你这样的情况正是他们让你禁用Nagle的原因。

@Nemo为TCP提供了很好的建议。

但我建议你看看UDP。TCP可以在数据包丢失期间引入任意延迟,而"TCP公平性"的工作原理是强迫数据包丢失。它不适合低延迟传输。想要禁用Nagle是你使用错误协议的有力迹象。