Hypertextový prenosový protokol

**Hypertextový prenosový protokol** (angl. *hypertext transfer protocol*), skr. **HTTP**, je protokol na prenos html dokumentov medzi servermi a klientmi služby WWW. Pôsobí ako primárna metóda prepravy informácií na world wide webe. Pôvodný účel bol poskytovať prostriedky na publikáciu a získavanie HTML stránok.

Vývoj HTTP koordinovalo World Wide Web Consortium a pracovné skupiny Internet Engineering Task Force, čím vytvorili sadu dokumentov RFC, predovšetkým RFC 2616 definujúci HTTP/1.1, dnes používanú verziu HTTP.

HTTP je protokol definujúci *požiadavky* a *odpovede* medzi *klientmi* a *servermi*. HTTP klient (označovaný ako *user agent*), ako webový prehliadač zvyčajne začne požiadavku nadviazaním TCP spojenia na určenom porte vzdialeného stroja (štandardne port 80). HTTP server počúvajúci na danom porte čaká, kým klient pošle reťazec s požiadavkou ako „GET / HTTP/1.1“ (ktorý žiada o zaslanie štartovacej stránky webservera) nasledovaný sériou hlavičiek podobných MIME opisujúcich detaily požiadavky a nasledovaných telesom ľubovoľných údajov. Niektoré hlavičky sú nepovinné, zatiaľ čo verzia HTTP/1.1 niektoré vyžaduje (ako názov stroja). Po prijatí požiadavky server pošle reťazec s odpoveďou ako „200 OK“ nasledovanou hlavičkami spolu so samotnou správou, ktorej telo tvorí obsah požadovaného súboru, chybové hlásenie alebo iná informácia.

## Charakteristika a vývoj
Protokol všeobecne definuje pravidlá medzi dvoma partnermi. Definuje tvar prenášaných informácií, možnosti a náležitosti, požiadavky a odpovede. Hypertext Transfer Protokol (HTTP) je protokol aplikačnej vrstvy. Používa sa pre distribuované hypermediálne informačné systémy. V rámci služby WWW sa používa od roku 1991. Slúži na výmenu HTML dokumentov medzi klientom a serverom. WWW server sa často nazýva aj HTTP serverom.

Existuje viac verzií protokolu:
* HTTP/0.9:
** prvá verzia
** používa sa od roku 1990, dnes sa už nepoužíva
** otázka: iba metóda GET, bez dodatočných (meta-) informácií
** odpoveď: požadovaný dokument, takisto bez dodatočných informácií
** po prenesení odpovede sa spojenie ukončí
* HTTP/1.0
** definovaný v RFC 1945 z roku 1996
** mnoho rozšírení predchádzajúcej verzie; spätne kompatibilný
** otázka: pridané metódy POST a HEAD
** voliteľné ďalšie hlavičky v upravenom formáte MIME (napr. k dotazu: Date, Authorization, From, If-Modified-Since, Referer, User-Agent; k telu dotazu: Content-Encoding, Content-Length)
** voliteľné telo dotazu (entity body)
** odpoveď: pridaná hlavička:
** informácia o stave (status) odpovede
** voliteľné ďalšie hlavičky v upravenom formáte MIME [5] (napr. k odpovedi: Date, Location, WWW-Authenticate; k telu odpovede: Content-Encoding, Content-Length)
** voliteľné telo odpovede (entity body)
* HTTP/1.1
** definovaný v RFC 2616 z roku 1999, dnes najčastejšie používaný
** dopĺňa možnosti HTTP/1.0 (hierarchické proxy, kešovanie, trvalé spojenia, virtuálne servery), spätne kompatibilný
** otázka: pridané metódy OPTIONS, PUT, DELETE, TRACE, CONNECT (ktoré sú zriedka používané)
** takmer dvojnásobný počet hlavičiek oproti HTTP/1.0

Protokol HTTP je postavený na princípe otázka-odpoveď. Táto komunikácia prebieha medzi serverom a klientom. Každá aktivita musí byť vyvolaná klientom, pričom komunikácia so serverom prebieha cez TCP (používa sa port 80, ktorý ale nie je podmienkou).

Úplná otázka-odpoveď musí mať špecifikovanú metódu, URI (absolútna alebo relativná cesta k súboru alebo úplné URL dokumentu). Niekedy nasleduje po hlavičkách aj telo otázky oddelené jedným prázdnym riadkom.

Server podporujúci protokol 1.0 vráti odpoveď a spojenie ihneď uzavrie. Protokol 1.1 vytvára tzv. perzistentné spojenie a preto servery podporujúce verziu 1.1 spojenie hneď neuzavrú, ale chvíľu čakajú na ďalšie príkazy. Klient tak môže pokračovať v otázkach na ostatné prvky HTML stánky a spojenie ukončiť sám.

Odpoveď obsahuje verziu protokolu, kód odpovede a textovú hlášku odpovede. Ďalej obsahuje hlavičky, prázdny riadok (oddeľovač) a väčšinou aj telo odpovede.

