HTTP
Obsah boxu
Hypertext Transfer Protocol (zkratka HTTP) je bezstavový aplikační protokol určený pro komunikaci na World Wide Webu. Slouží k přenosu prakticky jakýchkoliv datových souborů, nejčastěji však HTML dokumentů, obrázků, skriptů a stylopisů mezi webovým serverem (poskytovatelem obsahu) a webovým prohlížečem (klientem). HTTP je základním kamenem datové komunikace na webu.
Protokol funguje na principu klient-server, kde klient (např. prohlížeč) zasílá serveru požadavek (request) a server na něj odpovídá (response). Původní verze protokolu byly textové a snadno čitelné pro člověka, což usnadnilo jeho vývoj a ladění. Novější verze (HTTP/2 a HTTP/3) přešly na binární formát z důvodu vyšší efektivity.
Bezpečná varianta protokolu se nazývá HTTPS (Hypertext Transfer Protocol Secure), která šifruje komunikaci pomocí TLS (dříve SSL) a chrání tak přenášená data před odposlechem a manipulací.
📜 Historie a vývoj
Vývoj HTTP je úzce spjat s historií samotného World Wide Webu. Každá nová verze se snažila řešit nedostatky té předchozí a přizpůsobit se rostoucím nárokům na rychlost, efektivitu a bezpečnost webu.
🌐 Počátky a HTTP/0.9
První, velmi jednoduchá verze protokolu, označovaná zpětně jako HTTP/0.9, vznikla v roce 1991 v CERN jako součást projektu World Wide Web, jehož autorem je Sir Tim Berners-Lee. Tato verze byla extrémně minimalistická:
- Znala pouze jednu metodu: `GET`.
- Požadavek se skládal z jednoho řádku: `GET /cesta/k/dokumentu.html`.
- Serverova odpověď obsahovala pouze tělo požadovaného HTML dokumentu, bez jakýchkoliv hlaviček nebo stavových kódů.
- Po odeslání odpovědi se spojení okamžitě uzavřelo.
Tato verze sloužila výhradně k přenosu hypertextových dokumentů.
🚀 HTTP/1.0 (RFC 1945)
V roce 1996 byl protokol formalizován ve specifikaci RFC 1945 jako HTTP/1.0. Tato verze přinesla zásadní vylepšení, která položila základy moderního webu:
- **Verzování:** Každý požadavek a odpověď obsahovaly informaci o verzi protokolu (např. `HTTP/1.0`).
- **HTTP hlavičky:** Byl zaveden koncept hlaviček (headers), které umožnily přenášet metadata o požadavku i odpovědi (např. `Content-Type`, `User-Agent`).
- **Stavové kódy:** Odpověď serveru nově začínala stavovým řádkem, který obsahoval číselný kód informující o výsledku zpracování požadavku (např. `200 OK` nebo `404 Not Found`).
- **Nové metody:** Kromě `GET` byly přidány metody `HEAD` a `POST`.
- **Přenos různých typů obsahu:** Díky hlavičce `Content-Type` mohl protokol přenášet nejen HTML, ale i obrázky, videa a další soubory.
Nevýhodou HTTP/1.0 bylo, že pro každý jednotlivý požadavek (např. HTML soubor a každý obrázek v něm) bylo nutné navázat nové TCP spojení, což bylo neefektivní a zpomalovalo načítání stránek.
⚙️ HTTP/1.1 (RFC 2616 a novější)
Verze HTTP/1.1, standardizovaná v roce 1999 (a později několikrát revidovaná), se stala na dlouhou dobu dominantním protokolem na internetu. Přinesla klíčové optimalizace:
- **Trvalá spojení (Persistent Connections):** Standardně bylo zavedeno tzv. keep-alive spojení, které umožnilo v rámci jednoho TCP spojení odeslat více požadavků a přijmout více odpovědí. Tím se výrazně snížila režie spojená s navazováním spojení.
- **Pipelining:** Umožnil klientovi odeslat více požadavků najednou, aniž by musel čekat na odpovědi na ty předchozí. Server však musel odpovídat ve stejném pořadí, což vedlo k problému zvanému Head-of-line blocking.
- **Hlavička `Host`:** Tato povinná hlavička umožnila provozovat více webových stránek na jedné IP adrese (tzv. Virtuální hosting).
- **Chunked transfer encoding:** Umožnilo serveru posílat odpověď po částech, aniž by předem znal její celkovou velikost. To je užitečné pro dynamicky generovaný obsah.
- **Vylepšené mechanismy pro caching**.
✨ HTTP/2 (RFC 7540)
S rostoucí komplexností webových stránek začaly být limity HTTP/1.1 stále zřetelnější. V roce 2015 byl proto standardizován HTTP/2, který vycházel z experimentálního protokolu SPDY od společnosti Google. Jeho hlavní cíle byly snížení latence a zvýšení efektivity.
- **Binární protokol:** Na rozdíl od textového HTTP/1.1, HTTP/2 používá binární rámce, které jsou pro stroje efektivnější na zpracování.
- **Multiplexing:** Nejdůležitější novinka. Umožňuje posílat více požadavků a odpovědí souběžně v rámci jednoho TCP spojení, aniž by na sobě byly závislé. Tím se zcela eliminuje problém Head-of-line blocking na úrovni HTTP.
- **Komprese hlaviček (HPACK):** Hlavičky, které se v mnoha požadavcích opakují, jsou efektivně komprimovány, což šetří přenesená data.
- **Server Push:** Server může klientovi "vnutit" zdroje, o kterých předpokládá, že je bude potřebovat (např. poslat CSS soubor spolu s HTML stránkou), čímž se snižuje počet nutných požadavků.
⚡ HTTP/3 (RFC 9114)
I přes vylepšení HTTP/2 zůstal jeden problém: Head-of-line blocking na úrovni transportního protokolu TCP. Pokud se ztratí jeden TCP paket, celé spojení musí čekat na jeho opětovné doručení, což zablokuje všechny multiplexované proudy v HTTP/2.
HTTP/3, standardizovaný v roce 2022, tento problém řeší radikální změnou:
- **Přechod na QUIC:** Místo TCP používá nový transportní protokol QUIC, který běží nad UDP.
- **Eliminace TCP HoL blocking:** QUIC má proudy (streams) vestavěné přímo v sobě. Ztráta paketu v jednom proudu neovlivní ostatní proudy.
- **Rychlejší navázání spojení:** QUIC kombinuje navázání spojení a TLS handshake, což snižuje počet nutných "round-tripů" a zrychluje načítání, zejména při prvním připojení (tzv. 0-RTT).
- **Plynulá migrace spojení:** Pokud uživatel změní síť (např. přejde z
Wi-Fi na mobilní data), spojení se nepřeruší, protože je identifikováno unikátním ID, nikoliv kombinací IP adresy a portu.
🔧 Jak HTTP funguje
HTTP je postaveno na jednoduchém modelu komunikace mezi klientem a serverem.
🤝 Model klient-server
1. **Klient** (např. webový prohlížeč, robot vyhledávače) sestaví a odešle HTTP požadavek na server. Požadavek specifikuje, jaký zdroj (např. webovou stránku, obrázek) a jakou akci si klient přeje provést. 2. **Server** (např. Apache, Nginx) přijme požadavek, zpracuje ho a na základě něj vygeneruje HTTP odpověď. 3. **Odpověď** je zaslána zpět klientovi. Obsahuje stavový kód informující o výsledku operace a v případě úspěchu i požadovaná data (tělo odpovědi).
✉️ Struktura HTTP zprávy
Každá HTTP zpráva (požadavek i odpověď) se skládá ze startovacího řádku, nula nebo více hlaviček, prázdného řádku a volitelného těla zprávy.
Požadavek (Request)
- **Startovací řádek (Request Line):** Obsahuje tři části:
1. **Metoda:** Např. `GET`, `POST`. Určuje akci, která se má provést. 2. **URI (Uniform Resource Identifier):** Cesta k požadovanému zdroji na serveru, např. `/index.html`. 3. **Verze HTTP:** Např. `HTTP/1.1`.
- **Hlavičky (Headers):** Dvojice klíč-hodnota, které poskytují dodatečné informace, např. `Host: www.example.com`, `User-Agent: Mozilla/5.0`.
- **Tělo (Body):** Nepovinná část obsahující data, která se mají odeslat na server (např. data z vyplněného formuláře při metodě `POST`).
Odpověď (Response)
- **Stavový řádek (Status Line):** Obsahuje tři části:
1. **Verze HTTP:** Např. `HTTP/1.1`. 2. **Stavový kód:** Trojciferné číslo, např. `200`. 3. **Textový popis kódu:** Např. `OK`.
- **Hlavičky (Headers):** Poskytují informace o odpovědi, např. `Content-Type: text/html`, `Content-Length: 1234`.
- **Tělo (Body):** Obsahuje samotná data požadovaného zdroje (HTML kód, obrázek atd.).
🎯 Metody požadavku (Request Methods)
HTTP definuje několik metod, které specifikují požadovanou akci:
- GET: Požaduje reprezentaci určeného zdroje. Je to nejběžnější metoda.
- POST: Odesílá data na server, aby vytvořila nový zdroj (např. odeslání formuláře, nahrání souboru).
- PUT: Nahrazuje cílový zdroj daty obsaženými v požadavku.
- DELETE: Maže specifikovaný zdroj.
- HEAD: Podobné jako `GET`, ale odpověď serveru neobsahuje tělo, pouze hlavičky. Používá se pro zjištění metadat o zdroji.
- OPTIONS: Zjišťuje komunikační možnosti pro cílový zdroj (např. které metody jsou povoleny).
- PATCH: Aplikuje částečné modifikace na zdroj.
✅ Stavové kódy (Status Codes)
Stavové kódy jsou standardizované číselné odpovědi serveru, které jsou seskupeny do pěti tříd:
- **1xx (Informační):** Požadavek byl přijat, proces pokračuje. (např. `100 Continue`)
- **2xx (Úspěch):** Požadavek byl úspěšně přijat, pochopen a zpracován. (např. `200 OK`, `201 Created`)
- **3xx (Přesměrování):** Pro dokončení požadavku je třeba provést další kroky, obvykle přesměrování na jinou URL. (např. `301 Moved Permanently`, `302 Found`)
- **4xx (Chyba klienta):** Požadavek obsahuje chybnou syntaxi nebo nemůže být splněn. (např. `400 Bad Request`, `403 Forbidden`, `404 Not Found`)
- **5xx (Chyba serveru):** Server selhal při plnění platného požadavku. (např. `500 Internal Server Error`, `503 Service Unavailable`)
🍪 Stavovost a cookies
HTTP je ze své podstaty bezstavový protokol (stateless). To znamená, že každý požadavek je nezávislý a server si nepamatuje nic o předchozích požadavcích od stejného klienta. Pro aplikace, které potřebují udržovat kontext (např. nákupní košík nebo přihlášený uživatel), byl tento problém vyřešen zavedením HTTP cookies. Cookie je malý kousek dat, který server pošle klientovi, ten ho uloží a při každém dalším požadavku ho posílá zpět serveru. Server tak může identifikovat klienta a udržovat jeho stav.
🔒 Bezpečnost: HTTP vs. HTTPS
Zásadní nevýhodou původního HTTP je, že veškerá komunikace probíhá v nešifrované, textové podobě. To znamená, že kdokoliv na síti mezi klientem a serverem (např. poskytovatel internetu, útočník ve veřejné Wi-Fi síti) může tuto komunikaci odposlouchávat (eavesdropping) a dokonce i modifikovat (man-in-the-middle attack).
Řešením je HTTPS (HTTP Secure), což je v podstatě HTTP komunikace zabalená do šifrovaného tunelu pomocí protokolu TLS. HTTPS zajišťuje tři základní pilíře bezpečnosti: 1. **Šifrování:** Data jsou nečitelná pro kohokoliv, kdo by je odposlouchával. 2. **Integrita:** Zajišťuje, že data nebyla během přenosu změněna. 3. **Autentizace:** Ověřuje identitu serveru, ke kterému se klient připojuje (pomocí digitálních certifikátů), a chrání tak před phishingem a útoky typu man-in-the-middle.
V současnosti je používání HTTPS považováno za standard pro všechny webové stránky, nejen pro ty, které pracují s citlivými daty.
💡 Pro laiky
Představte si HTTP jako způsob, jakým si objednáváte v restauraci:
- **Vy (klient):** Jste host, který si chce něco objednat. Váš mozek je jako váš webový prohlížeč.
- **Číšník (spojení):** Je prostředník, který přenáší vaše přání do kuchyně.
- **Kuchyň (server):** Místo, kde se připravuje jídlo (zpracovávají se data).
- **Požadavek (objednávka):** Když řeknete číšníkovi: "Prosím, jídelní lístek," je to jako `GET /jidelni-listek`. Když mu dáte vyplněný lístek s objednávkou, je to jako `POST /objednavka`.
- **Odpověď (jídlo a informace):**
* Číšník vám přinese jídelní lístek – to je odpověď s kódem `200 OK` a daty (obsahem lístku). * Kdyby číšník řekl: "Omlouváme se, guláš došel," je to jako odpověď `404 Not Found`. * Kdyby řekl: "Promiňte, v kuchyni vypadl proud a nic vám teď nepřipravíme," je to jako `500 Internal Server Error`.
- **HTTPS:** Představte si, že svou objednávku neříkáte nahlas, ale šeptáte ji číšníkovi do ucha, aby nikdo jiný u stolu neslyšel, co si dáváte. To je šifrování – vaše komunikace je soukromá.
🌐 Význam a budoucnost
HTTP je jedním z nejdůležitějších protokolů v historii internetu. Jeho jednoduchost a rozšiřitelnost mu umožnily stát se základem pro World Wide Web a umožnit tak globální sdílení informací a služeb. Ačkoliv původní verze již nevyhovují moderním nárokům, evoluce v podobě HTTP/2 a HTTP/3 ukazuje, že protokol je stále živý a přizpůsobuje se novým výzvám, jako je mobilní internet, streamování videa a požadavky na co nejnižší latenci. Budoucnost protokolu je spojena s dalším vylepšováním efektivity a bezpečnosti, přičemž protokol QUIC, na kterém je postaven HTTP/3, hraje klíčovou roli v dalším směřování vývoje.