Sobes.tech
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 POST i HEAD, 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