Постоянное HTTP-соединение

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
HTTP
Постоянное соединение · Сжатие · HTTPS
Методы
OPTIONS · GET · HEAD · POST · PUT · DELETE · TRACE · CONNECT · PATCH
Заголовки
Cookie · ETag · Location · Referer
DNT · X-Forwarded-For
Коды состояния
301 Moved permanently
302 Found
303 See Other
403 Forbidden
404 Not Found
451 Unavailable for Legal Reasons

Постоянное HTTP-соединение (англ. HTTP persistent connection), также называемые HTTP keep-alive или повторное использование соединений HTTP (англ. HTTP connection reuse) — использование одного TCP-соединения для отправки и получения многократных HTTP-запросов и ответов вместо открытия нового соединения для каждой пары запрос-ответ. Новый протокол HTTP/2 расширяет эту идею, позволяя одновременные многократные запросы/ответы в одном соединении.

Функциональность[править | править вики-текст]

HTTP 1.0[править | править вики-текст]

При работе по протоколу HTTP 1.0 с подобным типом соединений нет официальной спецификации. По сути, это дополнение к существующему протоколу. Если браузер поддерживает постоянные соединения, он посылает дополнительный заголовок в запросе:

Connection: Keep-Alive

Затем, когда сервер получает такой запрос и генерирует ответ, он также добавляет в заголовок ответа

Connection: Keep-Alive

После этого соединение не разрывается, а остаётся открытым. Когда клиент отправляет ещё один запрос, он использует это же соединение. Так будет продолжаться до тех пор, пока клиент или сервер не решат, что обмен окончен, и одна из сторон завершит соединение.

HTTP 1.1[править | править вики-текст]

При работе по HTTP 1.1 все соединения считаются постоянными, если не обозначено иное.[1] При этом постоянные соединения не используют сообщения keepalive, а просто позволяют передачу многократных запросов в одном и том же соединении. Тем не менее, время ожидания по умолчанию в httpd для Apache 1.3[2] и 2.0[3] составляет всего 15 секунд, а для Apache 2.2[4] и 2.4[5] лишь 5 секунд. Преимуществом короткого таймаута является возможность быстро отдать клиенту несколько компонентов веб-страницы, не блокируя при этом слишком долго в состоянии ожидания процессы или потоки сервера.[6]

Достоинства[править | править вики-текст]

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

Эти достоинства особенно проявляются для защищённых HTTPS соединений, потому что создание защищённого соединения требует больше процессорного времени и сетевого обмена между клиентом и сервером.

Согласно RFC 7230, разделу 6.4, "клиент должен ограничить количество одновременных соединений к определённому серверу". Предыдущая версия спецификации HTTP/1.1 указывала конкретные максимальные значения, но в RFC 7230 "оказалось, что это непрактично для многих приложений... вместо этого... будьте благоразумны, открывая одновременные соединения". Эти рекомендации нацелены на улучшение времени отклика по HTTP и недопущения перегрузок сети. Если конвейерная обработка HTTP реализована правильно, дополнительные соединения не улучшат производительность, но могут привести к перегрузке сети.[7]

Недостатки[править | править вики-текст]

Если клиент не закрывает соединение после того, как получил все необходимые данные, задействованные на поддержание соединения ресурсы сервера будут недоступны другим клиентам. Насколько сильно это влияет на доступность сервера, и как долго ресурсы будут заняты, зависит от архитектуры и конфигурации сервера.

Использование в веб-браузерах[править | править вики-текст]

Диаграмма обычных и постоянных соединений.

Все современные браузеры используют постоянные соединения, включая Google Chrome, Firefox, Internet Explorer (с версии 4.01), Opera (с версии 4.0)[8] и Safari.

По умолчанию Internet Explorer версий 6 и 7 открывает 2 постоянных соединения, тогда как 8 версия — 6.[9] Постоянные соединения закрываются после 60 секунд простоя, что переопределяется в реестре Windows.[10]

В Firefox количество одновременных подключений можно настроить (на сервер, на прокси, всего). Постоянные соединения закрываются после 115 секунд (около 2 минут) простоя, что настраивается в конфигурации.[11]

Примечания[править | править вики-текст]

  1. Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing, Persistence
  2. Apache HTTP Server 1.3 – KeepAliveTimeout Directive
  3. Apache HTTP Server 2.0 – KeepAliveTimeout Directive
  4. Apache HTTP Server 2.2 — KeepAliveTimeout Directive
  5. Apache HTTP Server 2.4 — KeepAliveTimeout Directive
  6. Multiple (wiki). Httpd/KeepAlive. Docforge. Проверено 30 января 2010. Архивировано из первоисточника 31 октября 2012.
  7. Nielssen, Frystyk Henryk; Gettys, James; Baird-Smith, Anselm & Prud’hommeaux, Eric (October 1997), "Network Performance Effects of HTTP/1.1, CSS1, and PNG", Computer Communication Review Т. 27 (4), ISSN 0146-4833, <http://conferences.sigcomm.org/sigcomm/1997/papers/p102.html> 
  8. Opera 4.0 Upgrades File Exchange: Includes HTTP 1.1. Opera Software (28 марта 2000). Проверено 8 июля 2009.
  9. IE8 speeds things up. Stevesouders.com (10 марта 2008). Проверено 17 июля 2009.
  10. How to change the default keep-alive time-out value in Internet Explorer. Microsoft (27 октября 2007). Проверено 17 июля 2009.
  11. Network.http.keep-alive.timeout. Mozillazine.org. Проверено 17 июля 2009.

Ссылки[править | править вики-текст]