我正在使用 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));
for
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?
您的代码看起来设置正确TCP_NODELAY
打开或关闭。设置TCP_NODELAY
关闭,使用:
socket.set_option(boost::asio::ip::tcp::no_delay(false));
The TCP RFC https://www.rfc-editor.org/rfc/rfc793#page-15将 PSH 定义为推送函数。简而言之,它是一个标志,通知接收方所有数据已发送,因此将数据向上转发协议栈。 Boost.Asiomaps http://www.boost.org/doc/libs/1_53_0/doc/html/boost_asio/overview/networking/bsd_sockets.html它的 API 是针对 BSD 套接字的,而 BSD 套接字不提供控制 PSH 标志的方法。这通常由协议栈中的内核在清除缓冲区时处理。
From TCP/IP 图解 https://rads.stackoverflow.com/amzn/click/com/0201633469:
该标志通常用于指示在发送数据包的同时发送数据包一侧的缓冲区已被清空。换句话说,当设置了 PSH 位字段的数据包离开发送方时,发送方不再有数据可发送。
[...]
推送(接收者应尽快将此数据传递给应用程序 - 未可靠地实现或使用)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)