gpt4 book ai didi

javascript - WebSocket TCP 数据包聚集在一起?

转载 作者:技术小花猫 更新时间:2023-10-29 12:54:10 26 4
gpt4 key购买 nike

关于 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次左右,因为每1/4秒一次收到5个数据包。但是,我见过可以发送恒定、快速的数据包流的示例。是什么导致这种聚集在一起/数据包相互等待?

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

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

最佳答案

最后,客户端没有意识到 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 正确地不“待机”服务器确认,并且网络立即推送消息,这样才能更快地通过数据包,而不会出现缓冲区阻塞问题。

关于javascript - WebSocket TCP 数据包聚集在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13373519/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com