## Druhy žiadostí HTTP
Zvyčajne sa nazývajú metódy.
* **GET** Zďaleka najbežnejší typ žiadosti. Žiada o zdroj uvedením jeho URL
* **POST** Podobne ako GET, okrem toho, že je pridané telo správy zvyčajne obsahujúce dvojice kľúč-hodnota z HTML formulára a taktiež na upload súborov.
* **PUT** Používa sa na úpravu, resp. editáciu údajov špecifikovaného objektu, podobne ako POST, pričom POST vytvára nový objekt (nové dáta) a PUT upravuje tieto dáta.
* **DELETE** Zriedka implementované. Zmazanie zdroja.
* **HEAD** Podobné GET, okrem toho, že sa nepožaduje telo správy, iba hlavičky. Používa sa na získavanie metainformácií o dokumente.
* **TRACE** Odošle kópiu obdržanej požiadavky späť odosielateľovi, takže klient môže zistiť, čo na požiadavke menia alebo pridávajú servery, ktorými táto prechádza.
* **OPTIONS** Vracia HTTP metódy, ktoré daný webserver podporuje. Je možné použiť na otestovanie funkcionality servera.
* **CONNECT** Zriedka implementované, na použitie s proxy serverom, ktorý sa môže zmeniť na SSL tunel.

HTTP sa líši od iných na TCP založených protokolov ako napr. FTP v tom, že spojenia sa zvyčajne ukončia potom, ako sa dokončí vykonávanie požiadavky alebo série požiadaviek. Tento dizajn ho robí ideálnym protokolom pre web, kde stránky často odkazujú na ďalšie stránky na iných serveroch. Príležitostne to spôsobuje problémy webovým návrhárom, keďže chýbajúce perzistentné spojenie si vynucuje alternatívne prístupy udržiavania stavovej informácie o používateľovi. Zvyčajne na to používajú tzv. cookies.

HTTPS je zabezpečená verzia HTTP. Na ochranu dát používa SSL/TLS. Štandardný port služby je TCP port 443. HTTPS je vhodné aj v prípadoch, kedy je autentifikovaný len jeden koniec spojenia -- server. To je typický prípad pri HTTP transakciách cez internet.

Lokáciu dokumentov na webserveri udáva Uniform Resource Locator (URL). Táto adresa má syntax vyvinutú pre vytváranie odkazov na webstránky.

## Príklad
Dolu je príklad konverzácie medzi HTTP klientom a HTTP serverom bežiacom na www.google.com, porte 80.

**Klientská požiadavka**:

```
GET / HTTP/1.1
Host: www.google.com
User-Agent: Opera/9.80 (Windows NT 5.1; U; sk) Presto/2.5.29 Version/10.60
Accept-Charset: UTF-8,*
```


(nasledovaná znakom nového riadku, v tvare znaku carriage return nasledovaného znakom line feed.)

Adresa stroja je určená na rozlíšenie rôznych DNS názvov pre jedinú IP adresu. Kým v HTTP/1.0 bola táto hlavička nepovinná, HTTP/1.1 ju vyžaduje.

**Odpoveď servera**:

```
HTTP/1.1 200 OK
Content-Length: 3059
Server: GWS/2.0
Date: Sat, 11 Jan 2003 02:44:04 GMT
Content-Type: text/html
Cache-control: private
Set-Cookie: PREF=ID=73d4aef52e57bae9:TM=1042253044:LM=1042253044:S=SMCc_HRPCQiqyX9j;
  expires=Sun, 17-Jan-2038 19:14:07 GMT; path=/; domain=.google.com
Connection: keep-alive
```


(nasledovaná prázdnym riadkom a zdrojovým textom HTML tvoriacim webstránku Google.)

## Perzistentnosť spojenia
Pri HTTP/1.0 klient pošle požiadavku serveru, server pošle odpoveď späť klientovi a následne sa spojenie ukončí. HTTP/1.1 však podporuje perzistentné spojenia. To umožňuje klientovi poslať požiadavku a dostať odpoveď a následne tým istým spojením posielať ďalšie požiadavky a prijímať ďalšie odpovede. Tým sa znižuje relatívna réžia TCP. Je tiež možné poslať viacero (zvyčajne dve) požiadavky pred obdržaním odpovede. Táto metóda sa nazýva „pipelining“.

## Referencie

## Pozri aj
* Uniform Resource Locator
* HTTP proxy

## Iné projekty

## Externé odkazy
* Špecifikácia HTTP/1.1 (Jún 1999) RFC2616
* Errata špecifikácie HTTP/1.1
* Originálny návrh protokolu HTTP z roku 1992 od Tima Berners-Lee
* Zoznam stavových kódov HTTP 
* HTTP sekvenčný diagram 

Kategória:Internetové protokoly
Kategória:Hypertext

Kategória:W3C štandardy