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

时间:2011-06-02 23:35:09

标签: c++ c network-programming sockets

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

  1. connect - 发送 - 关闭每条消息
  2. 1次连接 - 多次发送并在禁用NA时结束1次关闭。 虽然我读到了禁用NA的后果,但在我看来,每次打开和关闭套接字只是为了发送消息也是一个代价高昂的代价。
  3. 没有留下插座还有其他解决方案吗?

    感谢。

2 个答案:

答案 0 :(得分:12)

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

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

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

答案 1 :(得分:2)

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

但我建议你看一下UDP。 TCP可以在丢包期间引入任意延迟,并且“TCP公平性”基于强制丢包发生而工作。它不适合低延迟传输。想要禁用Nagle是一个强烈的迹象,表明你正在使用错误的协议。