【发布时间】:2013-03-15 13:55:15
【问题描述】:
我在 Linux 平台上使用阻塞 BOOST ASIO 套接字。 在一些 read() 操作中,我看到了 500+ 毫秒的巨大延迟。 (通常延迟很好,但如此巨大的延迟是不可接受的)
我已经使用该选项禁用了 Nagle 算法
_socket->set_option( tcp::no_delay( true) );
我尝试在互联网上搜索,似乎还有其他东西,例如 Delayed Ack 和 PUSH flag 可以确保这种延迟消失。
我使用的是 Linux,PUSH 标志设置可能在 Linux 中不可用。 不确定 BOOST 上的延迟确认设置。 (我应该使用从 boost socket 中提取的 native socket 描述符吗?)
结束这个问题,延迟来自接收方。 客户端和服务器之间实现的底层协议是这样的,即接收者不会给发送者一个标志来发送更多的数据包。在 TCP 级别上什么都没有。应用程序级别的实现很糟糕。
【问题讨论】:
-
真正的问题是你用这个套接字连接什么?很可能挂断是在连接的另一端,而不是你的。
-
你是如何测量这个延迟的?它来自哪里?
-
您是否在 发送 端禁用了 Nagle 算法?它对接收方没有影响。您确定发送方确实发送了数据吗?
-
尝试启用 TCP_QUICKACK,如此处答案所述:stackoverflow.com/questions/1615447/disable-tcp-delayed-acks
-
@RichardJ.RossIII 我同意你的观点,但我希望我能证明这一点。
标签: c++ linux sockets boost boost-asio