HTTP 1.1 Стабильная версия
Спустя год после появления на свет HTTP 1.0, RFC 1945, в январе 1997 года выходит новая версия протокола HTTP 1.1, RFC 2068. На самом деле нововведений, особенно если спускаться до деталей, много, ниже мы отметим некоторые важные из них.
В стандарте HTTP 1.1, правда в уже обновленной версии RFC 2616 от июня 1999 года, прямым текстом описывается необходимость (или мотивация) новой версии. Как выяснилось, прошлая версия протокола HTTP/1.0 недостаточно учитывала влияние иерархических прокси-серверов, кэширования, необходимости постоянных подключений и виртуальных хостов.
К тому же существовала еще одна проблема, не все веб-приложения стремились реализовывать полноценную поддержку нового протокола. Некоторые веб-приложения, можно сказать, по-прежнему называли себя «HTTP/1.0». Это потребовало некоторых дополнительных изменений в протоколе, чтобы два взаимодействующих приложения могли определить истинные возможности друг друга.
Кэширование
Версия HTTP 1.0 уже поддерживала кэширование, но имелись несовершенства. Например, заголовок If-Modified-Since использовал абсолютные метки времени, поэтому возможны были проблемы из-за несоответствий с синхронизацией времени. Чтобы решить эту проблему, был добавлен новый заголовок ETag для валидации кеша. Это потянуло за собой добавление других условных заголовков: If-None-Match, If-Match, If-Unmodifed-Since и If-Range.
Появился HTTP-заголовок Vary, который отправлялся в ответ клиенту и давал указание любым промежуточным кешам кэшировать отдельный экземпляр.
Также был добавлен механизм Cache-control, который определял политику кэширования.
Виртуальные хосты
Хотя заголовок Host появился еще в НТТР 1.0, тогда официально он не требовался, в то время как версия HTTP 1.1 требует этого по спецификации. Заголовок Host важен для маршрутизации сообщений через прокси-серверы, позволяет различать домены, которые указывают на один и тот же IP-адрес.
Однако вместе с таким улучшением добавились и некоторые проблемы безопасности, например, Host header injection может привести к Web Cache Poisoning, ложные перенаправлениям URL и другим последствия.
Постоянные соединения
Переиспользование TCP-соединения дает множество преимуществ, например: открывая и закрывая меньше TCP-соединений, экономится время работы процессора, память, используемая для блоков управления протоколом TCP; снижается нагрузка на сеть за счет уменьшения количества пакетов, вызванных открытием TCP; и прочее.
HTTP-заголовок Keep-Alive, позволяет переиспользовать текущие открытое соединение для отправки HTTP запросов и получения ответов, а не создавать новое соединение каждый раз.
HTTP-запросы и ответы могут быть конвейеризированы по соединению. Эта особенность называется HTTP Pipelining. Конвейерная обработка позволяет клиенту делать несколько запросов, не дожидаясь каждого ответа, что позволяет использовать одно TCP-соединение гораздо эффективнее и с гораздо меньшими затратами времени.
Сопроводительные материалы
— HTTP Caching – HTTP 1.0 vs HTTP 1.1
— Understanding The Vary Header
— Cache Control
— Difference Between HTTP 1.0 and HTTP 1.1
— HTTP Host Header Attack: Explanation and Examples
— HTTP Keep-Alive, Pipelining, Multiplexing and Connection Pooling