【问题标题】:latency issue with socket.io(websockets)socket.io(websockets)的延迟问题
【发布时间】:2014-08-14 07:11:54
【问题描述】:

我们计划使用 node.js 创建一个实时 SPA,我们正在测试延迟,请通过以下链接:

http://173.200.239.98:6060/

有 2 个区域...当用户将鼠标悬停在右侧的文本区域上时,我们在左侧的文本区域中打印延迟,延迟以毫秒为单位。问题是延迟从 0.3 秒到 6 秒不等。网络套接字正常吗?还是我做错了什么?

注意:- 服务器位于美国底特律,我正在从印度钦奈访问服务器。

源代码:

    <!DOCTYPE html>
     <html>
  <head>
    <meta charset='utf-8'/>
  </head>
  <body style='margin:0px' >

    <table>
    <tr>
        <th>latency in milliseconds</th>
        <th>hover to trigger message</th>
    </tr>
    <tr>
        <td><textarea id='message' name='message' rows="20" cols="20" ></textarea></td>
        <td><textarea id='hover' name='hover' rows="20" cols="20" ></textarea></td>
    </tr>
    </table>

    <script src="http://code.jquery.com/jquery-latest.min.js"></script>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        jQuery(function($){

            var socket = io.connect();
            var messagearea=document.getElementById("message");
            var workarea=document.getElementById("hover");
            workarea.onmousemove=function(){


                var startTime = Date.now();
                socket.emit('ping',startTime);

            };

            socket.on('pong', function(startTime) {
                var latency = Date.now() - startTime;
                messagearea.innerHTML=  messagearea.innerHTML + latency + '\n';
                messagearea.scrollTop = messagearea.scrollHeight;

            });

        });
    </script>   

  </body>
</html>

【问题讨论】:

  • 所以有一个来自印度的数据包 --> 底特律,一些服务器延迟,然后是一个来自底特律的返回数据包 --> 印度,它都是 TCP,所以也有确认数据包以另一种方式发送。绕了半个地球,一些明显的滞后并不让我感到惊讶。您预计延迟是多少?
  • 是的,这就是我的问题..这是正常的滞后吗?还是我做错了什么? @jfriend00
  • 我在加利福尼亚州圣何塞的测试页面上得到大约 75 毫秒,这似乎相对正常。我的互联网连接速度非常快,而且圣何塞与互联网骨干网的连接非常好。
  • 173.200.239.98:6060 你测试过我的延迟测试应用运行的这个链接吗? @jfriend00
  • 试试ping -n 20 173.200.239.98 看看往返时间是多少。这将您的客户端和服务器排除在外,并为您提供原始网络往返的基准。我在您的应用程序中得到的结果几乎相同,这让我认为您的客户端和服务器运行良好,而您看到的是网络传输时间。

标签: node.js websocket socket.io-1.0


【解决方案1】:

我通过 ping 测试和您的应用得到几乎相同的结果。由于 ping 测试将您的客户端/服务器排除在外,并使用众所周知的网络工具 - 如果您在应用程序中获得与 ping 测试相似的结果,那么您的客户端/服务器运行良好,而不是延迟。

现在,当您进行从印度到底特律的测试时,您所建立的网络已经跨越了半个地球,并且至少跨越了一个大洋。如果有一些延迟并不奇怪,如果延迟变化也不奇怪。只是为了让您了解必须发生的事情是您将一些 TCP 数据包从印度发送到底特律。它们经过许多不同的路由器和服务提供商以及电缆/光纤,最终到达底特律的服务器。因为它是 TCP,所以必须沿反向路由发回交付确认。然后您的服务器获取数据包并以另一种方式发送 TCP 数据包,这再次需要通过返回数据包进行确认。

我运行了您的应用并得到了以下结果:

我在加利福尼亚州圣何塞使用ping -n 20 173.200.239.98 进行了 ping 测试,得到了以下结果:

如您所见,ping 测试的时间为 73-87 毫秒。您的应用游戏 74-83 毫秒。这些基本相同。看来您的客户端和服务器运行良好。

我建议您在您所在的位置运行自己的 ping 测试,看看您的 ping 测试和您的应用结果之间有多大差异。

如果您想查看您的数据包经过的路线以及到达每个站点的运输时间信息,您可以运行以下命令:

tracert 173.200.239.98

它会向您显示到达目的地途中每个连续主要跳跃的时间(以毫秒为单位)。

【讨论】:

  • 对我来说最小是 332ms,最大是 397ms,平均是 354ms...!感谢这个..很多
  • 我使用了命令tracert 173.200.239.98 很多信息来到了cmd提示符...!
  • 因为你使用了我的延迟应用程序,数据传输是连续的..所以如果我创建一个缓冲区,它只会在收到第一个数据包时发送第二个数据包,它有助于减少延迟吗?
  • @CODeeerrrrrrrr - 通常当一个人遇到延迟问题时,您希望发送并行传输,而不是等待其他传输完成。但是,我不明白你最近的问题真正想解决什么问题,所以我不知道如何回答。单次传输获得响应的时间可能不会改变。
  • 问题很简单......当网络套接字是静态的时,为什么会有这种延迟变化......以及我们如何称它为实时应用程序,因为存在时间延迟......而且是真实的时间应该没有时间滞后......我也单独发布了这个问题:stackoverflow.com/questions/25357758/…..有什么建议吗?
【解决方案2】:

WebSocket 中没有任何内在的东西会导致不一致的延迟。如果这就是您所得到的,请尝试在同一网络路由上执行 WebSocket 以外的其他操作并观察延迟。例如,ping 或 FTP。

如果您得到同样不稳定的延迟,那么您就知道这与 WebSocket 连接无关。如果您没有得到同样不稳定的延迟,那么这可能与您的浏览器或 JavaScript 有关。也许处理或呈现消息很慢?

基本上,您需要开始剥离每一层以尝试发现是哪一层增加了延迟。

【讨论】:

    【解决方案3】:

    显然它取决于您所在的位置。我认为这就是互联网的运作方式。 德国的延迟非常低:在 120 到 160 毫秒之间......这很快......

    【讨论】:

      猜你喜欢
      • 2018-02-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2015-04-14
      • 2011-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多