HTML v příkladech

9

HyperText Transfer protocol (HTTP)

 
Obsah

Rejstřík

Hledat

Dopis autorovi

...devátá část nemá příklad...

V předchozích dílech jsme se zabývali především stavbou stránek a jejich působením na uživatele. Mlčky jsme předpokládali, že přenosový mechanismus WWW nějak funguje a server s klientem se domluví a vymění si potřebná data. Tentokrát se podíváme, jak vlastně Web pracuje. Dovolíme si prohřešit se proti názvu našeho seriálu. Dnešní díl nebude o HTML, ale o přenosových mechanismech. Nebude také doprovázen příkladem.

Co je HTTP

Základem WWW je HyperText Transfer Protocol (HTTP), který definuje pravidla komunikace mezi klientem a serverem. Přestože běžní klienti ovládají i řadu jiných protokolů (FTP, Gopher a podobně), jsou téměř všechny běžné WWW stránky přepravovány prostřednictvím HTTP.

Jedná se o protokol bezstavový. To znamená, že server si neudržuje žádné informace o svých klientech. Obdrží-li dotaz, odpoví na něj a tím pro něj skončila jedna ucelená HTTP transakce. Pokud zanedlouho dostane dotaz od téhož klienta, nedává si jej do žádných souvislostí s dotazem předchozím (přestože byl třeba vyvolán některým z odkazů na stránce, kterou tomuto klientovi před chvilkou odeslal). Veškeré stavové informace (např. adresu aktuální stránky) si musí pamatovat klient.

Jedna WWW transakce se skládá z dotazu a odpovědi na něj. Vše samozřejmě začíná pokynem uživatele - například výběrem některého z odkazů na stránce. Z něj si klient určí URL informace, kterou má získat. Připomeňme, že z lokátoru se dozví

  • který protokol použít ke komunikaci
  • jaký server kontaktovat
  • co po něm chtít
Předpokládejme, že bude použit protokol HTTP. Klient naváže transportní spojení se serverem (standardním přenosovým protokolem pro Web je TCP z rodiny TCP/IP, tento krok tedy znamená navázání TCP spojení s programem, realizujícím server) a tímto spojením odešle dotaz. Server jej zpracuje a reaguje na něj patřičnou odpovědí. Poté zpravidla transportní spojení uzavře a tím celou HTTP transakci ukončí. O vylepšení tohoto základního modelu si povíme v závěru.

Protokol HTTP prošel během několika let své existence nezanedbatelným vývojem. Jeho první verze, označená 0.9, byla velmi primitivní. Umožňovala vlastně jen syrový přenos dat ze serveru ke klientovi a v současnosti je považována za zastaralou. Dnešním standardem je verze 1.0, definovaná v RFC 1945. Jejím nejdůležitějším přínosem je možnost doprovodit dotaz i odpověď řadou doplňujících informací. V nich lze uvést typ dokumentu, dobu jeho vzniku či schopnosti a požadavky klienta. Několikaleté používání této verze však odhalilo jisté slabiny a proto vývoj pokračoval verzí 1.1. Během psaní článku byla dokončena a připravena k prohlášení za standard. Je možné, že v době, kdy budete tento text číst, bude HTTP 1.1 existovat již ve formě RFC.

Verze 1.1 není takovým krokem vpřed, jako svého času 1.0. Nicméně přináší několik užitečných rozšíření. Zaměřují se na zvýšení efektivity HTTP, lepší práci vyrovnávacích pamětí a serverů (proxy cache) a pro nás užitečnou zdokonalenou podporu neanglických jazyků.

Podívejme se nyní na základní části HTTP. Upozorňujeme, že se bude jednat o pohled značně zjednodušený. Specifikace HTTP 1.1 má totiž více než 100 stran.

Dotaz

HTTP dotaz se do značné míry podobá elektronickému dopisu. Jeho strukturu znázorňuje obrázek 1. Nejdůležitější částí je první řádek. Udává, která HTTP metoda má být použita ke zpracování dotazu a jaká cesta vede k informaci. Zdaleka nejběžnější metodou je GET, jejímž prostřednictvím je realizována drtivá většina dotazů. Oznamuje, že dotaz má prázdné tělo. Jakmile tedy skončí hlavičky (všimněte si, že jsou ukončeny prázdným řádkem), může server začít se zpracováním dotazu. Naproti tomu metoda POST používá pro přenos informací od klienta k serveru kromě prvního řádku a hlaviček i tělo dotazu.

