В чём разница между HTTP 1.0, 1.1 и 2.0?

«В чём разница между HTTP 1.0, 1.1 и 2.0?» — вопрос из категории Сети, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Как DevOps-инженер, я часто настраиваю веб-серверы и балансировщики нагрузки, поэтому понимание различий критично для оптимизации.

HTTP/1.0 — базовая версия. Каждое TCP-соединение обрабатывает один запрос-ответ, затем закрывается. Это создаёт большую нагрузку при загрузке страниц с множеством ресурсов. Отсутствие обязательного заголовка Host осложняет работу виртуальных хостов на одном IP.

HTTP/1.1 — стандарт долгие годы, с ключевыми улучшениями для DevOps:

  • Постоянные соединения (Keep-Alive): Одно TCP-соединение может использоваться для нескольких запросов, снижая задержки.
  • Обязательный заголовок Host: Основа для виртуального хостинга.
  • Чанкованная передача (Chunked Transfer Encoding): Позволяет отправлять ответы, размер которых неизвестен заранее (потоковая передача).
  • Кэширование: Более совершенные механизмы через заголовки Cache-Control, ETag.
  • Конвейеризация (Pipelining): Теоретически позволяет отправлять несколько запросов без ожидания ответов, но на практике редко используется из-за проблем с блокировкой заголовка (Head-of-line blocking).

HTTP/2 — бинарный протокол, революция в производительности:

  • Мультиплексирование: Множество запросов и ответов могут передаваться параллельно в рамках одного соединения, решая проблему блокировки.
  • Приоритизация потоков: Клиент может указать, какие ресурсы важнее (например, CSS перед изображениями).
  • Server Push: Сервер может proactively отправить ресурсы (например, стили, скрипты) клиенту, которые, как он знает, понадобятся. В Nginx это настраивается директивой http2_push.
  • Сжатие заголовков HPACK: Значительно уменьшает накладные расходы.

DevOps-практика: При настройке Nginx/Apache для использования HTTP/2 необходимо также настроить TLS (HTTP/2 over TLS обязателен для браузеров). Мониторинг с помощью инструментов вроде nghttp2 помогает анализировать эффективность.