Sobes.tech
Junior

Разкажете за версиите на HTTP и техните разлики.

sobes.tech AI

Отговор от AI

Основни версии на HTTP:

  • HTTP/0.9: Основна версия за пренос на прости HTML документи. Поддържаше само метода GET, липсваха заглавия и статуси на отговорите.
  • HTTP/1.0: Въвежда поддръжка на заглавия (Content-Type, User-Agent), методи POST и HEAD, както и статуси на отговорите. Свързването се затваряше след всеки заявка/отговор.
  • HTTP/1.1: Значителни подобрения:
    • Постоянни връзки (Persistent Connections) - повторно използване на TCP връзка за няколко заявки.
    • Пайплайнинг - изпращане на няколко заявки без да се чака отговор (макар и зле реализирано и рядко използвано).
    • Виртуални хостове (Host header).
    • Частични GET заявки (Range header).
    • Кеширане (Cache-Control, ETag, Last-Modified).
    • Методи PUT и DELETE.
  • HTTP/2: Базиран на SPDY от Google. Основни разлики:
    • Бинарен протокол - по-ефективно парсиране.
    • Мултиплексинг - паралелна предавка на няколко заявки/отговори по една TCP връзка. Премахва проблема "head-of-line blocking" на HTTP/1.1 pipelining.
    • Компресия на заглавията (HPACK) - намаляване на размера на предаваните данни.
    • Приоритизация (Server Push) - сървърът може да изпрати ресурси, които вероятно ще са необходими на клиента, преди да ги поиска.
  • HTTP/3: Основава се на UDP протокол (с използване на QUIC - Quick UDP Internet Connections) вместо TCP. Насочен към подобряване на производителността, особено в нестабилни мрежи:
    • Отстраняване на "head-of-line blocking" на ниво връзка TCP. Ако един пакет се загуби в TCP, всички следващи пакети се блокират до повторната му доставка. В QUIC (и HTTP/3) се блокира само потокът, към който принадлежи загубеният пакет.
    • По-бързо установяване на връзка (0-RTT или 1-RTT).
    • QUIC включва свои механизми за контрол на потока и надеждност.

Основните разлики в таблицата:

Функция HTTP/1.0 HTTP/1.1 HTTP/2 HTTP/3
Протокол TCP TCP TCP UDP (QUIC)
Формат Текстов Текстов Бинарен Бинарен
Основна връзка Краткотрайна Постоянна Постоянна (мултиплексинг) Постоянна (QUIC стриймове)
Мултиплексинг Не Описан (Pipelining) Да Да
Компресия на заглавия Не Не HPACK QPACK (в QUIC)
Server Push Не Не Да Да
HOL блокиране (TCP) Да (на ниво заявка) Да (на ниво заявка) Да (на ниво връзка) Не (на ниво поток)

Пример за заявка в HTTP/1.1:

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: curl/7.64.1
Accept: */*

Пример за заявка в HTTP/2 (концептуално, в бинарен формат):

// Заявка 1: Получаване на /index.html
// :method = GET
// :path = /index.html
// :authority = www.example.com

// Заявка 2: Получаване на /style.css
// :method = GET
// :path = /style.css
// :authority = www.example.com
// ...паралелно по една връзка