WebSocket TCP数据包聚集在一起?

The*_*Lee 11 javascript networking html5 tcp websocket

关于JavaScript和PHP WebSocket TCP数据包聚集,请参见下面的示例.

出于某种原因,当在我的VPS上快速发送数据包,或通过指向我的IP地址的域访问我的本地主机时,多个数据包将聚集在一起.我试图流,例如,每秒20(@ 100byte)数据包流.在服务器端,它们确实以稳定的速率发送,恰好每50ms发送一次,每秒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,因为每1/4秒一次接收每5个数据包.但是,我已经看到了可以发送恒定,快速数据包流的示例.是什么导致这些聚集在一起/数据包相互等待?

编辑:这与Nagle的算法有关,它收集和发送小数据包?我会努力试图在PHP中绕过这个.即使在PHP中设置了这个TCP_NODELAY,问题仍然存在.为什么它适用于iPhone而不是PC仍然让我失望...
编辑:在注册表中将TCPNoDelay和TcpAckFrequency设置为1修复此问题,但我不能指望每个用户都这样做.必须有一个客户端,面包和黄油JavaScript方式.

如何在不使用node.js的情况下复制node.js'" socket.setNoDelay(true) "的功能?

The*_*Lee 5

最后,客户端没有意识到 Nagle 算法被禁用,并且其确认频率仍然设置在 200 毫秒左右,导致中间网络将后续数据包保存在缓冲区中。每次客户端收到消息时,手动向服务器发送确认消息,都会导致网络立即“唤醒”并继续处理下一个数据包,而不是将它们保存在缓冲区中。

例如:

conn = new WebSocket(url);
conn.onmessage = function(evt){
    Server.send('ACKNOWLEDGE BYTES'); // Send ACK to server immediately
    dispatch('message', evt.data); //Do regular event procedures
};
Run Code Online (Sandbox Code Playgroud)

这个临时解决方案是有效的,但是这将使带宽使用率几乎翻倍,以及其他网络问题。直到我可以让客户端上的 WebSocket 正确地不“等待”服务器确认,并且让网络立即推送消息,这样才能更快地通过数据包,而不会出现缓冲区堵塞问题。


use*_*421 4

这就是 TCP。它通过节省 IP 数据包来帮助您。一部分是Nagle算法造成的,但也有可能是中间网络造成的。