我正在Boost::ASIO中编写一个协议(protocol),该协议(protocol)具有以下要求:
我应该使用其他TCP套接字标志或Boost::ASIO设置吗?
socket_.set_option(boost::asio::ip::tcp::no_delay(true)); // enable PSH
socket_.set_option(boost::asio::socket_base::keep_alive(true)); // enable SO_KEEPALIVE
socket_.set_option(boost::asio::detail::socket_option::integer<SOL_TCP, TCP_KEEPIDLE>(120)); // secs before keepalive probes
socket_.set_option(boost::asio::detail::socket_option::integer<SOL_TCP, TCP_KEEPINTVL>(10)); // interval between keepalive
socket_.set_option(boost::asio::detail::socket_option::integer<SOL_TCP, TCP_KEEPCNT(5)); // failed keepalive before declaring dead
最佳答案
TL; DR -该协议(protocol)将处理所谓的“细流” ,如果我的回答还不够的话,它们将被很好地记录下来。最大的优势应该来自no_delay(true)
和async
读/写(用于正常操作)以及dupACK和线性超时(用于故障恢复)。有关更多详细信息(包括静态/服务器TCP选项)和其他说明,请参见下文。
通常,我会考虑以下因素来选择这些选项:
Not surprisingly, SSR can have a significant impact on performance of long-lived TCP connections that may idle for bursts of time — e.g., due to user inactivity. As a result, it is generally recommended to disable SSR on the server to help improve performance of long-lived HTTP connections.
,取自here。选项:sysctl -w tcp_slow_start_after_idle=0
tcp_thin_dupack
应该为ON。它减少了发送者在重新传输丢失的段之前等待的时间。请仔细阅读并试验预防措施(可以在每个插槽中指定,请立即参阅下面的要点)。 tcp_thin_linear_timeouts
-这样可以在丢失数据包时更快地进行恢复,可以针对每个套接字指定它:https://nnc3.com/mags/LJ_1994-2014/LJ/219/11180.html TFO_FASTOPEN
(TFO):-缩短了初始连接的建立。对于生命周期长的连接不是很适用,但是可以考虑。 如果您的协议(protocol)针对telnet之类的通信进行了调整,则可以看到此telnet的实现。基本上,它充满了异步读写:
https://lists.boost.org/boost-users/att-40895/telnet.cpp
一些不错的读物:
https://www.extrahop.com/company/blog/2016/tcp-nodelay-nagle-quickack-best-practices/
https://sourceforge.net/p/asio/mailman/asio-users/?page=257-获得其他帮助。
关于c++ - Boost::ASIO:优化以最小的流量,长连接,小消息,立即传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48047579/