{"id":283,"date":"2020-04-05T23:23:56","date_gmt":"2020-04-05T21:23:56","guid":{"rendered":"http:\/\/tech.sosthe.sk\/?p=283"},"modified":"2020-04-06T16:48:01","modified_gmt":"2020-04-06T14:48:01","slug":"2-3-aplikacny-protokol-http","status":"publish","type":"post","link":"http:\/\/tech.sosthe.sk\/index.php\/2020\/04\/05\/2-3-aplikacny-protokol-http\/","title":{"rendered":"2.3.\u2002Aplika\u010dn\u00fd protokol HTTP"},"content":{"rendered":"<p><strong>HTTP: hypertext transfer protocol<\/strong>, verzia HTTP 1.0:\u00a0<a href=\"http:\/\/www.ietf.org\/rfc\/rfc1945.txt\">RFC 1945<\/a>, verzia HTTP 1.1:\u00a0<a href=\"http:\/\/www.ietf.org\/rfc\/rfc2068.txt\">RFC 2068<\/a>, verzia HTTP 2:\u00a0<a href=\"https:\/\/tools.ietf.org\/html\/rfc7540\">RFC 7540<\/a><\/p>\n<p>Protokol HTTP pou\u017e\u00edva klient\/server architekt\u00faru. Klientsky proces (HTTP klient) predstavuje webov\u00fd prehliada\u010d (Firefox, Internet Explorer, Chrome, Opera a in\u00e9), ktor\u00fd kontaktuje webov\u00fd server (Apache Web server, Microsoft IIS). HTTP klient na z\u00e1klade URL adresy zist\u00ed adresu webov\u00e9ho servera a cestu na webovom serveri k objektu, o ktor\u00fd m\u00e1 pou\u017e\u00edvate\u013e z\u00e1ujem. Objektom posielan\u00fdm cez HTTP protokol m\u00f4\u017ee by\u0165 \u010doko\u013evek. Naj\u010dastej\u0161ie ide o z\u00e1kladn\u00fd HTML s\u00fabor obsahuj\u00faci URL adresy \u010fal\u0161\u00edch objektov (obr\u00e1zkov, vide\u00ed, hudby, CSS \u0161t\u00fdlov, \u2026) v\u00fdslednej webovej str\u00e1nky, ktor\u00e9 si HTTP klient n\u00e1sledne po jednom op\u00fdta, aby zobrazil pou\u017e\u00edvate\u013eovi v\u00fdsledn\u00fa webov\u00fa str\u00e1nku.<\/p>\n<p>HTTP protokol vyu\u017e\u00edva TCP protokol transportnej vrstvy. Webov\u00fd server obvykle obsadzuje port 80. Prehliada\u010d to predpoklad\u00e1, a preto ak do URL adresy nedod\u00e1me \u010d\u00edslo portu, je automaticky pou\u017eit\u00fd port 80.<\/p>\n<p>HTTP protokol pou\u017e\u00edva dva typy spr\u00e1v, po\u017eiadavky (HTTP request) od klienta a odpovede (HTTP response) od servera.<\/p>\n<h3>2.3.1\u2002 HTTP po\u017eiadavka<\/h3>\n<p>HTTP po\u017eiadavka sa sklad\u00e1 z pr\u00edkazov\u00e9ho riadka, hlavi\u010dky a tela. Klient v pr\u00edkazovom riadku HTTP po\u017eiadavky uv\u00e1dza met\u00f3du (GET, POST, HEAD, PUT alebo DELETE), \u010das\u0165 URL adresy predstavuj\u00facu cestu v adres\u00e1roch webov\u00e9ho s\u00eddla a verziu protokolu, ktor\u00fdm chceme komunikova\u0165.<\/p>\n<p>Pr\u00edklad pr\u00edkazov\u00e9ho riadka HTTP po\u017eiadavky a jedn\u00e9ho riadka hlavi\u010dky, v ktorej \u017eiadame protokolom HTTP verzie 1.1 s\u00fabor\u00a0<em>index.html<\/em>\u00a0v adres\u00e1ri webov\u00e9ho servera\u00a0<em>\/oddelenie<\/em>\u00a0na po\u010d\u00edta\u010di\u00a0<em>www.in\u0161tit\u00facia.sk<\/em>:<\/p>\n<pre class=\"wp-block-preformatted\"><span style=\"color: #808080;\">GET \/oddelenie\/index.html HTTP\/1.1\r\nHost: www.in\u0161tit\u00facia.sk<\/span><\/pre>\n<p>\u00dapln\u00e1 URL adresa tohto s\u00faboru je\u00a0<em>www.in\u0161tit\u00facia.sk\/oddelenie\/index.html<\/em>. V pr\u00edpade, \u017ee potrebujeme \u017eiadanej webovej str\u00e1nke odovzda\u0165 aj nejak\u00e9 d\u00e1ta, z\u00edskan\u00e9 obvykle z webov\u00e9ho formul\u00e1ra, boli by ot\u00e1znikom oddelen\u00e9 od po\u017eadovan\u00e9ho s\u00faboru. Napr\u00edklad, ak posielame meno a priezvisko, tak URL adresa by vyzerala nasledovne\u00a0<em>www.in\u0161tit\u00facia.sk\/oddelenie\/index.html?meno=Peter&amp;priezvisko=Gursk%C3%BD<\/em>\u00a0a teda HTTP po\u017eiadavka by vyzerala nasledovne:<\/p>\n<pre class=\"wp-block-preformatted\"><span style=\"color: #808080;\">GET \/oddelenie\/index.html?meno=Peter&amp;priezvisko=Gursk%C3%BD@@ HTTP\/1.1\r\nHost: www.in\u0161tit\u00facia.sk\r\n<\/span><\/pre>\n<p><em>Pozn\u00e1mka: Trochu ru\u0161ivo p\u00f4sob\u00ed %C3%BD, \u010do predstavuje bin\u00e1rny k\u00f3d znaku \u201e\u00fd\u201c v UTF-8 k\u00f3dovan\u00ed \u201eprelo\u017een\u00fd\u201c do 7 bitov\u00e9ho ASCII k\u00f3dovania met\u00f3dou\u00a0<\/em>URL encoding<em>. Navy\u0161e tento riadok m\u00f4\u017ee by\u0165 in\u00fd, ak je prednastaven\u00e9 k\u00f3dovanie v prehliada\u010di in\u00e9. To, ak\u00e9 k\u00f3dovanie bolo pou\u017eit\u00e9 p\u00f4vodne, sa uv\u00e1dza ako \u010fal\u0161\u00ed z riadkov hlavi\u010dky (Accept-Charset: UTF-8,*)<\/em><\/p>\n<p>D\u00e1ta sa m\u00f4\u017eu tie\u017e odosiela\u0165 met\u00f3dou POST. V tom pr\u00edpade to, \u010do sa p\u00edsalo pri met\u00f3de GET v URL adrese za ot\u00e1znik, sa uv\u00e1dza v tele po\u017eiadavky. T\u00e1to met\u00f3da je ob\u013e\u00fabenej\u0161ia a pou\u017e\u00edvate\u013esky pr\u00edjemnej\u0161ia, ke\u010f\u017ee nezobrazuje odoslan\u00e9 d\u00e1ta z formul\u00e1ra v URL adrese (napr\u00edklad heslo).<\/p>\n<p>V skratke e\u0161te povedzme, na \u010do sa pou\u017e\u00edvaj\u00fa zvy\u0161n\u00e9 3 pr\u00edkazy. HEAD m\u00e1 rovnak\u00fa funkciu ako GET alebo POST s t\u00fdm rozdielom, \u017ee od servera nechceme v\u00fdsledn\u00fa str\u00e1nku, ale len HTTP hlavi\u010dku odpovede. Pr\u00edkaz PUT sa pou\u017e\u00edva na odosielanie s\u00faboru a pr\u00edkaz DELETE na mazanie s\u00faboru na serveri.<\/p>\n<h3>2.3.2\u2002 HTTP odpove\u010f<\/h3>\n<p>HTTP odpove\u010f sa sklad\u00e1 z riadka odpovede, hlavi\u010dky a tela. Riadok odpovede sa sklad\u00e1 z verzie protokolu, k\u00f3du stavu a koment\u00e1ra stavu vyrie\u0161enia po\u017eiadavky.<\/p>\n<p>Z\u00e1kladn\u00fdm k\u00f3dom stavu odpovede je 200 s koment\u00e1rom OK, ozna\u010duj\u00faci, \u017ee po\u017eiadavka na objekt bola \u00faspe\u0161n\u00e1 a v tele tejto odpovede je pribalen\u00fd po\u017eadovan\u00fd objekt. K\u00f3dy za\u010d\u00ednaj\u00face \u010d\u00edslom 3 obvykle znamenaj\u00fa, \u017ee str\u00e1nka bola presunut\u00e1 a v hlavi\u010dke, v \u010dasti Location, je uveden\u00e9 kam. K\u00f3dy za\u010d\u00ednaj\u00face \u010d\u00edslom 4 znamenaj\u00fa, \u017ee po\u017eadovan\u00fd objekt sa z nejak\u00e9ho d\u00f4vodu ned\u00e1 posla\u0165. K\u00f3dy za\u010d\u00ednaj\u00face \u010d\u00edslom 5 s\u00fa chybov\u00e9 stavy, s ktor\u00fdmi sa HTTP server nevedel vysporiada\u0165. Pre \u00fapln\u00fd preh\u013ead k\u00f3dov odpoved\u00ed si pozrite\u00a0<a href=\"http:\/\/www.ietf.org\/rfc\/rfc2068.txt\">RFC 2068<\/a>.<\/p>\n<h3>2.3.3\u2002 Niektor\u00e9 \u010fal\u0161ie vlastnosti HTTP protokolu<\/h3>\n<p>Protokol HTTP verzie 1.0 funguje len v\u00a0<strong>neperzistentnom re\u017eime<\/strong>. To znamen\u00e1, \u017ee server po ka\u017edej odpovedi klientovi uzavrie TCP spojenie. Ak m\u00e1 webov\u00e1 str\u00e1nka povedzme 10 obr\u00e1zkov, potrebujeme pre ka\u017ed\u00fd z nich iniciova\u0165 TCP spojenie so serverom. Protokol HTTP verzie 1.1 u\u017e umo\u017e\u0148uje pr\u00e1cu v\u00a0<strong>perzistentnom re\u017eime<\/strong>, v ktorom klient m\u00f4\u017ee v hlavi\u010dke \u0161pecifikova\u0165, aby server po odpovedi e\u0161te neuzavrel spojenie (Connection: keep-alive) a a\u017e v poslednej po\u017eiadavke pre dan\u00fa str\u00e1nku m\u00f4\u017ee (ale aj nemus\u00ed) ozn\u00e1mi\u0165 serveru, \u017ee po odpovedi na \u0148u u\u017e m\u00f4\u017ee spojenie uzavrie\u0165 (Connection: close).<\/p>\n<p>Protokol HTTP je bezstavov\u00fd. Umo\u017e\u0148uje v\u0161ak webov\u00fdm port\u00e1lom, aby si v pr\u00edpade potreby mana\u017eovali stav sami. Pre ka\u017ed\u00e9 novovytvoren\u00e9 spojenie vytvor\u00ed jedine\u010dn\u00fd identifik\u00e1tor, ktor\u00fd po\u0161le klientovi v \u010dasti hlavi\u010dky zvanej\u00a0<strong>Cookie<\/strong>. Ke\u010f klient posiela po\u017eiadavku a v hlavi\u010dke tie\u017e uvedie Cookie identifik\u00e1tor, ktor\u00fd pred t\u00fdm dostal od tohto webov\u00e9ho servera, webov\u00fd server ho skontroluje so svojou datab\u00e1zou vygenerovan\u00fdch identifik\u00e1torov a v pr\u00edpade n\u00e1jdenia zhody poskytne tento identifik\u00e1tor webov\u00e9mu port\u00e1lu, ktor\u00fd takto m\u00f4\u017ee udr\u017eiava\u0165 stav komunik\u00e1cie s dan\u00fdm klientom.<\/p>\n<h3>2.3.4\u2002 HTTP 2.0<\/h3>\n<p>Protokol HTTP 2 v\u00fdrazne zr\u00fdch\u013euje cel\u00fa komunik\u00e1ciu efekt\u00edvnej\u0161\u00edm perzistentn\u00fdm re\u017eimom. Efekt\u00edvnej\u0161ie spracovanie je umo\u017enen\u00e9 hlavne pou\u017e\u00edvan\u00edm\u00a0<strong>bin\u00e1rnych r\u00e1mcov namiesto p\u00f4vodn\u00fdch textov\u00fdch HTTP po\u017eiadaviek a odpoved\u00ed<\/strong>\u00a0ako z\u00e1kladn\u00fdch \u010dast\u00ed d\u00e1t zasielan\u00fdch v spr\u00e1vach.<\/p>\n<p>Definuje 10 typov r\u00e1mcov. HEADERS r\u00e1mec po\u017eiadavky, ako n\u00e1protivok hlavi\u010dky HTTP\/1.x po\u017eiadavky, definuje nov\u00fd pr\u00fad d\u00e1t v r\u00e1mci spojenia, ktor\u00fd m\u00e1 zabezpe\u010di\u0165 stiahnutie jedn\u00e9ho objektu. Jeden objekt je potom zo servera vysielan\u00fd v nieko\u013ek\u00fdch r\u00e1mcoch \u2013 najprv HEADERS r\u00e1mec odpovede nasledovan\u00fd r\u00e1mcami typu DATA, pr\u00edpadne aj typu CONTINUATION (pokra\u010dovanie HEADERS alebo DATA r\u00e1mca, ak hlavi\u010dka alebo d\u00e1ta s\u00fa v\u00e4\u010d\u0161ie ako maxim\u00e1lna ve\u013ekos\u0165 r\u00e1mca). Ka\u017ed\u00fd pr\u00fad d\u00e1t m\u00f4\u017ee ma\u0165 r\u00f4znu prioritu, ktor\u00e1 umo\u017en\u00ed zasielanie r\u00e1mcov jedn\u00e9ho objektu \u010dastej\u0161ie ako in\u00e9ho. \u010eal\u0161\u00edmi vychyt\u00e1vkami s\u00fa:<\/p>\n<ul>\n<li>mo\u017enos\u0165 pre server zasiela\u0165 objekty bez vy\u017eiadania, ak server predpoklad\u00e1, \u017ee prehliada\u010d bude dan\u00fd objekt potrebova\u0165,<\/li>\n<li>nastavovanie vz\u00e1jomn\u00fdch z\u00e1vislost\u00ed pr\u00fadov (ak mi nepo\u0161le\u0161 tento objekt, tak objekty na \u0148om z\u00e1visl\u00e9 tie\u017e neposielaj),<\/li>\n<li>zaslanie nastaven\u00ed servera\/prehliada\u010da v r\u00e1mci typu SETTINGS iba raz pre cel\u00e9 spojenie, namiesto uv\u00e1dzania v ka\u017edej hlavi\u010dke<\/li>\n<li>kompresia hlavi\u010diek, kde \u010fal\u0161ie hlavi\u010dky obsahuj\u00fa iba rozdiely oproti predch\u00e1dzaj\u00facim hlavi\u010dk\u00e1m<\/li>\n<li>mo\u017enos\u0165 pou\u017eitia spojenia so serverom pre viacer\u00e9 dom\u00e9ny, ak s\u00fa hostovan\u00e9 na serveri s rovnakou IP adresou<\/li>\n<li>obmedzenie menej spo\u013eahliv\u00fdch foriem \u0161ifrovania komunik\u00e1cie<\/li>\n<\/ul>\n<p>Viac o protokole HTTP 2 sa m\u00f4\u017eete do\u010d\u00edta\u0165 aj v tomto peknom \u010dl\u00e1nku na serveri\u00a0<a href=\"http:\/\/chimera.labs.oreilly.com\/books\/1230000000545\/ch12.html\">oreilly.com<\/a>, alebo krat\u0161ie, ale \u010desky v\u00a0<a href=\"http:\/\/www.root.cz\/clanky\/jak-funguje-novy-protokol-http-2\/\">\u010dl\u00e1nku Pavla Satrapy<\/a>.<\/p>\n<h3>2.3.5\u2002 Proxy server<\/h3>\n<p>Proxy server je \u0161peci\u00e1lny program, ktor\u00fd funguje ako sprostredkovate\u013e webov\u00fdch str\u00e1nok pre klienta. Ak chceme vyu\u017ei\u0165 slu\u017eby proxy servera, m\u00f4\u017eeme v prehliada\u010di nastavi\u0165 na akom po\u010d\u00edta\u010di a porte proxy server po\u010d\u00fava. Potom u\u017e v\u0161etka komunik\u00e1cia z prehliada\u010da ide cez proxy server. Pre \u00faplnos\u0165 dodajme, \u017ee \u010dast\u00e9 s\u00fa aj transparentn\u00e9 proxy servery, ktor\u00e9 funguj\u00fa \u201enevidite\u013ene\u201c tak, \u017ee cez nich je administr\u00e1torom routra presmerovan\u00e1 komunik\u00e1cia smeruj\u00faca mimo lok\u00e1lnu sie\u0165 na porty 80.<\/p>\n<p>Proxy server je vytvoren\u00fd na to, aby od\u013eah\u010dil pomal\u00e9 internetov\u00e9 pripojenia tak, \u017ee objekty, ktor\u00e9 u\u017e raz boli z internetu stiahnut\u00e9, boli prehliada\u010du poskytovan\u00e9 z cache tohto proxy servera. Je v\u0161ak prirodzen\u00e9, \u017ee webov\u00e9 str\u00e1nky menia v \u010dase svoj obsah a pou\u017e\u00edvatelia by radi videli aktu\u00e1lne str\u00e1nky. Toto je vyrie\u0161en\u00e9 cez podmienen\u00fa HTTP po\u017eiadavku na webov\u00fd server. Proxy server v pr\u00edpade, \u017ee prehliada\u010d od neho \u017eiada str\u00e1nku, ktor\u00fa m\u00e1 v cache, prid\u00e1 do hlavi\u010dky po\u017eiadavky \u010dasov\u00fa pe\u010diatku poslednej modifik\u00e1cie dan\u00e9ho objektu (If-modified-since:&lt;d\u00e1tum a \u010das&gt;). Ak server zist\u00ed, \u017ee nem\u00e1 nov\u0161iu verziu dan\u00e9ho objektu, posiela iba hlavi\u010dku s k\u00f3dom\u00a0<em>304 Not Modified<\/em>. Ak v\u0161ak m\u00e1 nov\u0161iu verziu, po\u0161le cel\u00fd objekt aj s novou \u010dasovou pe\u010diatkou poslednej zmeny.<\/p>\n<p>V s\u00fa\u010dasnosti sa proxy server \u010dasto pou\u017e\u00edva na logovanie webovej komunik\u00e1cie a aj na obmedzenie pr\u00edstupu na ur\u010dit\u00e9 webov\u00e9 str\u00e1nky, \u010do sa vyu\u017e\u00edva hlavne na ochranu mal\u00fdch det\u00ed, na \u0161kol\u00e1ch, ale \u010dasto aj vo firm\u00e1ch.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>HTTP: hypertext transfer protocol, verzia HTTP 1.0:\u00a0RFC 1945, verzia HTTP 1.1:\u00a0RFC 2068, verzia HTTP 2:\u00a0RFC 7540 Protokol HTTP pou\u017e\u00edva klient\/server architekt\u00faru. Klientsky proces (HTTP klient)&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[],"_links":{"self":[{"href":"http:\/\/tech.sosthe.sk\/index.php\/wp-json\/wp\/v2\/posts\/283"}],"collection":[{"href":"http:\/\/tech.sosthe.sk\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/tech.sosthe.sk\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/tech.sosthe.sk\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/tech.sosthe.sk\/index.php\/wp-json\/wp\/v2\/comments?post=283"}],"version-history":[{"count":2,"href":"http:\/\/tech.sosthe.sk\/index.php\/wp-json\/wp\/v2\/posts\/283\/revisions"}],"predecessor-version":[{"id":466,"href":"http:\/\/tech.sosthe.sk\/index.php\/wp-json\/wp\/v2\/posts\/283\/revisions\/466"}],"wp:attachment":[{"href":"http:\/\/tech.sosthe.sk\/index.php\/wp-json\/wp\/v2\/media?parent=283"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/tech.sosthe.sk\/index.php\/wp-json\/wp\/v2\/categories?post=283"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/tech.sosthe.sk\/index.php\/wp-json\/wp\/v2\/tags?post=283"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}