Я не уверен, правильно ли понимаю http-keep-alive. На мой взгляд, он должен повторно использовать tcp-соединение, а не создавать новый. Тем не менее, я нашел что-то действительно странное, похоже, трудно предвидеть поведение http keep-alive.
Сервер: 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, чтобы поддерживать жизнь? почему он ведет себя так? Если он не будет использовать одно и то же соединение tcp в ситуации 2, в чем смысл сохранения жизни?
цените любые мысли!
Да, HTTP Keep Alive должен повторно использовать ваше TCP-соединение с сервером. Сервер добавляет Connection: keep-alive
Header с ответом, поэтому клиент поддерживает соединение. Таким образом, клиент не будет поддерживать соединение до ответа сервера.
Поэтому в первом сценарии сервер отвечает заголовком сразу после получения запроса. Таким образом, второй ответ (на самом деле может повторно использоваться, вам повезло, так как сервер отвечает на ваш запрос, прежде чем он отправит второй) повторно использует 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);
index.html
всегда отправляется в первую очередь. И он возвращается сразу, прежде чем я отправлю остальные запросы на выборку. Таким образом, клиент должен уже знать, что сервер уже установил поддержку активности