Junior
Opowiedz o wersjach HTTP i ich różnicach.
sobes.tech AI
Odpowiedź od AI
Główne wersje HTTP:
- HTTP/0.9: Podstawowa wersja do przesyłania prostych dokumentów HTML. Obsługiwała tylko metodę
GET, brak nagłówków i statusów odpowiedzi. - HTTP/1.0: Wprowadzono obsługę nagłówków (Content-Type, User-Agent), metod
POSTiHEAD, statusów odpowiedzi. Po każdym żądaniu/odpowiedzi połączenie było zamykane. - HTTP/1.1: Znaczące ulepszenia:
- Trwałe połączenia (Persistent Connections) - ponowne użycie połączenia TCP dla wielu żądań.
- Pipelining - wysyłanie wielu żądań bez oczekiwania na odpowiedź (źle zaimplementowane i rzadko używane).
- Wirtualne hosty (nagłówek Host).
- Żądania GET częściowe (nagłówek Range).
- Pamięć podręczna (Cache-Control, ETag, Last-Modified).
- Metody PUT i DELETE.
- HTTP/2: Protokół oparty na SPDY od Google. Główne różnice:
- Protokół binarny zamiast tekstowego - bardziej wydajne parsowanie.
- Multiplexing - równoległe przesyłanie wielu żądań/odpowiedzi na jednym połączeniu TCP. Usuwa problem "head-of-line blocking" w pipelining HTTP/1.1.
- Kompresja nagłówków (HPACK) - zmniejszenie rozmiaru przesyłanych danych.
- Priorytetyzacja (Server Push) - serwer może wysłać zasoby, które prawdopodobnie będą potrzebne klientowi, zanim go o to poprosi.
- HTTP/3: Oparty na UDP (z QUIC - Quick UDP Internet Connections) zamiast TCP. Skupia się na poprawie wydajności, szczególnie w niestabilnych sieciach:
- Eliminacja "head-of-line blocking" na poziomie połączenia TCP. Jeśli pakiet zostanie utracony w TCP, wszystkie kolejne pakiety są blokowane do czasu ponownego wysłania. W QUIC (i HTTP/3) blokuje się tylko strumień, do którego należy utracony pakiet.
- Szybsze ustanawianie połączenia (0-RTT lub 1-RTT).
- QUIC zawiera własne mechanizmy kontroli przepływu i niezawodności.
Główne różnice w tabeli:
| Funkcja | HTTP/1.0 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|---|
| Protokół | TCP | TCP | TCP | UDP (QUIC) |
| Format | Tekst | Tekst | Binarny | Binarny |
| Domyślne połączenie | Tymczasowe | Stałe | Stałe (multiplexing) | Stałe (Streams QUIC) |
| Multiplexing | Nie | Imitacja (Pipelining) | Tak | Tak |
| Kompresja nagłówków | Nie | Nie | HPACK | QPACK (w QUIC) |
| Server Push | Nie | Nie | Tak | Tak |
| HOL Blocking (TCP) | Tak (na poziomie żądania) | Tak (na poziomie żądania) | Tak (na poziomie połączenia) | Nie (na poziomie strumienia) |
Przykład żądania w HTTP/1.1:
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: curl/7.64.1
Accept: */*
Przykład żądania w HTTP/2 (koncepcyjnie, ponieważ jest binarne):
// Żądanie 1: Pobierz /index.html
// :method = GET
// :path = /index.html
// :authority = www.example.com
// Żądanie 2: Pobierz /style.css
// :method = GET
// :path = /style.css
// :authority = www.example.com
// ...są przesyłane równolegle na jednym połączeniu