несколько соединений TCP, несмотря на http-alive

1

Я не уверен, правильно ли понимаю 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);
  • результат: tcp-соединение повторно используется (только одно соединение tcp), все запросы выборки повторно используют соединение tcp, установленное index.html Изображение 174551

Ситуация 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);
  });
}
  • результат: установлено еще 5 tcp-соединений (на картинке только 4, потому что скриншот не завершен), несмотря на то, что я установил server.keepAliveTimeout = 50000;

Изображение 174551


Итак, мой вопрос: что означает http, чтобы поддерживать жизнь? почему он ведет себя так? Если он не будет использовать одно и то же соединение tcp в ситуации 2, в чем смысл сохранения жизни?

цените любые мысли!

Теги:
http
tcp
keep-alive

1 ответ

0

Да, 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);
  • 0
    спасибо за ваш пост. На самом деле это не так, поскольку для обеих ситуаций запрос на index.html всегда отправляется в первую очередь. И он возвращается сразу, прежде чем я отправлю остальные запросы на выборку. Таким образом, клиент должен уже знать, что сервер уже установил поддержку активности
  • 0
    Привет, я отредактировал свой ответ, если хотите, попробуйте этот код и дайте мне знать, что происходит

Ещё вопросы

Сообщество Overcoder
Наверх
Меню