节点js - 为什么3连接?

时间:2012-12-04 16:12:15

标签: node.js sockets google-chrome networking tcp

考虑node.js的这个小型服务器

var net = require ('net');

var server = net.createServer(function (socket) {

    console.log("Connection detected");

    socket.on('end', function() {
        console.log('server disconnected');
    });

    socket.write("Hello World");
    socket.end();
});

server.listen("8888");

当我在Macbook Pro上使用Chrome测试服务器时,我在控制台中收到“Connection detected”消息的三倍。

我知道一个用于连接,另一个用于favicon,但第三个是什么呢?

1 个答案:

答案 0 :(得分:5)

我使用Firefox和wget(这是一个Linux命令行程序)进行了测试,并使用telnet进行了深度调查。令人惊讶的是,所有这些都没有做任何额外的连接(显然他们甚至没有尝试下载favicon)。所以我解雇了Wireshark并捕获了一个会话,并很快发现Chorme系统地使无用的连接,即只有connectsSYNSYN-ACK,{{ 1}})然后关闭连接(ACKRST)而不发送任何内容。

快速googlin,我发现this bug report(摘录):

  

我怀疑“空”TCP连接是

     
      
  1. 备份TCP连接,
  2.   
  3. IPv4 / IPv6并行连接,或
  4.   
  5. TCP预连接,
  6.         

    仅在原始TCP连接时才建立备份TCP连接   未在250毫秒内设置。 IPv4 / IPv6并行连接   仅当服务器同时具有IPv6和IPv6地址时才会生成   IPv6连接未在300毫秒内建立。既然你是   在localhost:8080测试本地服务器,你应该可以   快速连接,所以我怀疑你看到TCP   预连接。

         

    要验证“空”TCP连接是否为TCP预连接,请打开   “扳手”菜单>设置>在引擎盖下>隐私,并清除   “预测网络操作以提高页面加载性能”复选框。   关闭并重新启动Chrome。 “空”TCP连接是否已消失?

有关详细参考,请参阅the linked thread,其中详细介绍了备份,并行和预连接以及是否/为什么这是一个很好的优化。

相关问题