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

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

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

Функциональность

[править | править код]

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

Connection: Keep-Alive

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

Connection: Keep-Alive

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

При работе по 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, Дата обращения: 15 сентября 2012
  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 года.