2

考虑这个用于 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 测试服务器时,我在控制台中收到三倍的“检测到连接”消息。

我知道一个用于良好的连接,另一个用于网站图标,但是第三个是关于什么的?

4

1 回答 1

5

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

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

我怀疑“空”的 TCP 连接是

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

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

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

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

于 2012-12-04T18:10:25.203 回答