Ответ
HTTP/2 был разработан для решения проблем производительности HTTP/1.1. Основные различия можно представить в виде таблицы:
| Характеристика | HTTP/1.1 | HTTP/2 |
|---|---|---|
| Формат передачи | Текстовый. Легко читается человеком. | Бинарный. Компактный и эффективный для парсинга машиной. |
| Мультиплексирование | Отсутствует. Запросы обрабатываются последовательно. Для параллелизма браузеры открывают несколько TCP-соединений (обычно до 6). | Поддерживается. Множество запросов и ответов могут передаваться одновременно в рамках одного TCP-соединения, не блокируя друг друга. |
| Проблема "Head-of-Line Blocking" | Присутствует. Если первый запрос в очереди "завис", он блокирует все последующие в том же соединении. | Решена на уровне протокола. Благодаря мультиплексированию, "зависший" запрос не мешает обработке других. |
| Сжатие заголовков | Отсутствует (или минимальное). Заголовки передаются как обычный текст, что создаёт избыточность. | HPACK. Используется эффективный алгоритм сжатия, который значительно уменьшает размер передаваемых заголовков. |
| Server Push | Отсутствует. Клиент должен сам запросить все необходимые ресурсы (CSS, JS, картинки). | Поддерживается. Сервер может "проактивно" отправлять клиенту ресурсы, которые, по его мнению, скоро понадобятся, не дожидаясь запроса. |
Итог
Переход на HTTP/2 обеспечивает:
- Ускорение загрузки страниц за счёт мультиплексирования и сжатия заголовков.
- Снижение нагрузки на сервер благодаря использованию одного TCP-соединения на пользователя.
- Более эффективное использование сетевых ресурсов.
Стандартная библиотека Go (net/http) имеет встроенную прозрачную поддержку HTTP/2, что упрощает его внедрение в бэкенд-приложениях.
Ответ 18+ 🔞
А, слушай, смотри, вот эта вся история с HTTP/2 — это ж просто пиздец какой-то прорыв, если честно. Ну как так-то, блядь? Сидели же на HTTP/1.1, как обезьяны на суку, и мучались.
Представь себе, как это было раньше, в эпоху HTTP/1.1:
- Формат передачи — текстовый. Ну, типа, читабельно для человека, если ты, конечно, ебанутый и хочешь глазами смотреть на поток сырых запросов. А для машины — сплошное говно, парсить эту простыню текста.
- Мультиплексирование — нихуя. Ноль. Запросы идут друг за другом, как в очереди за колбасой в девяностые. Чтобы хоть как-то ускориться, браузеры открывали аж по 6 TCP-соединений одновременно! Это ж какой овердохуища overhead, блядь! Каждое соединение — это рукопожатия, настройки, слезы.
- Проблема "Head-of-Line Blocking" — вот это вообще пиздец. Один запрос, сука, затупил где-то на сервере (или просто большой), и всё, блядь, вся очередь за ним встала колом. Как будто один мудак на кассе карточкой не может расплатиться, а за ним уже пол-универсама стоит и матерится.
- Сжатие заголовков — да какое там сжатие! Каждый раз одно и то же:
Host:,User-Agent:,Accept-*— и всё это текстом, десятки, сотни байт лишних. Каждый раз! Ядрёна вошь!
А теперь, ёпта, приходит HTTP/2 и начинает всех ебашить по-взрослому:
- Формат передачи — бинарный. Всё, пиши пропало. Для человека нечитаемо, зато машина жрёт это как горячие пирожки. Компактно, быстро, эффективно.
- Мультиплексирование — ДА, БЛЯДЬ, ЕСТЬ! Это же главная фишка! Все запросы и ответы летят в одном TCP-соединении, но параллельно, не мешая друг другу. Как будто из одной трубы вылетает сразу куча разноцветных шариков, и каждый знает, куда ему. Красота!
- Проблема "Head-of-Line Blocking" — РЕШЕНА НАХУЙ! Один запрос застрял? Да и хуй с ним! Остальные пролетают мимо, как будто его нет. Вообще волшебство.
- Сжатие заголовков — HPACK. Умный алгоритм, который не передаёт одно и то же сто раз. Сначала отправил полный заголовок, а потом только ссылки на него. Гениально и просто, как всё гениальное. Экономия — овердохуищная.
- Server Push — а это вообще магия, блядь. Сервер такой: "О, чувак, я вижу, ты запросил
index.html. Держи заодно иstyles.css, иscript.js, которые к нему прилагаются, на, не благодари". Клиенту даже просить не надо. Пизда с ушами!
Итог, блядь
Что в сухом остатке? HTTP/2 — это:
- Страницы грузятся быстрее, потому что всё летит в одном соединении и не блокируется.
- Серверу легче, потому что не нужно держать кучу соединений на каждого юзера. Одно — и в каску.
- Трафик экономнее, потому что заголовки сжаты.
А самое приколючее, что в Go, например, в стандартной библиотеке net/http эта поддержка встроена и работает прозрачно. То есть ты, по сути, нихуя не делаешь, а уже получаешь все эти плюшки. Просто берёшь и пишешь своё приложение, а оно уже на HTTP/2 летает, если клиент умеет. Вот так вот, в рот меня чих-пых, технологии шагают вперёд!