y2k*_*y2k 19 c++ sockets boost tcp boost-asio
我正在Boost :: ASIO中编写一个协议,它具有以下要求:
是否应该使用其他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
Run Code Online (Sandbox Code Playgroud)
Min*_*ius 16
TL; DR - 该协议将处理所谓的"瘦流",如果我的答案不够,它们就会有很好的文档记录.最大的优势应该来自no_delay(true)
和async
读/写(用于正常操作)和dupACK和线性超时(用于故障恢复).有关更多详细信息(包括静态/服务器TCP选项)和其他备注,请参阅下文.
一般来说,我会考虑以下因素来选择这些选项:
选择了我想要构建的底层协议 - 调查协议的调优选项 4.对于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.
取自此处.选项: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.htmlTFO_FASTOPEN
(TFO): - 缩短初始连接建立.不太适用于长寿命连接,但可以考虑.应用程序应该处理的一些基础结构详细信息或协议文档可以指定
如果你的协议被调整为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 - 寻求更多帮助.