使用 webSockets 避免 Nagle 算法影响的最佳方法?

Posted

技术标签:

【中文标题】使用 webSockets 避免 Nagle 算法影响的最佳方法?【英文标题】:Best way to avoid Nagle algorithm effects using webSockets? 【发布时间】:2014-10-15 12:23:00 【问题描述】:

我正在使用 webSockets 将 javascript webSocket 客户端连接到 java webSocketServer(来自 android 应用程序),使用 Java-WebSocket 库。 Android 应用每隔几毫秒向 javascript 客户端发送一条小消息。

使用针对这种情况的基本(和直观)方法,在 javascript 客户端内部测量的接收消息之间的延迟显示(大致)以下模式: 200 ms、0.1 ms、0.1 ms、0.1 ms、0.1 ms、0.1 ms、0.1 ms、200 ms、0.1 ms、0.1 ms、0.1 ms、0.1 ms、0.1 ms、0.1 ms、200 ms、0.1 ms、0.1 ms , 0.1 毫秒, 0.1 毫秒, 0.1 毫秒, 0.1 毫秒 ...

这是默认设置的 Nagle 算法的效果,在发送之前将多条消息聚集在一起。

由于我还没有找到保证停用的方法,所以我按照this老问题中提出的方法,从客户端向服务器发送确认消息,系统运行正常,但是由于确认消息有没有真正的目的(它更像是一种黑客行为),应该避免。

问题是,这一直是这个问题的最佳解决方案吗?你知道有什么办法可以避免结块吗?

谢谢。

【问题讨论】:

在.NET中socket对象中有一个设置禁用nagle算法,Java中可能有类似的东西。 套接字上是否有.flush() 方法可以在写入后调用? 您的图书馆中是否有 setTcpNoDelay() 可供您使用? 库中没有 flush 或 setTcpNoDelay 方法。 我做了一个孤立的实验:github.com/valsteen/socketio-nagle-experiment。关于 chrome for android 的结论:acks 没有效果。但是发送填充数据包会产生很好的效果。如果您需要本地基于 Web 的应用程序的低延迟,这可能是一种选择。 【参考方案1】:

由于使用的库上似乎不存在刷新或 setTCPNoDelay 机制,并且没有提出其他解决方案,因此确认消息解决方案似乎仍然有效,作为该问题的最佳解决方案。

【讨论】:

以上是关于使用 webSockets 避免 Nagle 算法影响的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

TCP Nagle算法以及延迟确认(即延迟回复ACK)的学习

如何在 iPhone 上的 TCP 连接上禁用 Nagle 算法

Nagle算法

TCP之Nagle算法与TCP_NODELAY

socket.setNoDelay([noDelay]) 用的是Nagle算法

如何在 Linux 中禁用 Nagle 算法? [关闭]