关于 JavaScript 和 PHP WebSocket TCP 数据包聚集,示例如下。
出于某种原因,当在我的 VPS 上快速发送数据包,或者通过指向我的 IP 地址的域访问我的本地主机时,多个数据包会聚集在一起。在本例中,我尝试每秒传输 20 个(@100byte)数据包。在服务器端,它们确实以稳定的速率发送出去,每 50 毫秒,每秒发送 20 个。但是,当它们到达客户端时,客户端仅大约每 1/4 秒处理一次新消息。导致新数据包仅以每秒 4 个左右的速率接收......
是什么导致数据包聚集在一起?当一切都通过 localhost 时不会发生此问题。更奇怪的是,它在 iPhone 的 iOS Mobile Safari 上流畅播放,完全没有问题。但是,它在 PC Safari 上根本不起作用,(因为我没有将它设置为与旧的 Hixie-76 WebSocket 格式一起正常工作,我假设 Mobile Safari 已经在使用更新的 RFC 6455 或更新的 JavaScript编译器)我尝试了多家托管公司,每次都得到完全相同的结果。
请参阅下面的示例,托管在 InMotion 的 VPS 上:http: //www.hovel.me/script/serverControl.php
(点击左侧的【连接】,然后点击右侧的【查看游戏】)。
当前接收到的数据包每次会跳跃大约 5 个,因为每 5 个数据包一次接收一次,每 1/4 秒一次。但是,我已经看到了可以发送恒定、快速的数据包流的示例。是什么导致这种聚集在一起/数据包相互等待?
编辑:这与Nagle 的算法有关,它将小数据包一起收集和发送?我将努力尝试在 PHP 中绕过它。即使在 PHP 中设置了这个 TCP_NODELAY,问题仍然存在。为什么它适用于 iPhone 而不是 PC 仍然让我失望......
编辑:在注册表中将 TCPNoDelay 和 TcpAckFrequency 设置为 1 可以解决此问题,但我不能指望每个用户都这样做。必须有一种客户端的、面包和黄油的 JavaScript 方式。
如何在不使用 node.js 的情况下复制 node.js 的“ socket.setNoDelay(true) ”功能?