HTTP/3 — это мажорная версия протокола HTTP, основанная на QUIC вместо TCP.
Особенности и преимущества:
Использование QUIC: Вместо TCP + TLS над ним, HTTP/3 работает прямо над QUIC. QUIC мультиплексирует потоки на уровне транспортного протокола и включает TLS 1.3 для шифрования.
Устранение проблемы Head-of-Line Blocking (HOLB) на уровне транспорта: ПосколькуQUIC мультиплексирует потоки, потеря пакета, относящегося к одному потоку, не блокирует доставку данных других потоков в том же соединении. Это было проблемой в HTTP/2, где смежные фреймы из разных потоков могли блокироваться из-за потери пакета на уровне TCP.
Быстрое установление соединения: QUIC объединяет установление соединения и согласование TLS, что приводит к сокращению времени задержки (latency).
Миграция соединений: QUIC использует Connection ID, позволяя клиентскому соединению оставаться активным при смене IP-адреса или порта (например, при переключении между Wi-Fi и сотовой сетью).
Улучшенная обработка потерь пакетов: QUIC использует встроенный механизм обнаружения и восстановления потерь, который может быть более эффективным, чем TCP.
Сравнение с HTTP/2:
| Особенность | HTTP/2 (над TCP) | HTTP/3 (над QUIC) |
|---|---|---|
| Транспорт | TCP + TLS | QUIC |
| HOLB | Есть на уровне TCP | Нет на уровне QUIC |
| Установление соед | TCP handshake + TLS handshake | Одно RTT (при повторном подключении может быть 0-RTT) |
| Миграция соед | Нет (новое TCP соединение) | Есть (через Connection ID) |
| Мультиплексинг | На уровне приложения (фреймы в TCP потоке) | На уровне транспорта (QUIC потоки) |
Реализация в Go:
Стандартная библиотека net/http поддерживает HTTP/3 начиная с версии Go 1.21 экспериментально. Для полноценной поддержки обычно используются zewnętrzne библиотеки, такие как quic-go, интегрированные с net/http.
Пример использования (на клиентской стороне сquic-go):
go