Obsah
Časová náročnost kapitoly: 10 minut
Hyper Text Transfer Protocol (zkratka
HTTP) je jeden z nejdůležitějších protokolů Internetu pro přenos dat
mezi serverem a klientem. Před vznikem HTTP byl nejdůležitějším
protokolem pro přenos souborů protokol FTP (File Transfer Protocol)
[4]. HTTP je jednoduchý protokol implementující malou množinu
příkazů, schopný přenášet data určená URL adresou. Využívá standardů
MIME, díky čemuž se dá rozšiřovat o formáty různých médií.
Klienty HTTP představují většinou webové
prohlížeče (browsery) a HTTP servery jsou většinou webové servery.
Protokol HTTP komunikuje na portu 80 TCP
protokolu, při zadávání adresy ve formátu URL je ovšem možno zadat i
jiný port. Navíc protokol HTTP není závislý na protokolu TCP a může
pracovat i s jinými spolehlivými protokoly.
Protokol HTTP používá identifikaci
systému verzí "<hlavní>.<podřadná>". Systém
verzí se používá k tomu, aby umožnil odesílateli indikovat formát
zprávy, který použil pro budoucí komunikaci.
Číslo <podřadné>
verze se zvyšuje vždy, když jsou provedeny změny protokolu, které
nemění celkový mechanismus syntaktického zpracování zpráv.
Číslo
<hlavní> verze se zvyšuje, pokud se mění formát zpráv s
protokolem.
Hlavní i podřadná verze musí být brány jako oddělené
čísla, a každé mohou být větší než jedna číslice.
Příklad:
Verze HTTP/2.4 je nižší
než HTTP/2.13
HTTP/1.0 servery musí:
rozpoznat
formát požadavků pro požadavky protokolů HTTP/0.9 a HTTP/1.0
rozumět jakémukoliv platnému požadavku
formátu HTTP/0.9 nebo HTTP/1.0
odpovědět
ve stejné verzi protokolu, jakou používá klient
HTTP/1.0
klienti musí:
rozumět formátu stavů
pro odpovědi ve verzi HTTP/1.0
rozumět
jakékoli platné odpovědi formátu HTTP/0.9 nebo HTTP/1.0.
HTTP/1.1
servery musí:
musí rozumět poli
hlavičky HOST
pole hlavičky HOST musí být
obsaženy v odpovědích
pokud není pole
hlavičky HOST obsaženo v požadavku, musí server odpovědět 400
musí být schopen pracovat s absolutní URI
HTTP/1.1 klienti musí:
musí
rozumět poli hlavičky HOST
Časová náročnost kapitoly: 15 minut
Veškerá
komunikace u protokolu HTTP probíhá tak, že klient vyšle požadavek a
server na něj odpovídá. I z důvodu bezpečnosti přenosu dat ale mohou
nastat případy, kdy mezi lokální sítí a Internetem je zařízení
(firewall) filtrující požadavky a odpovědi mezi místní sítí a
internetem. V tomto případě firewall pracuje jako HTTP server pro
místní síť a v rámci Internetu se chová jako webový klient. Vlastně
přijímá požadavky na www stránky z lokální sítě, z Internetu je načte
a zasílá získané stránky do lokální sítě. Ve verzi HTTP/1.0 klient
iniciuje pro každý požadavek samostatné TCP spojení. Server po
odeslání odpovědi TCP spojení ukončí. Ve verzi HTTP/1.1 je možnost
podržet spojení přes více transakcí dotaz - odpověď, což vede k
zefektivnění komunikace. Základními operacemi protokolu HTTP je
načtení webové stránky, získání informací o webové stránce a odeslání
dat z formuláře či skriptu vloženého do www stránky na HTTP server.
Tyto operace se provádí pomocí příkazů GET, HEAD a POST.
Protokol HTTP/1.1 využívá jak URL
(uniform resouce locator), tak i URI (uniform resouce identifikator).
URI je nadmnožinou URL a URN (uniform resource name). Při používání
protokolu HTTP/1.1 vystačíme v místech, kde se vyžaduje adresa URI, s
adresou zapsanou podle specifikací URL. Více informací o URI je možné
nalézt ve specifikaci protokolu HTTP/1.1 [3].
Čtěte pozorně tyto informace, jsou důležité a vlivem jejich
nepochopení vznikají chyby při používání protokolu HTTP.
Za
příkazy protokolu HTTP (GET, HEAD, POST) spolu s jejich parametry
následuje hlavička. Každé pole hlavičky je na vlastním řádku,
identifikátor pole hlavičky je následovaný znakem dvojtečka ":",
mezerou a potom hodnotou pole, řádek je ukončen sekvencí znaků CR,LF.
Příklad požadavku:
GET http://www.seznam.cz HTTP/1.0
Accept: */*
Accept-Language: cs
Pragma: no-cache
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows 98;
MSNATLAS01.CZ; Q312461)
Host: www.seznam.cz
Proxy-Connection:
Keep-Alive
Každá odpověď serveru musí být ve tvaru,
kdy identifikátor použitého protokolu je následován stavovým kódem.
Potom následuje hlavička s vlastnostmi stejnými jako při odesílání
příkazů. Pak následuje prázdný řádek (dvakrát sekvence znaků
<CR><LF>). Ten odděluje hlavičku od přenášeného obsahu.
Potom již následuje žádaný obsah.
Příklad odpovědi:
HTTP/1.0 200 OK
Date: Sun, 15 Dec
2002 22:22:11 GMT
Content-Type: text/html
Content-Length: 16
<CR><LF>
Pokud chce klient získat stránku
zadanou URL ze serveru, použije příkaz GET, do parametru zadá URL
adresu, o kterou má zájem. Na dalších řádcích posílá serveru v
hlavičce doplňující informace o údajích, o které má zájem. Těmito
poli je možno v hlavičce nastavit mnoho dále popsaných vlastností.
Jako odpověď od serveru přichází hlavička stejného formátu jako
odeslaná, následovaná požadovaným dokumentem.
Časová náročnost kapitoly: 15 minut
Protokol
HTTP definuje množinu stavových kódů, kterým musí rozumět klienti a
servery musí být schopné je generovat. Stavové kódy se dají rozdělit
do kategorií podle následující tabulky.
Kategorie stavových kódů |
Čísla stavových kódů |
Popis |
---|---|---|
Informační |
100-199 |
Zprávy definované konkrétní aplikací |
Úspěch |
200-299 |
Požadavek byl úspěšně zpracován |
Přesměrování |
300-399 |
Klient musí pro konečné zpracování požadavku vykonat určitou další činnost |
Chyba klienta |
400-499 |
Problémy na straně klienta |
Chyba serveru |
500-599 |
Problémy na straně serveru |
Každý
stavový kód se skládá z číselné hodnoty a textového řetězce, který
může obsahovat doplňující informace. Všechny stavové kódy a jejich
význam uvádí následující tabulka. Tyto stavové kódy jsou přímo
specifikací protokolu HTTP.
Stavový kód |
Popis |
---|---|
200 OK |
Operace proběhla bez chyby, požadavek je úspěšně splňen |
201 Created |
Požadavek typu POST byl kladně vyřízen |
202 Accepted |
Požadavek byl správně akceptován, odpovídající činnost se však nemusela nutně provést |
204 No Content |
Požadavek byl úspěšný, ale klient nemá co zobrazit (obsah dokumentu je prázdný) |
300 Multiple Choices |
Požadovaný zdroj se dá získat z různých míst. V odpovědi se vrací seznam všech možností. Pole Location obsahuje variantu, kterou doporučuje server |
301 Moved Permanently |
Požadovaná adresa URL se trvale přesunula na novou adresu URL, popisuje ji pole Location odpovědi |
302 Moved Temporarily |
Požadovaná adresa URL se dočasně přesunula na novou adresu URL, popisuje ji pole Location odpovědi |
304 Not Modified |
Podmíněný požadavek GET se správně zpracoval, dokument nebyl od doby definované polem If-Modified-Since změněn |
400 Bad Request |
Server nerozumí požadavku |
401 Unauthorized |
Klient musí byt autorizován; pokud autorizován je, byl požadavek zamítnut |
403 Forbidden |
Server nemůže požadavku vyhovět |
404 Not Found |
Server nenašel zadanou adresu URL |
500 Internal Server Error |
Na serveru došlo k neočekávané chybě |
501 Not Implemented |
Tento požadavek server neimplementuje |
502 Bad Gateway |
Proxy server nebo brána obdržely od serveru neplatnou odpověď |
503 Service Unaviable |
Server dočasně nemůže, nebo nechce zpracovat požadavek |
Protokol HTTP verze 1.0 definuje příkazy GET, HEAD a POST.
Verze 1.1 protokolu HTTP rozšiřuje HTTP 1.0 o příkazy PUT, DELETE a
TRACE
Minimální implementace protokolu HTTP musí obsahovat tři
příkazy: GET, HEAD, POST
Časová náročnost kapitoly: 25 minut
Zprávy
protokolu HTTP obsahují různá pole hlavičky, která se mohou používat
v požadavcích a odpovědích. Některá z nich jsou určena výhradně
požadavkům klienta, jiná zase odpovědím serveru.
Následuje
seznam polí hlaviček a popis jejich vlastností
Pole Allow
Pole hlavičky Allow identifikuje, které
z příkazů (GET, HEAD,...) server podporuje. Proxy nemusí měnit pole
Allow, i když nepodporuje všechny specifikované metody. Pole Allow
neidentifikuje, které metody (pole hlavičky) server implementuje.
Pole Authorization
Pole hlavičky Authorization
využívají servery, které nedovolují anonymní přístup k některým
informacím. Uživatelský agent, který se chce identifikovat na
serveru, odešle obvykle po přijetí odpovědi 401 (unauthorized) v poli
Authorization autentikační informace uživatele. Jestliže server toto
oprávnění nepřijme, odpoví stavem 403 (forbidden).
Pole
Content-Encoding
Pole hlavičky Content-Encoding se používá
pro identifikaci typu kódování přenášeného obsahu. Content-Encoding
umožňuje kompresi přenášeného obsahu podle specifikovaného algoritmu
(např. x-gzip).
Pole Content-Length
Pole hlavičky
Content-Length specifikuje velikost těla zprávy. Udává se v desítkové
soustavě. V případě příkazu HEAD udává velikost dat, která by byla
přenesena příkazem GET. Jakákoli velikost větší nebo rovná nule je
platná.
Pole Content-Type
Pole hlavičky
Content-Type popisuje MIME typ média těla přenášené zprávy. Nebo v
případě příkazu HEAD typ média těla zprávy, která by se načetla
příkazem GET. Typickým příkladem je typ "text/html".
Pole
Date
Pole hlavičky Date definuje datum a čas, kdy zpráva
vznikla (nikoli datum vzniku dokumentu). Používá se zde syntaxe
popsané v RFC 822[5].
Pole Expires
Pole hlavičky
Expires obsahuje datum a čas, po kterém se data mají považovat za
neplatná. Aplikace po uplynutí této doby nesmí ukládat data do cache.
Jestliže je datum a čas stejný nebo dřívější než datum a čas
specifikovaný v poli Date, nesmí příjemce data ukládat do cache. Pole
Expires nemůže být použito k nucenému obnovení dat ze serveru.
Pole
From
Pole hlavičky From může obsahovat údaje o internetové
emailové adrese uživatele, který pracuje s klientskou aplikací.
Používá se pro účely protokolování, nikoli autorizace.
Pole
If-Modified-Since
Pole hlavičky If-Modified-Since se může
odeslat jako součást požadavku klienta při použití metody GET. Pokud
nebyl požadovaný dokument změněn od data a času specifikovaného tímto
polem, server nebude odesílat vyžadovaná data, ale pošle stavový kód
304 (not modified) bez jakéhokoli těla zprávy. V opačném případě
odesílá server data jako při normálním použití metody GET.
Pole
Last-Modified
Pole hlavičky Last-Modified definuje datum a
čas poslední změny požadovaného dokumentu.
Pole Location
Pole hlavičky Location obsahuje přesnou adresu URL, na které je
uložen zdrojový dokument. Pro stavové kódy 300-399 musí pole Location
obsahovat adresu URL preferovanou serverem pro automatické
přesměrování. Je dovoleno používat pouze absolutní URL adresy.
Pole
Pragma
Pole hlavičky Pragma se využívá pro direktivy závislé
na konkrétní implementaci. Mohou být požadovány jak po klientu, tak i
serveru. Všechny direktivy Pragma specifikují volitelné chování
protokolu. Jednou z obvyklých direktiv Pragma je "no-cache",
která znamená, že se data nemají ukládat do cache.
Pole
Referer
Pole hlavičky Referer může být odesíláno jako součást
požadavku klienta. Umožňuje serveru identifikovat, ze které URL
adresy byl požadovaný zdroj vyžádán. Toto pole umožňuje serveru
generovat seznam zpětných referencí o URL adresách, ze kterých se ke
zdroji přistupovalo. Využívá se zejména při zpětném hledání
neexistujících odkazů a při účtování příjmů z reklamy.
Pole
Server
Pole hlavičky Server je odesíláno jako součást
odpovědi serveru. Pole obsahuje informace o HTTP serveru, který
odpovídá na požadavky. Pole rozděleno na část product a comment.
Pole User-Agent
Pole hlavičky User-Agent se
odesílá jako součást požadavku. Pole obsahuje informace o typu
uživatelského agenta (web browseru). Některé proxy servery připojují
své informace do tohoto pole.
Pole WWW-Authenticate
Pole hlavičky WWW-Authenticate musí být součástí odpovědi 401
(Unauthorized) serveru. Obsah indikuje, jaký typ autentizace je
vyžadován.
Pole požadavku Accept Pole hlavičky Accept může být
použito ke specifikování typu dat v odpovědi. Accept může být použito
pro indikaci, že požadavek je omezen na malou množinu požadovaných
typů jako je třeba vložený obrázek.
Pole požadavku
Accept-Charset
Pole hlavičky Accept-Charset indikuje, kterou
znakovou sadu má při odpovědi server použít.
Pole
požadavku Accept-Encoding Pole hlavičky Accept-Encoding je
podobné poli Accept, ale omezuje kódování obsahu zprávy (např. gzip).
Pole požadavku Accept-Language
Pole hlavičky
Accept-Language je podobné poli Accept, ale omezuje množinu národních
jazyků, které jsou preferované v odpovědi (např. Accept-Language:
da)(preferuji dánštinu).
Pole odpovědi Accept-Ranges
Pole hlavičky Accept-Ranges umožňuje serveru indikovat rozsah
přijímaných dotazů.
Pole odpovědi Age
Pole
hlavičky Age sděluje odesílateli odhad množství času, po který potrvá
vygenerování odpovědi na serveru. Odpověď v cache je "čerstvá"
pokud její položka age nepřesáhla její životnost.
Pole
dotazu i odpovědi Cache-Control Pole hlavičky Cache-Control se
používání ke specifikování podmínek, kterým se musí podrobit všechny
mechanizmy zajišťující cachování. Podmínky zamýšlejí specifikovat
chování, aby zamezily cache nepřesné zprostředkování dotazu či
odpovědi.
Pole dotazu i odpovědi Connection
Pole
hlavičky Connection umožňuje odesílateli specifikovat nastavení která
jsou požadována pro vlastní připojení, a nesmí být přenášena přes
proxy pro budoucí připojení.
Pole Content-MD5
Pole hlavičky Content-MD5 obsahuje MD5
otisk obsahu zprávy.
Pole ETag
Pole hlavičky ETag
definuje přívěšek(tag) pro připojenou entitu. Pole hlavičky použité s
ETag jsou popsány detailněji v RFC 2068.
Pole dotazu Host
Pole hlavičky Host specifikuje Internetového Hosta (záznam z DNS)
a číslo portu zdroje, který odesílá požadavek. Pole Host musí
reprezentovat síťovou adresu zdrojového serveru nebo brány, branou
jako původní URL. Toto umožňuje zdrojovému serveru nebo bráně
rozlišovat mezi vnitřními vícevýznamovými URL (jako je root "/"),
URL serveru s více URL (na jednom serveru může pracovat více domén,
např. www.jinak.cz, www.infocity.cz, www.elektrostyl.cz pracují na
jednom serveru a tudíž jsou reprezentovány i jednou IP adresou).
Pole Last-Modified
Pole hlavičky Last-Modified
obsahuje datum a čas kdy byly data naposledy změněny.
Pole
dotazu Max-Forwards
Pole hlavičky Max-Forwards může být
použito s příkazem TRACE k omezení počtu proxy nebo brán přes které
požadavek přechází. Toto může být užitečné když se v datovém kanálu
vyskytne smyčka nebo chyba.
Pole odpovědi
Proxy-Authenticate
Pole hlavičky Proxy-Authenticate musí být
součásti odpovědi na 407 (Proxy Authentication Required). Hodnota
pole se skládá z vybídnutí, které indikuje autentizační mechanismus,
a parametrů použitelných pro proxy.
Pole dotazu
Proxy-Authorization
Pole hlavičky Proxy-Authorization
dovoluje klientu identifikovat sám sebe (nebo uživatele) k proxy,
která vyžaduje autentizaci.
Pole odpovědi Public
Pole
hlavičky Public obsahuje seznam metod (příkazů) podporovaných
serverem. Význam tohoto pole je informovat příjemce o možnostech
serveru s ohledem na neobvyklé metody.
Pole odpovědi
Retry-After
Pole hlavičky Retry-After může být použito se
zprávou 503 (Service Unavailable). Indikuje dobu po kterou se
očekává, že bude služba nedostupná. Hodnota tohoto pole může být
zapsána jako absolutní datum a čas nebo relativní doba ve vteřinách.
Pole dotazu i odpovědi Transfer-Encoding
Pole
hlavičky Transfer-Encoding indikuje jaký (pokud nějaký) typ
transformace byl použit na tělo zprávy pro zajištění bezpečnosti mezi
odesílatelem a příjemcem. Toto pole má jiný význam oproti
Content-Encoding ve které kódování je vlastnost zprávy nikoli entity.
Pole dotazu i odpovědi Upgrade
Pole hlavičky
Upgrade umožňuje klientovi specifikovat jaký přídavný komunikační
protokol je podporován a bude moci být použit pokud server najde
příslušný na přepnutí protokolů. Server musí použít pole Upgrade s
odpovědí 101 (Switching Protocols).
Pole dotazu i odpovědi
Via
The Via general-header musí být použito bránami a proxy k
indikaci protokolů a příjemců mezi klientem a serverem při požadavku,
a mezi server klientem při odpovědi. Je analogické s polem "Received"
RFC 822 a zamýšlí se používat pro sledování přeposílání zpráv, a
identifikaci použitých protokolů odesílatelů během celého doručení
zprávy.
Pole odpovědi Warning
Pole hlavičky
Warning se používá k přenosu dodatečných informací o stavu odpovědi,
které nemohou být odvozeny ze stavového kódu.
Kromě
vyjmenovaných polí hlavičky existují ještě další, ke kterým je možno
získat bližší informace v RFC 2068.
Pole Content-Base
Content-Language
Content-Location
Pole
Content-Range
Pole požadavku If-Match
If-None-Match
If-Range
If-Unmodified-Since
Range
Vary
Námět na příklady:
Vysvětlete k
čemu slouží pole hlavičky protokolu HTTP.
Námět na příklady:
Jaká jsou
pravidla pro formát dotazů a odpovědí při použití příkazů protokolu
HTTP?