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

Постоянное 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 секунд (1.9166666666666666 минут) простоя, что настраивается в конфигурации.[11]

Примечания править

  1. Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing, Persistence. Дата обращения: 1 ноября 2015. Архивировано 14 декабря 2016 года.
  2. Apache HTTP Server 1.3 — KeepAliveTimeout Directive. Дата обращения: 1 ноября 2015. Архивировано 26 октября 2015 года.
  3. Apache HTTP Server 2.0 — KeepAliveTimeout Directive. Дата обращения: 1 ноября 2015. Архивировано 31 октября 2015 года.
  4. Apache HTTP Server 2.2 — KeepAliveTimeout Directive. Дата обращения: 15 сентября 2012. Архивировано 22 мая 2014 года.
  5. Apache HTTP Server 2.4 — KeepAliveTimeout Directive. Дата обращения: 1 ноября 2015. Архивировано 31 октября 2015 года.
  6. Multiple (wiki). Httpd/KeepAlive. Docforge. Дата обращения: 30 января 2010. Архивировано из оригинала 30 октября 2012 года.
  7. Nielssen, Frystyk Henryk; Gettys, James; Baird-Smith, Anselm; Prud’hommeaux, Eric; Wium Lie, Håkon; Lilley, Chris (October 1997), "Network Performance Effects of HTTP/1.1, CSS1, and PNG", Computer Communication Review, 27 (4), ISSN 0146-4833 Архивная копия от 17 февраля 2011 на Wayback Machine
  8. Opera 4.0 Upgrades File Exchange: Includes HTTP 1.1. Opera Software (28 марта 2000). Дата обращения: 8 июля 2009. Архивировано из оригинала 10 сентября 2010 года.
  9. IE8 speeds things up. Stevesouders.com (10 марта 2008). Дата обращения: 17 июля 2009. Архивировано 10 августа 2009 года.
  10. How to change the default keep-alive time-out value in Internet Explorer. Microsoft (27 октября 2007). Дата обращения: 17 июля 2009. Архивировано 22 июля 2009 года.
  11. Network.http.keep-alive.timeout. Mozillazine.org. Дата обращения: 17 июля 2009. Архивировано 8 июня 2009 года.

Ссылки править