Základy protokolu HTTP

Jiří Kosek ml.

Služba World-Wide Web je postavena na třech základních technologiích -- HTML, URL a HTTP. HTML je značkovací jazyk, který slouží k standardnímu popisu obsahu a struktury webovských stránek. URL je speciální druh adres používaných na Webu -- každá webovská stránka má svoji jednoznačnou adresu právě v podobě URL. HTTP -- Hypertext Transfer Protocol -- je protokol používaný při komunikaci mezi prohlížeči a webovskými servery. Pomocí tohoto protokolu se k serveru přenáší URL stránky, kterou uživatel (přes svůj prohlížeč) požaduje, a naopak server pomocí protokolu HTTP odesílá uživateli zpět stránku zapsanou v HTML.

Pro správné pochopení principů CGI-skriptů je nezbytná alespoň základní znalost protokolu HTTP. Proto se v dnešním pokračování seriálu podíváme na základní vlastnosti protokolu HTTP.

Protokol HTTP vychází z architektury klient/server. Klient -- v našem případě prohlížeč -- se spojí se serverem a pošle mu požadavek. Server jako reakci na klientův požadavek zasílá odpověď. Přesný formát požadavku a odpovědi je definován ve specifikaci protokolu HTTP. Celou situaci mírně komplikuje to, že dnes existují tři verze protokolu -- 0.9, 1.0 a 1.1. Formát požadavku a odpovědi se v jednotlivých verzích odlišuje.

Obr. 1: Průběh komunikace mezi klientem a serverem
Průběh komunikace mezi klientem a serverem

HTTP verze 0.9

V HTTP/0.9 je formát požadavku velice jednoduchý. Jde o jeden řádek, kde je za klíčovým slovem GET uvedena cesta k požadovanému dokumentu. Pokud chceme pomocí HTTP/0.9 získat například dokument http://www.server.cz/~krystof/linky.html, musíme se připojit k počítači www.server.cz na port 80 (standardní port služby WWW) a zaslat požadavek:
GET /~krystof/linky.html
Jako odpověď nám přijde obsah souboru linky.html. Vše si můžeme sami vyzkoušet a zahrát si na prohlížeč. Stačí spustit telnet a přihlásit se k nějakému serveru na port 80. Pak napíšeme HTTP požadavek a necháme se překvapit, co nám server odešle zpět (viz obr. 2).

Obr. 2: Komunikace s WWW serverem pomocí telnetu
Komunikace s WWW serverem pomocí telnetu

Na tomto místě musíme připomenout, že cesta za slovem GET nemůže být prázdná a musí vždy obsahovat alespoň lomítko:

GET /
Možná vás napadlo, jaký dokument odešle server jako odpověď, pokud v požadavku není určen přímo soubor, ale pouze adresář (nebo dokonce jen kořenový adresář jako v našem příkladě). V tomto případě WWW-server hledá v adresáři soubor, který se jmenuje index.html, default.html či welcome.html -- záleží na konfiguraci. Pokud jej nalezne, odešle jej jako odpověď. Pokud takový soubor neexistuje, odešle výpis obsahu adresáře (pokud to není v konfiguraci serveru zakázáno).

Jména souborů, které se hledají v případě požadavku, který obsahuje pouze jméno adresáře, lze pro server Apache nastavit v konfiguračním souboru srm.conf pomocí direktivy DirectoryIndex. Díky této vlastnosti můžeme používat URL adresy tvaru http://www.server.cz/.

HTTP verze 1.0

V této verzi protokolu HTTP je syntaxe požadavku již o něco složitější:
metoda cesta_k_dokumentu HTTP/1.0
hlavičky
prázdná_řádka
Nejpoužívanější metodou je GET -- ta slouží k získání daného dokumentu ze serveru. Další dvě metody, které můžeme použít, jsou HEAD a POST. První z nich zašle pouze hlavičky, které obsahují různé metainformace o dokumentu -- např. datum poslední modifikace apod. Metoda POST slouží k odeslání dat z formuláře na server. V tomto případě za prázdnou řádkou obsahuje požadavek ještě hodnoty jednotlivých polí formuláře.

