Постоянное 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]
ПримечанияПравить
- ↑ Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing, Persistence (неопр.). Дата обращения: 1 ноября 2015. Архивировано 14 декабря 2016 года.
- ↑ Apache HTTP Server 1.3 — KeepAliveTimeout Directive (неопр.). Дата обращения: 1 ноября 2015. Архивировано 26 октября 2015 года.
- ↑ Apache HTTP Server 2.0 — KeepAliveTimeout Directive (неопр.). Дата обращения: 1 ноября 2015. Архивировано 31 октября 2015 года.
- ↑ Apache HTTP Server 2.2 — KeepAliveTimeout Directive (неопр.). Дата обращения: 15 сентября 2012. Архивировано 22 мая 2014 года.
- ↑ Apache HTTP Server 2.4 — KeepAliveTimeout Directive (неопр.). Дата обращения: 1 ноября 2015. Архивировано 31 октября 2015 года.
- ↑ Multiple (wiki). Httpd/KeepAlive (неопр.) (недоступная ссылка — история). Docforge. Дата обращения: 30 января 2010. Архивировано 30 октября 2012 года.
- ↑ 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> Архивная копия от 17 февраля 2011 на Wayback Machine
- ↑ Opera 4.0 Upgrades File Exchange: Includes HTTP 1.1 (неопр.). Opera Software (28 марта 2000). Дата обращения: 8 июля 2009. Архивировано из оригинала 10 сентября 2010 года.
- ↑ IE8 speeds things up (неопр.). Stevesouders.com (10 марта 2008). Дата обращения: 17 июля 2009. Архивировано 10 августа 2009 года.
- ↑ How to change the default keep-alive time-out value in Internet Explorer (неопр.). Microsoft (27 октября 2007). Дата обращения: 17 июля 2009. Архивировано 22 июля 2009 года.
- ↑ Network.http.keep-alive.timeout (неопр.). Mozillazine.org. Дата обращения: 17 июля 2009. Архивировано 8 июня 2009 года.