我不确定我是否正确理解 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);
情况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);
});
}
所以我的问题是,http保持活动的真正含义是什么?为什么会这样呢? 如果在情况2中不会使用相同的tcp连接,那么保持活动是什么意思?
感谢任何想法!
答案 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);