Hlavičky slouží pro přenos různých doplňujících informací. Každá hlavička je na samostatné řádce a má tvar jméno_hlavičky: hodnota. Význam jednotlivých hlaviček popíšeme později. Jejich použití je nepovinné a proto nejjednodušší požadavek v HTTP/1.0 vypadá takto:

GET /~krystof/linky.html HTTP/1.0
prázdná_řádka
Odpověď má v HTTP/1.0 také odlišný formát. Nesestává pouze ze samotného obsahu zasílané stránky, ale obsahuje i mnoho důležitých a užitečných informací.
HTTP/1.0 stavový_kód stavové_hlášení
hlavičky
prázdná_řádka
obsah_odpovědi
Stavový kód je třímístné číslo, které indikuje, jak se povedlo uspokojit požadavek. Přehled stavových kódů je uveden v tabulce 1.

Stavové hlášení je slovní popis stavového kódu, který je pro člověka přeci jen srozumitelnější. Pokud vše proběhlo v pořádku, měla by první řádka odpovědi vypadat následovně

HTTP/1.0 200 OK
Přehled stavových kódů a hlášení je v tabulce 1.

Tab. 1: Stavové kódy a hlášení HTTP/1.0
KódPopis
1xx -- Informační kódy (nepoužívá se)
2xx -- Úspěšné vyřízení požadavku
200 OK Požadavek byl úspěšně zpracován
201 Created Výsledkem požadavku je nově vytvořený objekt
200 Accepted Požadavek byl přijat, ale dosud není zpracován
200 No content Požadavek byl úspěšně zpracován, ale jeho výsledkem nejsou žádná data pro klienta
3xx -- Přesměrování
301 Moved PermanentlyPožadovaný objekt byl trvale přemístěn na jinou adresu
302 Moved TemporarilyPožadovaný objekt byl dočasně přemístěn na jinou adresu
304 Not ModifiedObjekt nebyl změněn (odpověď při podmíněném požadavku pomocí hlavičky If-Modified- Since)
4xx -- Chyba klienta
400 Bad Request Špatná syntaxe dotazu
401 UnauthorizedObjekt je dostupný pouze po autorizaci
403 Forbidden Požadavek je v pořádku, ale server nemá povoleno jej vykonat
404 Not Found Požadovaný objekt nebyl na serveru nalezen
5xx -- Chyba na straně serveru
500 Internal Server ErrorServeru se něco stalo a nemůže vyplnit požadavek
501 Not ImplementedServer nepodporuje metodu uvedenou v požadavku
502 Bad Gateway Server, pracující jako gateway, dostal špatnou odpověď od dalšího serveru
503 Service UnavailableSlužba je nedostupná (přetížení, údržba serveru)

HTTP verze 1.1

Struktura požadavku i odpovědi zůstává u nejnovější verze HTTP stejná jako u verze 1.0. Přidány jsou však nové hlavičky a některé z nich jsou nyní i povinné.

Předchozí verze protokolu HTTP vytvářely pro každý objekt nové spojení a poté jej pomocí HTTP přenesly. Pokud tedy např. HTML stránka obsahovala čtyři obrázky, pro její stažení bylo potřeba navázat 5 spojení (1 stránka + 4 obrázky). Navázání spojení je však náročné jak na čas, tak na přenosovou kapacitu sítě. HTTP/1.1 proto spojení mezi klientem a serverem po vyřízení požadavku neuzavírá, ale umožňuje jej použít pro přenos více objektů. Tím dochází k ušetření času potřebného k přenosu webovských stránek. Spojení může ukončit klient nebo server tím, že do požadavku/odpovědi zařadí hlavičku Connection: close.

V každém požadavku, který vyhovuje standardu HTTP/1.1, musíme použít hlavičku Host. Jako hodnota se uvádí doménové jméno serveru, ze kterého požadujeme stránku. Nejjednodušší požadavek pak vypadá takto