Obrázek 1: HTTP dotaz
metoda   cesta   verze_HTTP
hlavičky
 
tělo

Jistě si vzpomínáte, že při sestavování formuláře můžete atributem METHOD ve značce <FORM> předepsat, kterou z těchto dvou metod má klient použít k odeslání dat. Formuláře a obecně spouštění CGI skriptů jsou prakticky jediné případy, kdy se používá metoda POST. Umožňuje přidat k dotazu i velmi objemný balík dat. Pro vyzvedávání běžných stránek bohatě stačí GET. HTTP verze 1.1 přidalo i metody pro další činnosti. Umožňuje např. umístění odeslaných dat přímo na server (metoda PUT) nebo naopak likvidaci některého z nabízených souborů (DELETE).

Pomocí hlaviček může klient svůj dotaz upřesnit či doprovodit doplňkovými informacemi. Například hlavička Accept oznamuje, jaké typy informací je klient ochoten přijmout. Pošle-li serveru dotaz

GET / HTTP/1.0
Accept: text/html, text/plain, image/*
říká: "chci od tebe tvůj kořenový dokument, jsem však schopen zpracovat jen dokumenty ve formátu HTML, čisté ASCII texty a obrázky všeho druhu". Povinnou součástí dotazu je prázdný řádek za Accept, který slouží jako příznak ukončení.

Tvar hlaviček se shoduje s hlavičkami elektronického dopisu. Každá je na samostatném řádku a začíná vždy jménem hlavičky. Za ním následuje dvojtečka a hodnota hlavičce přiřazená.

Odpověď

Srovnáte-li obrázky 1 a 2, zjistíte, že tvar odpovědi je téměř totožný s podobou dotazu. Liší se jen v prvním (stavovém) řádku a pak také v sortimentu hlaviček, který je pro ně k dispozici. Na rozdíl od dotazů, které bývají zpravidla bez těla, většina odpovědí tělem oplývá. V něm přináší klientovi kýženou informaci.

Obrázek 2: HTTP odpověď
verze_HTTP   stavový_kód   popis
hlavičky
 
tělo

Pro celkové posouzení odpovědi je nejdůležitější první řádek. Z něj se klient dozví, zda byl jeho dotaz úspěšně zodpovězen a jak má chápat celý zbytek odpovědi. Rozhodující je stavový_kód a s ním svázaný popis. Oba mají stejný význam - oznamují výsledek zpracování dotazu, jsou však určeny různým čtenářům. stavový_kód je číselný a slouží klientovi. popis obsahuje stručný textový popis odpovídajícího kódu a je určen případnému lidskému čtenáři.

Stavové kódy jsou trojciferné a podle své první číslice se dělí do několika skupin. Jistě nejvítanější jsou kódy skupiny 2xx, signalizující úspěch. Většina dotazů naštěstí skončí s výsledkem 200 (OK), kterým server oznamuje "dotaz byl v pořádku, tady ti posílám odpověď". O něco smutnější, ale ještě ne beznadějná je skupina 3xx. Tyto kódy oznamují přesměrování - server sděluje klientovi, že požadovaný objekt byl přesunut jinam. Součástí odpovědi musí být hlavička Location, obsahující nové URL požadovaného objektu. Nejvýznamnějšími představiteli této skupiny jsou kódy 301 (Moved Permanently - přesunuto trvale, příště se již vždy obracej na novou adresu) a 302 (Moved Temporarily - přesunuto dočasně, teď zrovna je tenhle objekt jinde, ale příště přijď zase ke mně, protože by se měl vrátit). Pokud klient požaduje soubor, který byl trvale přesunut např. na adresu http://www.jinde.cz/soubor.html, odpoví server následovně:

HTTP/1.0 301 Moved Permanently
Location: http://www.jinde.cz/soubor.html
Content-Type: text/html

Soubor je umístěn
<A HREF="http://www.jinde.cz/soubor.html">jinde</A>.
Doporučuje se, aby server u těchto odpovědí připojil tělo, ve kterém sdělí uživateli nové umístění souboru. Je určeno pro klienty staršího data, kteří nepodporují přesměrování a prostě zobrazí získanou odpověď. Moderní klient by měl automaticky položit nový dotaz podle URL z hlavičky Location a zobrazit uživateli až jeho výsledek.

Skupina 4xx není mezi uživateli příliš populární, protože signalizuje chybu ze strany klienta. Patří sem nejčastější chybové hlášení 404 (Not Found), které bývá způsobeno chybným lokátorem. Do skupiny 5xx jsou zařazeny chyby serveru, proti kterým se klient nemůže příliš bránit. Naštěstí takovou odpověď uvidíte jen zřídka.

Odpovědi mívají tělo a s ním je spojeno několik hlaviček, charakterizujících jeho obsah. Patří sem především Content-Type (jakého druhu je přenášené tělo) a Content-Length (kolik bajtů měří). Tyto hlavičky by se měly objevit i v dotazu, pokud nese tělo. HTTP verze 1.1 navíc požaduje, aby každá odpověď obsahovala hlavičku Date, obsahující čas jejího odeslání.

Zprostředkovatelé a vyrovnávací paměti

Jedním ze závažných problémů počítačových sítí je zajištění bezpečnosti účastnických počítačů. Instituce, které přikládají bezpečnosti velký význam, zpravidla připojují svou síť k Internetu prostřednictvím tak zvané hradby (firewall), která omezuje jejich vzájemnou komunikaci.

Má-li WWW provoz projít hradbou, musí na hradebním počítači běžet tak zvaný zprostředkující server (proxy server). Klienti z lokální sítě pak neposílají své dotazy přímo cílovým serverům, ale zprostředkovateli. Ten je předá serveru a jeho odpověď pak zašle klientovi. Jakmile byl tento mechanismus jednou vymyšlen, stačil jen krůček k vytvoření vyrovnávacího serveru (proxy cache), který významně redukuje objem WWW provozu v Internetu. Vyrovnávací server je vlastně zprostředkovatel, který si ukládá odpovědi do lokální paměti. Pokud se v brzké době zopakuje stejný dotaz, neobtěžuje původní server, ale rovnou odešle klientovi uloženou dřívější odpověď.

Kvalitní programy (velmi populární je například volně šiřitelný Squid) navíc umožňují vzájemnou spolupráci vyrovnávacích serverů a vytváření různých vazeb mezi nimi. Praktická sledování na našem vyrovnávacím serveru (cache.vslib.cz) ukazují, že přibližně polovinu dotazů dokáže obsloužit z vlastních zdrojů, další čtvrtinu získá od spolupracujících vyrovnávacích serverů a pouze pro čtvrtinu odpovědí se obrací na cílové servery.

Pro potřeby vyrovnávacích pamětí a serverů je určen tak zvaný podmíněný dotaz. Jedná se o běžný HTTP dotaz, který je však opatřen hlavičkou If-Modified-Since. Posílá se v případě, že klient či vyrovnávací server má v paměti jistou verzi dokumentu a chce ověřit, zda neexistuje novější. Pokud server skutečně má mladší verzi, pošle ji stejným způsobem, jako při normálním dotazu (použije stavový kód 200). Jestliže však nic novějšího neexistuje, odpoví stavovým kódem 304 (Not Modified). Taková odpověď je samozřejmě bez těla. Tazatel se z ní dozví, že jeho verze je stále ještě platná.

HTTP verze 1.1 věnuje problematice vyrovnávacích pamětí značnou pozornost. Nabízí dokonalejší metody pro identifikaci dokumentů a jejich verzí, hlavičku Cache-Control, kterou mohou klient i server ovlivňovat vyrovnávací servery mezi sebou.

Recyklované spojení

Jedním ze zdrojů neefektivity HTTP je nutnost navazovat pro každý dotaz nové TCP spojení. Novější klienti i servery zpravidla podporují rozšíření, zvané anglicky "keep alive" - udržet při životě. Klient totiž ke zobrazení stránky často potřebuje některé další komponenty - například obrázky, které jsou její součástí. Proto se bude na server vzápětí obracet s dalšími dotazy. Umí-li to oba partneři, bude TCP spojení zachováno a klient je využije k položení dalšího dotazu. Tím odpadne opětovné navazování a likvidace spojení pro každý dotaz a ušetří se špetka času i přenosové kapacity.

Nová verze HTTP již tuto vlastnost zahrnuje. Navíc přidává řetězení dotazů (pipelining). Při něm klient nemusí s odesláním dotazu čekat na odpověď. Odešle transportním spojením všechny dotazy, které má, a pak jen čeká na odpovědi. Díky těmto mechanismům podstatným způsobem klesne počet datagramů, přepravovaných Internetem.


Pavel Satrapa
Článek byl otištěn v časopise
Softwarové noviny číslo 4/97
 
<--- --->