HTTP Keep Alive

Частичный перевод статьи по адресу: http://www.io.com/~maus/HttpKeepAlive.html.

Судя по всему, Http Keep-Alive много кто понимает ошибочно. Вот короткое описание механизма его работы, как в версии протокола 1.0, так и 1.1, с некоторой дополнительной информацией о работе с ним в java.

Http работает в рамках, так называемой парадигмы «запрос-ответ». Это означает что клиент генерирует запрос информации и передает его серверу, который на него отвечает. В оригинальной реализации протокола Http, каждый запрос открывает новое соединение с сервером (сокет), отсылает запрос, потом считывает из этого соединения данные, чтобы получить ответ.

Такая схема имеет одно большое достоинство — она проста. Её просто описать, просто понять, просто использовать. Также у неё есть один большой недостаток — она медленная. Поэтому для http были разработаны соединения keep-alive.

HTTP/1.0

В рамках протокола HTTP 1.0, нет официальной спецификации по работе с keepalive.
Оно было, по сути, прикреплено к существующему протоколу. Если браузер поддерживает keep-alive, он добавляет дополнительный заголовок в запрос:

Connection: Keep-Alive

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

Connection: Keep-Alive

Следуя этому, соединение НЕ закрывается, а, напротив, поддерживается открытым.
Когда клиент отправляет следующий запрос, он использует то же соединение. Это происходит до тех пор, пока клиент или сервер решит, что общение закончено и один из них закроет соединение.

HTTP/1.1

В рамках протокола HTTP 1.1, официальное действие keep-alive отличается. Все соединения поддерживаются открытыми до тех пор, пока не установлено обратного с помощью следующего заголовка:

Connection: close

Заголовок «Connection: Keep-Alive» более не имеет никакого значения в связи с этим.
Дополнительно описан необязательный заголовок «Keep-Alive:», но его значение настолько не конкретизировано, что он становится бессмысленным. Избегайте его использования.

Отсутствие гарантий

HTTP нестатичный (stateless) протокол — это означает, что каждый запрос независим от любого другого. Keep-alive не меняет этого. Кроме того, нет никаких гарантий, что клиент или сервер будет поддерживать соединение открытым. Даже в версии 1.1, все на что можно рассчитывать, что вы возможно получите уведомление о том, что соединение будет закрыто. Так что keep-alive, это не то, на что вы можете рассчитывать, когда пишете приложение.

KeepAlive и POST

Спецификация HTTP 1.1 определяет следующее относительно тела POST-запроса, после него не должно быть никаких дополнительных символов. Она также утверждает, что «некоторые» браузеры могут не следовать этой спецификации, помещая CRLF (символы возврата каретки и следующей строки, carriage return и line feed) после тела POST-запроса. Ага. Насколько я могу сказать, большинство браузеров следуют вставке CRLF после тела POST-запроса. Есть два способа обращения с этим: Запретить keepalive в контексте POST запросов, либо игнорировать CRLF в соединении самостоятельно. Большинство серверов используют второй способ, но нет возможности сказать точно, не проверив.
<...>

Дальше я переводить не стал — там про java, а я нихтфирштейн.

  • Мой сервер генерирует такие, судя по Вашей статье, взаимоисключающие строчки

    HTTP/1.1 200 OK

    Connection: keep-alive

    Как убрать из http — заголовка

    Connection: keep-alive ?

    Есть способ?

    • doctor-lg

      Статья собственно не моя, я просто перевел, да и то не всю. Кстати строчки не исключающие — там написано, что Keep-alive не является обязательным заголовком и мало на что влияет. Но проблему вашу решить просто — укажите в файле конфигурации Apache (как правило это httpd.conf) строчку

      KeepAlive off

      Вот ссылка на документацию: 

      http://httpd.apache.org/docs/1.3/mod/core.html

  • Keynckisknips

    Привет всем! Класный форум! =)

    • doctor-lg

      Привет! Это не форум, а мой блог, но я всегда рад обсудить записи в нем :)

  • Eugen

    Полезная статья. Спасибо! 

  • Pingback: Доклад: Оптимизация быстродействия Веб-сайта « Info for Coders()

  • wer4ty

    задайте мне вопрос profun.name/wer4ty