2

我正在使用 Boost asio 发送 TCP 消息。我设置了 NO_DELAY 选项,因为这是一个“实时”控制系统。我看到使用 Wireshark 在消息中设置了 PSH 标志。我对性能感到满意,并且它按预期工作。

出于兴趣,我决定关闭 NO_DELAY 并测量性能差异。

我交换了我现有的代码:

m_tcpSocket.open(boost::asio::ip::tcp::v4());
boost::asio::ip::tcp::no_delay noDelayOption(true);
m_tcpSocket.set_option(noDelayOption);

// snip create endpoint
m_tcpSocket.connect(m_tcpServerEndpoint);

// snip build message
m_tcpSocket.send(boost::asio::buffer(pDataBuffer, size));

为了

boost::asio::ip::tcp::no_delay noDelayOption(false);
m_tcpSocket.set_option(noDelayOption);

我仍然看到设置了 PSH 标志。

我还尝试删除 set_option 代码并仍然看到它设置。

在 Wireshark 中,我看到:

104 - 105  SYN
105 - 104  SYN, ACK
104 - 105  ACK
104 - 105  PSH, ACK + my message
105 - 104  ACK

其中 104 和 105 是我的 2 台 PC 的 IP 地址。我也很惊讶带有我的数据的消息有一个 ACK​​。

如何关闭 NO_DELAY?

4

2 回答 2

6

您的代码看起来好像正确设置为TCP_NODELAY打开或关闭。要启动TCP_NODELAY,请使用:

socket.set_option(boost::asio::ip::tcp::no_delay(false));

TCP RFC将PSH 定义为推送功能。简而言之,它是一个标志,通知接收者所有数据都已发送,因此将数据向上转发到协议栈。Boost.Asio将其 API映射到 BSD 套接字,而 BSD 套接字不提供控制 PSH 标志的方法。这通常由协议栈中的内核在清除其缓冲区时处理。

来自TCP/IP 图解

该标志通常用于指示在发送数据包的一侧的缓冲区已与发送数据包一起被清空。换句话说,当设置了 PSH 位字段的数据包离开发送方时,发送方就没有更多数据要发送了。

[...]

推送(接收方应尽快将此数据传递给应用程序——不可靠地实现或使用)。

于 2013-03-08T15:52:30.250 回答
3

NO_DELAY 不会更改发送给对等方的标志。它改变了内核的缓冲算法。谷歌关于 Nagle 算法以获得更多的了解。

于 2013-03-08T14:02:41.913 回答