Уточнение заголовка Keep-alive

106

Меня попросили создать сайт, и один из соразработчиков сказал мне, что мне нужно включить заголовок keep-alive.

Я много читал об этом, но у меня остались вопросы.

msdn ->

Открытое соединение повышает производительность, когда клиент делает несколько запросов на содержимое веб-страницы, поскольку сервер может быстрее возвращать содержимое для каждого запроса. В противном случае сервер должен открывать новое соединение для каждого запроса.

Смотря на

введите описание изображения здесь

  • Когда МПМ (F) посылает keep aliveзаголовок ( или пользователь отправляет поддержания активности ), это означает , что ( E, C, B) , кроме соединения , который предназначен только для моей сессии?
  • Где хранится эта информация ( «это соединение принадлежит« Ройи » )?
  • Означает ли это, что никто другой не может использовать это соединение
  • Если да - значит ли это, что keep alive-header - уменьшить количество пользователей с перекрывающимся подключением?
  • если да, то как долго сохраняется соединение со мной? (другими словами, если я установлю keep alive - «держать» до какого момента?)

ps для интересующихся:

нажатие на эту страницу-образец вернет заголовок keep alive

Ройи Намир
источник
2
Пффф, я видел это на лекции, но не совсем уверен. Я думал, что keep-alive был только на сервере и у пользователя. В конце концов, все, что находится между ними, даже не должно знать, что это HTTP, не говоря уже о заголовках.
Noctua
Заявление, цитируемое MSDN, является чушью. Это клиент, который должен открыть новое соединение, если нет поддержки активности.
Маркиз Лорн,
А если вы создаете сайт, а не веб-сервер или клиент, заголовок keepalive уже создан за вас.
Marquis of Lorne

Ответы:

144

Где хранится эта информация («это соединение между компьютером Aи сервером F»)?

TCP-соединение распознается по исходному IP-адресу и порту, а также по IP-адресу и порту назначения. Ваша ОС, все промежуточные устройства, поддерживающие сеанс, и ОС сервера распознают это соединение.

HTTP работает с запросом-ответом: клиент подключается к серверу, выполняет запрос и получает ответ. Без поддержки активности соединение с HTTP-сервером закрывается после каждого ответа. С HTTP keep-alive вы держите базовое TCP-соединение открытым до тех пор, пока не будут выполнены определенные критерии.

Это позволяет использовать несколько пар запрос-ответ по одному TCP-соединению, устраняя некоторые из относительно медленных запусков TCP-соединения.

Когда IIS (F) отправляет заголовок keep alive (или пользователь отправляет keep-alive), означает ли это, что (E, C, B) сохраняют соединение

Нет. Маршрутизаторам не нужно запоминать сеансы. Фактически, несколько пакетов TCP, принадлежащих к одному сеансу TCP, не обязательно должны проходить через одни и те же маршрутизаторы - это необходимо для управления TCP. Маршрутизаторы просто выбирают лучший IP-путь и пересылают пакеты. Keep-alive используется только для клиента, сервера и любых других промежуточных устройств, поддерживающих сеанс.

что только для моей сессии?

Означает ли это, что никто другой не может использовать это соединение

Это предназначение TCP-соединений : это сквозное соединение, предназначенное только для этих двух сторон.

Если да - значит ли это, что keep alive-header - уменьшить количество пользователей с перекрывающимся подключением?

Определите «перекрывающиеся соединения». См. Постоянное соединение HTTP, чтобы узнать о некоторых преимуществах и недостатках, например:

  • Снижение использования ЦП и памяти (поскольку одновременно открыто меньше соединений).
  • Включает конвейерную обработку запросов и ответов HTTP.
  • Уменьшение перегрузки сети (меньше TCP-соединений).
  • Уменьшена задержка при последующих запросах (без квитирования).

если да, то как долго сохраняется соединение со мной? (другими словами, если я установлю keep alive - «держать» до какого момента?)

Типичный ответ keep-alive выглядит так:

Keep-Alive: timeout=15, max=100

См., Например, заголовок Keep-Alive протокола передачи гипертекста (HTTP) (черновик для HTTP / 2, где заголовок keep-alive объяснен более подробно, чем 2616 и 2086 ):

  • Хост устанавливает значение timeoutпараметра равным времени, в течение которого хост позволяет незанятому соединению оставаться открытым, прежде чем оно будет закрыто. Соединение бездействует, если хост не отправляет и не принимает данные.

  • maxПараметр указывает максимальное количество запросов , которые клиент будет делать, или что сервер позволит сделать на постоянной связи. После отправки указанного количества запросов и ответов хост, включивший параметр, может закрыть соединение.

Однако сервер может закрыть соединение после произвольного времени или количества запросов (до тех пор, пока он возвращает ответ на текущий запрос). Как это реализовано, зависит от вашего HTTP-сервера.

CodeCaster
источник
Определите "перекрывающиеся соединения" ----> Я имею в виду одновременно. (и я думаю, что количество одновременных подключений будет уменьшено, потому что, как вы сказали: «соединение X зарезервировано для Джона, потому что оно использует заголовок keep-alive». Я прав?
Рой Намир
1
Итак, вы говорите, что если сервер может обрабатывать 100 подключений одновременно, и все эти подключения используют keep-alive, то 101-е соединение будет сброшено ???
Рой Намир
1
@Royi, нет, я не знаю, сколько поддерживающих соединений браузер устанавливает с данным хостом, и я не имел в виду, что браузер откроет только один. Количество одновременно выполняемых запросов ограничено и зависит от браузера . Я имел в виду, что если браузер использует поддерживающие соединения, он может вместо того, чтобы запускать Nзапросы через Nсоединения (поскольку по умолчанию соединение закрывается после каждого ответа), например, запускать Nзапросы поверх N / Mили даже просто Mсоединения, потому что он может запускать несколько запросов поверх каждое открытое соединение, поэтому можно использовать меньше.
CodeCaster
1
Я знаю это. (:-)) вы сказали в своем комментарии: клиент будет делать меньше одновременных подключений при использовании keep-alive, он будет запускать запросы последовательно, а не параллельно . Я просто не понимаю, как это связано с keepalive.
Рой Намир,
5
E, C, B не сохраняют сеансы. Это маршрутизаторы, у них нет таблицы сеансов, и в них нет необходимости, потому что несколько пакетов из одного сеанса TCP клиент-сервер могут следовать по разным путям. Роль маршрутизатора состоит в том, чтобы выбрать лучший IP-путь и соответствующим образом пересылать пакет, чтобы он не поднимался на транспортный уровень (TCP / UDP) и не переходил на уровень приложения, чтобы увидеть заголовок проверки активности. Так что в принципе поддержания активности явно между клиентом и сервером, и неявно позволяет сеанса осведомленные устройства -EG firewalls- открыт для этой явной сессии клиент-сервер
Амин Kadimi