HTTP-Long Polling keep-alive и рукопожатия - PullRequest
0 голосов
/ 13 мая 2018

Я делаю тест, в котором я проверяю, насколько длительный HTTP-опрос по сравнению с веб-сокетами влияет на производительность батареи на моем iPhone. По сути, у меня есть Node.js с экспресс-сервером, который отправляет случайную строку каждые 0,5 или 10-й секунды на iPhone. Я проверил сообщения в Chrome и вижу, что заголовок keep-alive присутствует. Я знаю, что keep-alive является функцией по умолчанию, начиная с HTTP / 1.1. Из того, что я понял, TCP-соединение будет оставаться открытым и может использоваться для конвейерной передачи, и это, безусловно, тот случай, когда я отправляю пинг с сервера каждые 0,5 секунды. Но когда я отправляю каждые 10 секунд, будет ли закрыто соединение в течение этого времени?

  1. Как узнать, как долго открыто соединение? Кажется, это важная часть, которую нужно иметь в виду при проведении тестов.

  2. Будет ли HTTP-рукопожатие все еще выполняться при открытом TCP-соединении?

1 Ответ

0 голосов
/ 13 мая 2018

AFAIK, в HTTP 1 сервер не может отправить ответ обратно клиенту, если этот клиент не отправил запрос первым. Это может показаться неуместным для вашего вопроса, но терпите меня.

Заголовок Connection: keep-alive сообщает клиенту, что он can повторно использует соединение, если он этого хочет, а не must. Клиент может решить закрыть его в любое время, все зависит от реализации клиентской библиотеки, и у вас нет никаких гарантий.

Единственный способ заставить клиента не закрывать соединение - не завершить ответ. Единственный способ сделать это - отправить ответ с Transfer-Encoding: chunked и никогда не отправлять окончательный фрагмент (это имеет некоторые серьезные предостережения, например переполнение буфера на клиенте ...).

Итак, чтобы ответить на ваши 2 пункта:

  1. Вы не можете, эта низкоуровневая деталь полностью скрыта (по уважительным причинам) от клиента.
  2. Нет HTTP-рукопожатия, есть TCP рукопожатие, которое выполняется, когда клиентский сокет соединяется с серверным сокетом. Существует рукопожатие TLS , которое выполняется после соединения TCP и перед выполнением любого запроса. Как только соединение открыто, клиент отправляет http-запросы, а сервер отвечает ресурсами.
...