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
// ...паралелно по една връзка