目录
- 目录
- 编译信息
- 说明
- 修改
编译信息
作者: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。