websocketpp延时到达问题解决

目录

  • 目录
  • 编译信息
  • 说明
  • 修改

编译信息

作者:xzf

创建时间:2022/03/16

更新时间:2022/03/16

说明

使用GitHub上的websocketpp,发现到达的时候会有差别,故记录一下。

问题及思路

问题:

在使用websocketpp时,在传输视频流时,发现到达的时间,与理论的时间不符合,如60fps,帧间间隔应在16.7ms,但是时间出现的时间会出现(32ms,0ms)这样的值,故猜测是两帧时间同时到达,进一步验证发现,当数据量少一定的值后,会几个包一起发送。

思路:

查阅资料后发现是由于TCP自带的Nagle算法导致的。

TCP/IP协议中,无论发送多少数据,总是要在数据前面加上协议头,同时,对方接收到数据,也需要发送ACK表示确认。为了尽可能的利用网络带宽,TCP总是希望尽可能的发送足够大的数据。(一个连接会设置MSS参数,因此,TCP/IP希望每次都能够以MSS尺寸的数据块来发送数据)。Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块。

找到问题后,就基本可以解决了。

解决方法:

参考websocketpp自带例子testee_server

void on_socket_init(websocketpp::connection_hdl, boost::asio::ip::tcp::socket & s) {
    boost::asio::ip::tcp::no_delay option(true);
    s.set_option(option);
}
testee_server.set_socket_init_handler(bind(&on_socket_init,::_1,::_2));

注意地方:

由于最新0.8.2发布版本上面的设置会报错,在develop分支上修复, 故需要下载develop分支的webosock。

tag(s): none
show comments · back · home
Edit with Markdown