GET /~krystof/linky.html HTTP/1.1
Host: www.server.cz
prázdná_řádka
Použití této hlavičky je povinné kvůli virtuálním serverům. Dnes je na Internetu běžné, že poskytovatelé připojení umožňují na svých serverech vystavovat stránky svým zákazníkům. Jako službu nabízejí i umístění stránek na adrese typu http://www.firma.cz místo obvyklého http://www.poskytovatel.cz/firma. Samozřejmě, že poskytovatel na jednom serveru (počítači) vystavuje stránky několika firem. Problém je však v tom, že server má obvykle jen jednu IP-adresu, ke které se připojují klienti. Prohlížeč se tedy připojí k serveru na port 80 a v požadavku HTTP/1.0 pošle pouze cestu k dokumentu. Server nemá šanci zjistit, z kterého virtuálního serveru je dokument požadován. Tato situace se řešila přiřazením několika IP-adres jednomu počítači. Pro každý virtuální server musela existovat jedinečná IP-adresa. V tomto případě již server podle IP-rozhraní, ke kterému se prohlížeč připojil, mohl určit virtuální server, na který požadavek směřuje.

Toto ne příliš elegantní řešení zbytečně plýtvalo IP-adresami a kladlo zvýšené požadavky na konfiguraci serveru při přidání nového virtuálního serveru. Tím, že požadavky HTTP/1.1 obsahují jméno serveru, odpadá potřeba zřizování nové IP-adresy pro každý virtuální server. Na jedné IP-adrese nyní může být přístupný neomezený počet virtuálních serverů. Jediným háčkem jistě elegantního řešení problému je fakt, že starší prohlížeče nepodporují HTTP/1.1.

HTTP/1.1 přidává i několik nových metod požadavků. Pro potřeby pohodlného publikování na Webu jsou to především metody PUT a DELETE. První z nich slouží k uložení zaslaného objektu (nejčastěji HTML stránky) na dané URL. HTML-editor tak může přímo na WWW-server uložit nově vytvořenou nebo modifikovanou stránku, aniž by se o to musel snažit uživatel sám například pomocí FTP. Metoda DELETE slouží k odstranění stránky ze serveru. Další metody TRACE, CONNECT a OPTIONS slouží k zjišťování, analyzování a nastavení způsobu spojení.

Nejpoužívanější hlavičky

Verze protokolu HTTP 1.0 definovala 17 hlaviček. HTTP/1.1 tento počet ještě zvětšilo. My si stručně objasníme význam nejdůležitějších hlaviček.

Content-Type

Tato hlavička udává typ přenášených dat. Typ dat se zapisuje pomocí MIME konvence. Pro HTML stránky máme typ text/html, pro obyčejný text text/plain, obrázky mají podle použitého formátu jeden z typů image/gif, image/jpeg nebo image/png. Podle typu dat prohlížeč pozná, jak příchozí data interpretovat. HTML stránka zasílaná prohlížeči jako odpověď, proto mezi hlavičkami obsahuje následující řádku
Content-Type: text/html

Location

Tato hlavička obsahuje adresu dokumentu, který byl přesunut. Tuto hlavičku server posílá v případech, kdy stavový kód požadované operace začíná na 3. Prohlížeč většinou automaticky nahraje stránku, na kterou Location ukazuje. Jako adresu je potřeba uvést úplné absolutní URL. Např.
Location: http://manes.vse.cz/~xkosj06/index.html

If-Modified-Since

Pokud v požadavku použijeme tuto hlavičku společně s nějakým datem, server nám požadovaný objekt vrátí pouze, pokud byl od zadaného data změněn. Př. Chceme získat dokument pouze, pokud se od 30. března 1998 změnil:
If-Modified-Since: Mon, 30 Mar 1998 12:00:00 GMT

User-Agent, Server

V hlavičce User-Agent posílá prohlížeč svoji identifikaci -- obvykle své jméno, číslo verze a platformu, na které je spuštěn. Server naopak obsahuje identifikaci serveru, který vyřídil požadavek. Př.:
User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows NT) 

Server: Apache/1.3b3
© Jiří Kosek 1999