尽管有http-alive,但仍有多个tcp连接

时间:2018-09-22 15:36:15

标签: javascript node.js http tcp keep-alive

我不确定我是否正确理解 http-keep-alive ,我认为它应该重用tcp连接,而不是建立新的连接。但是,我发现了一些非常奇怪的东西,似乎很难预测 http保持活动的行为。


服务器:NodeJS&Express ^ 4.16.3 我已经用Wireshark分析了结果


情况1:

  • 服务器端

for(let i =1; i<11; i++){
  app.use('/' + i, (req, res) => {
    res.header('cache-control', 'no-store');
    res.send('i');
  });
}

server.keepAliveTimeout = 50000;

  • 客户端

setTimeout(() => {
    for (let i = 1; i < 11; i++) {
      fetch('' + i).then(data => console.log(data));
    }
  }, 10000);

  • 结果:tcp连接被重用(仅一个tcp连接),所有获取请求都重用index.html建立的tcp连接 enter image description here

情况2:

  • 客户端代码相同,只有服务器端代码在这里更改

for(let i =1; i<11; i++){
  app.use('/' + i, (req, res) => {
    res.header('cache-control', 'no-store');
    // here I have added timeout!
    setTimeout(() => {
      res.send('i');
    }, 2000);
  });
}

  • 结果:尽管我已设置 server.keepAliveTimeout = 50000;
  • ,但仍然建立了5个tcp连接(仅显示图片4,因为屏幕截图不完整)。

enter image description here


所以我的问题是,http保持活动的真正含义是什么?为什么会这样呢? 如果在情况2中不会使用相同的tcp连接,那么保持活动是什么意思?

感谢任何想法!

1 个答案:

答案 0 :(得分:0)

是的,HTTP Keep Alive应该重新使用与服务器的TCP连接。服务器在Connection: keep-alive标头后附加响应,以便客户端使连接保持活动状态。因此,在您的服务器响应之前,客户端不会保持连接状态。

因此,在您的第一种情况下,服务器在收到请求后立即用标头答复。因此,第二个响应(实际上可能会重用,因为服务器在发送第二个请求之前响应了您的请求,因此您很幸运)重新使用了TCP连接。

但是在第二种情况下,服务器等待2秒钟发送响应,因此客户端直到下一个2秒钟才知道它应该是保持活动的连接。但是所有其他请求都需要在此之前发送,因此默认情况下,它将为每个HTTP请求创建一个新的连接。

如果您需要连续调用HTTP接口(例如req-> res-> req-> res),这可能会很有效,但是如果您要从服务器获取独立的数据收集,这可能会很低效。

如有任何疑问,请在客户端尝试

setTimeout(() => {
    fetch('' + i).then(data => console.log(data));

    setTimeout(function () {
        for (let i = 2; i < 11; i++) {
            fetch('' + i).then(data => console.log(data));
        }
    }, 5000)
}, 10000);