节点js - 为什么3连接?

oop*_*psi 2 sockets networking tcp google-chrome node.js

考虑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");
Run Code Online (Sandbox Code Playgroud)

当我在Macbook Pro上使用Chrome测试服务器时,我在控制台中收到三次"检测到连接"消息.

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

Raf*_*ele 5

我使用Firefox和wget(这是一个Linux命令行程序)测试它,以及telnet进行深入调查.令人惊讶的是,所有这些都没有做任何额外的连接(显然他们甚至没有尝试下载favicon).所以我解雇了Wireshark的和捕获的会话,并很快发现,Chorme系统使无用连接,也就是说,它只是连接(SYN,SYN-ACK,ACK),然后关闭连接(RST,ACK不发送任何数据).

只是一个快速的googlin,我发现了这个错误报告(摘录):

我怀疑"空"TCP连接是

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

仅当在250毫秒内未设置原始TCP连接时,才会建立备份TCP连接.仅当服务器同时具有IPv6和IPv6地址且未在300毫秒内设置IPv6连接时,才会进行IPv4/IPv6并行连接.由于您正在localhost:8080上测试本地服务器,因此您应该能够快速连接到它,因此我怀疑您正在看到TCP预连接.

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

有关进一步参考,请参阅链接的线程,它更深入地解释了备份,并行和预连接是什么以及是否/为什么这是一个很好的优化.