Постоянное HTTP-соединение
HTTP |
---|
![]() |
Методы запроса |
Поля заголовка |
Коды статуса ответа |
Методы безопасного контроля доступа |
Уязвимости безопасности |
HTTP Постоянное соединение , также называемое поддержанием активности HTTP или повторным использованием соединения HTTP , представляет собой идею использования одного TCP- соединения для отправки и получения нескольких HTTP-запросов /ответов, а не открытия нового соединения для каждой отдельной пары запрос/ответ. Новый протокол HTTP/2 использует ту же идею и развивает ее, позволяя мультиплексировать несколько одновременных запросов/ответов по одному соединению.
Операция
[ редактировать ]HTTP 1.0
[ редактировать ]В HTTP 1.0 соединения всегда должны закрываться сервером после отправки ответа. [ 1 ]
По крайней мере, с конца 1995 г. [ 2 ] разработчики популярных продуктов (браузеров, веб-серверов и т. д.), использующих HTTP/1.0, начали добавлять неофициальное расширение (к протоколу) под названием «keep-alive», чтобы разрешить повторное использование соединения для нескольких запросов/ответов. [ 3 ] [ 4 ]
Если клиент поддерживает поддержку активности, он добавляет к запросу дополнительный заголовок:
Connection: keep-alive
Когда сервер получает этот запрос и генерирует ответ, если он поддерживает поддержку активности, он также добавляет к ответу тот же заголовок, что и выше. После этого соединение не разрывается, а остается открытым. Когда клиент отправляет другой запрос, он использует то же соединение.
Это будет продолжаться до тех пор, пока клиент или сервер не решат, что разговор окончен, и в этом случае они опускают "Connection:"
заголовок из последнего отправленного сообщения или, лучше, к нему добавляют ключевое слово «закрыть»:
Connection: close
После этого соединение закрывается по заданным правилам.
С 1997 года различные версии спецификаций HTTP/1.1 признавали использование этого неофициального расширения и включали несколько предостережений относительно совместимости между клиентами/серверами HTTP/1.0 (поддержание активности) и HTTP/1.1. [ 5 ]
HTTP 1.1
[ редактировать ]В HTTP 1.1 все соединения считаются постоянными, если не указано иное. [ 5 ] HTTP Постоянные соединения не используют отдельные сообщения проверки активности, они просто позволяют нескольким запросам использовать одно соединение. Однако время ожидания соединения по умолчанию для Apache httpd 1.3 и 2.0 составляет всего 15 секунд. [ 6 ] [ 7 ] и всего 5 секунд для Apache httpd 2.2 и выше. [ 8 ] [ 9 ] Преимущество короткого тайм-аута заключается в возможности быстро доставлять несколько компонентов веб-страницы, не потребляя при этом ресурсы для слишком длительного запуска нескольких серверных процессов или потоков. [ 10 ]
Keepalive с фрагментированной кодировкой передачи
[ редактировать ]Keepalive затрудняет клиенту определение того, где заканчивается один ответ и начинается следующий ответ, особенно во время конвейерной операции HTTP. [ 11 ] Это серьезная проблема, когда Content-Length
невозможно использовать из-за потоковой передачи. [ 12 ] Чтобы решить эту проблему, в HTTP 1.1 было введено фрагментированное кодирование передачи , определяющее last-chunk
кусочек. [ 13 ] last-chunk
бит устанавливается в конце каждого ответа, чтобы клиент знал, где начинается следующий ответ.
Преимущества
[ редактировать ]- Уменьшена задержка при последующих запросах (без подтверждения связи и медленного запуска ).
- Снижение использования ЦП и количества циклов передачи данных из-за меньшего количества новых подключений и подтверждений TLS .
- Включает HTTP-конвейерную обработку запросов и ответов.
- Уменьшение перегрузки сети (меньше TCP-соединений ).
- Об ошибках можно сообщать без наказания за закрытие TCP-соединения.
Согласно RFC 7230, раздел 6.4 , «клиент должен ограничивать количество одновременных открытых подключений, которые он поддерживает к данному серверу». В предыдущей версии спецификации HTTP/1.1 были указаны конкретные максимальные значения , но, по словам RFC 7230, «это оказалось непрактичным для многих приложений... вместо этого... будьте осторожны при открытии нескольких соединений». Эти рекомендации предназначены для уменьшения времени ответа HTTP и предотвращения перегрузок. Если конвейерная обработка HTTP реализована правильно, дополнительные соединения не принесут никакого выигрыша в производительности, а дополнительные соединения могут вызвать проблемы с перегрузкой. [ 14 ]
Недостатки
[ редактировать ]Если клиент не закрывает соединение после получения всех необходимых ему данных, ресурсы, необходимые для поддержания соединения на сервере открытым, будут недоступны для других клиентов. Насколько это повлияет на доступность сервера и как долго ресурсы будут недоступны, зависит от архитектуры и конфигурации сервера.
Также может возникнуть состояние гонки , когда клиент отправляет запрос на сервер в то же время, когда сервер закрывает TCP-соединение. [ 15 ] Сервер должен отправить клиенту код состояния 408 Request Timeout непосредственно перед закрытием соединения. Когда клиент получает код состояния 408, после отправки запроса он может открыть новое соединение с сервером и повторно отправить запрос. [ 16 ] Не все клиенты повторно отправят запрос, а многие из них сделают это только в том случае, если запрос имеет идемпотентный метод HTTP .
Использование в веб-браузерах
[ редактировать ]
Все современные веб-браузеры, включая Google Chrome , Firefox , Internet Explorer (начиная с 4.01), Opera (начиная с 4.0). [ 17 ] и Safari используют постоянные соединения.
По умолчанию Internet Explorer версий 6 и 7 использует два постоянных соединения, а версия 8 — шесть. [ 18 ] Время ожидания постоянных подключений истекает через 60 секунд бездействия, которое можно изменить через реестр Windows. [ 19 ]
В Firefox количество одновременных подключений можно настроить (на сервер, на прокси, общее). Время постоянного соединения истекает через 115 секунд (1,92 минуты) бездействия, которое можно изменить в конфигурации. [ 20 ]
Выполнение
[ редактировать ]Python requests
библиотека содержит requests.Session()
, который устанавливает постоянное HTTP-соединение, тем самым позволяя повторно использовать базовое TCP-соединение, что может привести к значительному увеличению производительности. [ 21 ]
См. также
[ редактировать ]- Конвейерная обработка HTTP , благодаря которой можно отправлять несколько запросов, не дожидаясь ответа.
- HTTP/2 , который обеспечивает конвейерную обработку запросов и ответов вне очереди, а также прогнозирующую отправку контента до того, как он будет запрошен.
Ссылки
[ редактировать ]- ^ Протокол передачи гипертекста (HTTP/1.0): общая работа
- ^ Гилдор, Дэн. "HTTP_Соединение?" . Группы Google . Проверено 17 ноября 2023 г.
- ^ «Руководство по TCP/IP — Установление, управление и завершение постоянного соединения HTTP» . www.tcpipguide.com . Архивировано из оригинала 21 мая 2017 г. Проверено 31 декабря 2017 г.
- ^ Дэвид Горли; Брайан Тотти; Марджори Сэйер; Аншу Аггарвал; Сайлу Редди (2002). HTTP: Полное руководство. (отрывок из главы: «Постоянные соединения») . О'Рейли Медиа, Inc. ISBN 9781565925090 . Проверено 18 октября 2021 г.
- ^ Jump up to: а б Протокол передачи гипертекста (HTTP/1.1): синтаксис и маршрутизация сообщений, постоянство
- ^ «HTTP-сервер Apache 1.3 — директива KeepAliveTimeout» . Архивировано из оригинала 26 октября 2015 г. Проверено 28 января 2015 г.
- ^ Apache HTTP Server 2.0 – Директива KeepAliveTimeout
- ^ Apache HTTP Server 2.2 – Директива KeepAliveTimeout
- ^ Apache HTTP Server 2.4 – Директива KeepAliveTimeout
- ^ Несколько (вики). «Httpd/KeepAlive» . Докфорж . Архивировано из оригинала 6 января 2010 года . Проверено 30 января 2010 г.
- ^ «HTTP: Какова связь между конвейерной обработкой, сохранением активности и событиями, отправленными сервером» .
- ^ «Потоковая передача HTTP (или фрагментация или сохранение и пересылка)» .
- ^ «Частное кодирование передачи» . Июнь 1999 года.
- ^ Нильссен, Фристик Хенрик; Геттис, Джеймс; Бэрд-Смит, Ансельм; Прюдоммо, Эрик; Виум Ли, Хокон; Лилли, Крис (октябрь 1997 г.), «Влияние HTTP/1.1, CSS1 и PNG на производительность сети» , Обзор компьютерных коммуникаций ACM SIGCOMM , 27 (4), ISSN 0146-4833
- ^ «Как браузеры обрабатывают состояние гонки поддержки активности HTTP?» . Переполнение стека . 6 марта 2017 г.
- ^ Филдинг, Рой Т.; Решке, Джулиан (июнь 2014 г.). Филдинг, Р.; Решке, Дж. (ред.). «Протокол передачи гипертекста (HTTP/1.1): семантика и контент» . Трекер данных IETF . дои : 10.17487/RFC7231 . S2CID 14399078 .
- ^ «Обновление файлового обмена Opera 4.0: включает HTTP 1.1» . Программное обеспечение Опера. 28 марта 2000 г. Проверено 8 июля 2009 г.
- ^ «IE8 ускоряет работу» . Stevesouders.com. 10 марта 2008 г. Проверено 17 июля 2009 г.
- ^ «Как изменить значение времени ожидания активности по умолчанию в Internet Explorer» . Майкрософт. 27 октября 2007 г. Проверено 17 июля 2009 г.
- ^ «Network.http.keep-alive.timeout» . Mozillazine.org . Проверено 17 июля 2009 г.
- ^ «Запросы.AdvancedUsage.SessionObjects» . ©MMXVIX. Проект Кеннета Рейца . Проверено 22 апреля 2023 г.