关于JavaScript和PHP WebSocket的TCP数据包聚合问题,以下是示例。
由于某些原因,在我的VPS上快速发送数据包或通过指向我的IP地址的域访问本地主机时,多个数据包会聚集在一起。例如,我正在尝试每秒发送20个(@100byte)数据包进行流媒体传输。在服务器端,它们确实以稳定的速率发送出去,每50毫秒精确地发送20个数据包。 然而,当它们到达客户端时,客户端仅会每1/4秒处理新消息。这导致每秒只能接收大约4个新的数据包...
是什么导致数据包聚合在一起?当一切都在本地主机上运行时,此问题不会发生。更奇怪的是,它在iPhone的iOS移动Safari上平稳运行,没有任何问题。但是,在PC上的Safari中完全无法工作(因为我还没有正确设置它与旧的Hixie-76 WebSocket格式配合使用,我认为移动Safari已经使用了更新的RFC 6455或更新的JavaScript编译器),我尝试过多个托管公司,每次都得到完全相同的结果。
请参见以下示例,托管在InMotion的VPS上: http://www.hovel.me/script/serverControl.php
(单击左侧的[连接],然后单击右侧的[查看游戏])。
当前接收到的数据包将每次跳动大约5个,因为每1/4秒都会接收到5个数据包。但是,我看过一些可以发送连续快速流数据包的示例。 是什么导致这些数据包聚合在一起 / 等待彼此?
编辑: 这必须与Nagle算法有关,该算法收集并发送小数据包吗?我将尝试绕过PHP中的此问题。
即使在 PHP 中设置了 TCP_NODELAY,问题仍然存在。为什么 iPhone 上可以工作但 PC 上不行,这仍然让我感到困惑...编辑: 在注册表中将 TCPNoDelay 和 TcpAckFrequency 设置为 1 可以解决此问题,但我不能指望每个用户都这样做。必须有一种基于客户端 JavaScript 的方法来解决此问题。
如何实现类似 node.js 的 "socket.setNoDelay(true)" 的功能,而不使用 node.js?