WebSocket的TCP数据包一起丛生?(WebSocket TCP packets clumpi

2019-07-03 19:27发布

有关的JavaScript和PHP的WebSocket TCP包结块,以下面的例子。

出于某种原因,在我的VPS快速发送数据包时,或通过我的IP地址指向一个域名访问我的本地主机,多个数据包会聚集在一起。 我想流,在这个例子中,20(@ 100byte)每秒数据包。 在服务器端,他们确实正在以稳定的速率发送出去,正好每50ms,使得每秒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每次会跳,因为每个5个分组被接收一次当前分组,第二的每1/4日。 不过,我已经看到了可以发送数据包的恒定,快速流的例子。 是什么原因导致这种聚集在一起/包等待对方?

编辑 :这必须是与Nagle算法 ,它收集和小包一起发送? 我会向试图在PHP绕过这方面的工作。 即使有这种TCP_NODELAY在PHP设置,问题仍然有效。 为什么它的工作原理上的iPhone,但不是PC仍是扔我了...
编辑 :在注册表中设置TCPNoDelay和的TcpAckFrequency 1修正这一问题,但我不能指望每一位用户这样做。 必须有一个客户端,面包黄油JavaScript的方式。

怎样才可以有功能复制的node.js'‘ socket.setNoDelay(真) ’,而不使用Node.js的?

Answer 1:

这是TCP。 它是通过节约IP数据包帮助你。 部分原因是由于Nagle算法,但它的一部分也可以通过所述中间网络引起的。



Answer 2:

最后,客户端无法识别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
};

这种治标不治本的工作,然而, 这将增加近一倍的带宽使用 ,其他网络问题之一。 直到我能得到客户端上的WebSocket的结束,以不正确的服务器的ACK“待机”,并在网络上通过的消息立即推动,这通过更快的获取数据包而不缓冲塞上问题。



文章来源: WebSocket TCP packets clumping together?