Protokol HTTP

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Vytvoření kostry stránky.)
 
(Doplněn postup komunikace, hlavičky a metody.)
Řádka 3: Řádka 3:
 
== Protokol HTTP  ==
 
== Protokol HTTP  ==
 
* Protokol HTTP popisuje postup klienta a serveru při stahování obsahu webových stránek.
 
* Protokol HTTP popisuje postup klienta a serveru při stahování obsahu webových stránek.
* Klientem je v tomto případě internetový prohlížeč uživatele, serverem je aplikace Apache, nginx, IIS či jiná, která poskytuje klientům obsah webových stránek.
+
* Klientem je v tomto případě internetový prohlížeč uživatele.
 +
* Serverem je serverová aplikace Apache, nginx, IIS či jiná, která naslouchá požadavkům a jako odpověď poskytuje klientům obsah webových stránek.
  
* Protokol je ''[[Protokol#Stavové a bezestavové protokoly|bezestavový]]''. Nevyužívá tedy služeb relační vrstvy. Každý požadavek se řeší zcela nezávisle na předchozích požadavcích.
+
* Protokol HTTP je ''[[Protokoly#Stavové a bezestavové protokoly|bezestavový]]''. Každý požadavek se řeší zcela nezávisle na předchozích požadavcích.
  
  
Řádka 14: Řádka 15:
 
# Uživatel zadá adresu do adresního řádku prohlížeče.
 
# Uživatel zadá adresu do adresního řádku prohlížeče.
 
# Pro navázání spojení se serverem je třeba získat IP adresu serveru.
 
# Pro navázání spojení se serverem je třeba získat IP adresu serveru.
# Prohlížeč proto osloví DNS server
+
# Prohlížeč proto osloví DNS server a&nbsp;přeloží doménové jméno na IP adresu (například '''<code>www.oauh.cz</code> &rarr; <code>212.111.4.142</code>''').
:* DNS server přeloží textovou adresu na IP adresu (například '''www.oauh.cz => 212.111.4.142''').
+
  
<div class="Poznamka">Tato komunikace ještě přímo nesouvisí s protokolem HTTP, využíváme zde [[Protokol DNS]].</div>
+
<div class="Poznamka">Tato komunikace ještě přímo nesouvisí s protokolem HTTP, využíváme zde [[Protokoly aplikační vrstvy#DNS|Protokoly aplikační vrstvy]].</div>
  
 
=== HTTP: Odeslání příkazu a&nbsp;přijetí odpovědi ===
 
=== HTTP: Odeslání příkazu a&nbsp;přijetí odpovědi ===
# Prohlížeč naváže spojení se servrem pomocí IP adresy (využije služeb protokolu TCP).
+
# Prohlížeč naváže spojení se serverem pomocí IP adresy (využije služeb protokolu TCP).
# => prohlížeč pošle příkaz '''GET nazev_stranky.htm'''
+
# Prohlížeč pošle příkazy, které požaduje provést
#* K požadavku může připojit ještě další informace: ''hlavičky protokolu HTTP''.
+
#: Příklad: <code>GET nazev_stranky.htm HTTP/1.1</code>
:; <= server najde soubor a pošle zpět obsah souboru (HTML kód)
+
# K&nbsp;požadavku může připojit ještě další informace: ''hlavičky protokolu HTTP''. Jejich počet je volitelný.
# Prohlížeč vykreslí stránku podle popisu v jazyce HTML
+
# Některé hlavičky mohou být povinné (například hlavička <code>Host</code> v&nbsp;protokolu HTTP 1.1).
 +
# Požadavek končí prázdným řádkem.
  
 
=== Zpracování požadavku: dynamické stránky ===
 
=== Zpracování požadavku: dynamické stránky ===
Řádka 32: Řádka 33:
  
 
=== HTTP: Odpověď serveru ===
 
=== HTTP: Odpověď serveru ===
 +
# Jako odpověď server vrátí verzi protokolu, stavový kód a&nbsp;textový popis stavu.
 +
#* Příklad: <code>HTTP/1.1 200 OK</code> ... požadavek skončil bez chyby
 +
#* Příklad: <code>HTTP/1.1 404 Page Not Found</code> ... požadovaný soubor na serveru nebyl nalezen.
 +
# Následují [[#Hlavičky HTTP|hlavičky]] odpovědi. (Počet je volitelný.)
 +
# Poté server připojí prázdný řádek a&nbsp;data souboru, který byl požadován.
 
# Přijetím odpovědi komunikace končí.
 
# Přijetím odpovědi komunikace končí.
 
# Protože je protokol bezstavový, může server zapomenout veškeré informace. Příští spojení bude zcela nezávislé na tomto.
 
# Protože je protokol bezstavový, může server zapomenout veškeré informace. Příští spojení bude zcela nezávislé na tomto.
 +
# Prohlížeč následně zobrazí stránku podle popisu v jazyce HTML
 +
 +
<div class="Poznamka">Protokol HTTP verze 1.1 umožňuje po ukončení komunikace (po přijetí odpovědi) ihned poslat další požadavek bez ukončení spojení. Server tedy spojení neuzavírá ihned po odeslání odpovědi, ale až s&nbsp;nějakým zpožděním.</div>
  
 
=== Obrázky a jiné objekty ve stránkách ===
 
=== Obrázky a jiné objekty ve stránkách ===
 
* Pokud je v popisu stránky obrázek či jiný vložený objekt, prohlížeč naváže nové spojení a vyžádá si stažení souboru s obrázkem (či jiným objektem).
 
* Pokud je v popisu stránky obrázek či jiný vložený objekt, prohlížeč naváže nové spojení a vyžádá si stažení souboru s obrázkem (či jiným objektem).
  
<div class="Poznamka">Protokol HTTP verze 1.1 umožňuje po ukončení komunikace (po přijetí odpovědi) ihned poslat další požadavek bez ukončení spojení. Server tedy spojení neuzavírá ihned po odeslání odpovědi, ale až s&nbsp;nějakým zpožděním.</div>
 
  
  
  
 +
== Metody HTTP ==
 +
* Protokol HTTP používá k&nbsp;popisu požadavků tzv. ''metody'' (methods).
 +
* Můžeme si je představit jako textové „příkazy“, které posíláme serveru.
 +
* Je tedy docela snadné si komunikaci prohlédnout a&nbsp;případně hledat chyby.
 +
* Na druhou stranu to ale také nahrává útočníkům, proto dnes mnoho serverů vyžaduje využití SSL pro šifrování komunikace.
 +
* Při použití „https“ se požadavky protokolu HTTP posílají šifrovaným kanálem. Textový zápis metod zůstává stejný, ale celá komunikace je nyní zašifrovaná.
  
== Příkazy HTTP ==
 
  
 +
=== Metoda GET ===
 +
* Základní požadavek, který slouží ke stažení webové stránky, používá metodu GET.
 +
* Syntaxe: <code>GET ''složka/soubor'' HTTP/1.1</code>
 +
* Jako druhý parametr se uvádí verze protokolu HTTP. Dnes nejběžněji HTTP 1.1.
 +
* Na dalších řádcích následují [#Hlavičky protokolu HTTP| hlavičky protokolu HTTP].
 +
* Požadavek končí prázdným řádkem.
  
=== Příkaz GET ===
 
  
 
+
=== Další metody ===
=== Další příkazy ===
+
 
* Kromě stahování obsahu webových stránek dnes lze protokol HTTP využít i&nbsp;pro další účely včetně modifikace obsahu webových stránek.
 
* Kromě stahování obsahu webových stránek dnes lze protokol HTTP využít i&nbsp;pro další účely včetně modifikace obsahu webových stránek.
* K&nbsp;těmto účelům slouží další příkazy:
+
* K&nbsp;těmto účelům slouží další metody:
  
 
; <code>POST</code>
 
; <code>POST</code>
 +
* Požadavek s&nbsp;desláním formulářových dat.
 +
* Neukládá se do historie prohlížeče.
 
; <code>PUT</code>
 
; <code>PUT</code>
 +
* Nahrání souboru na server.
 
; <code>DELETE</code>
 
; <code>DELETE</code>
 +
* Smazání souborů na serveru.
  
  
  
 
== Hlavičky protokolu HTTP ==
 
== Hlavičky protokolu HTTP ==
 +
* Jedná se o&nbsp;doplňující textové informace, které posílají server nebo prohlížeč.
 +
* Jednotlivé hlavičky se oddělují koncem řádku.
 +
* Více o&nbsp;hlavičkách HTTP viz: [https://en.wikipedia.org/wiki/List_of_HTTP_header_fields Wikipedia &rarr; List_of_HTTP_header_fields]
  
 +
; Příklady hlaviček prohlížeče
 +
* Tyto hlavičky může posílat prohlížeč k&nbsp;serveru.
 +
* <code>Host: www.oauh.cz</code>
 +
** Z&nbsp;jaké domény vyžadujeme informace (na dnešním hostingu může běžně na jedné IP adrese běžet více domén).
 +
* <code>User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0</code>
 +
** Označení prohlížeče, který bude stránku zobrazovat.
  
  
== Verze protokolu HTTP ==
+
; Příklady hlaviček serveru
 +
* Doplňující informace pro prohlížeč.
 +
* <code>Date: Sun, 03 May 2020 14:27:01 GMT</code>
 +
** Datum zpracování požadavku.
 +
* <code>Server: Apache/2.2.12 (Linux/SUSE)</code>
 +
** Serverová aplikace, která požadavek zpracovala.
 +
* <code>Content-Type: text/html; charset=iso-8859-1</code>
 +
** Typ obsahu odesílaného souboru.
 +
* <code>Expires: Thu, 01 Dec 1994 16:00:00 GMT</code>
 +
** Kdy obsah přestává být platný a&nbsp;měl by se stáhnout znovu.
 +
* <code>Location: /pub/WWW/People.html</code>
 +
** Přesměrování &mdash; klient by měl místo této stránky stáhnout stránku z&nbsp;uvedené URL.
  
 +
 +
 +
 +
 +
== Verze protokolu HTTP ==
 +
* Dnes je nejběžnější použití HTTP/1.1 (publikováno 1997, aktualizováno 2014) nebo HTTP/2 (publikováno 2015).
 +
* Starší verze 0.9 a&nbsp;1.0 už se dnes běžně nepoužívají.
 +
* Postupně se pracuje na specifikaci HTTP/3.
  
  
Řádka 89: Řádka 138:
 
* Připravený požadavek (včetně prázdného řádku na konci) zkopírujte do schránky.
 
* Připravený požadavek (včetně prázdného řádku na konci) zkopírujte do schránky.
 
* Spusťte program PuTTY a&nbsp;vyplňte údaje pro připojení k&nbsp;serveru.
 
* Spusťte program PuTTY a&nbsp;vyplňte údaje pro připojení k&nbsp;serveru.
** Server: ''www.oauh.cz''
+
{| class="wikitable"
** Port: 80
+
|--
 +
| Server: || <code>www.oauh.cz</code>
 +
|--
 +
| Port: || <code>80</code>
 +
|--
 +
| Connection-type: || <code>raw</code>
 +
|--
 +
|}
 +
 
 +
* Aby se po ukončení spojení okno neuzavřelo, zatrhněte navíc:
 +
 
 +
{| class="wikitable"
 +
|--
 +
| Close window on exit: || <code>Never</code>
 +
|--
 +
|}
 
* Ihned po navázání spojení klikněte do okénka PuTTY pravým tlačítkem.
 
* Ihned po navázání spojení klikněte do okénka PuTTY pravým tlačítkem.
 
** Tím provedete operaci „paste“: odešlete otevřeným spojením celý obsah schránky Windows (ve schránce máte připravený požadavek HTTP GET).
 
** Tím provedete operaci „paste“: odešlete otevřeným spojením celý obsah schránky Windows (ve schránce máte připravený požadavek HTTP GET).
 
* Zkontrolujte odpověď.
 
* Zkontrolujte odpověď.
** Odpověď serveru by měla začínat: <code>200 OK</code>
+
** Odpověď serveru by měla začínat: <code>HTTP/1.1 200 OK</code>
 
** Pokud je odpověď jiná, najděte chybový kód a&nbsp;upravte postup.
 
** Pokud je odpověď jiná, najděte chybový kód a&nbsp;upravte postup.
 +
** Dnes servery často vyžadují šifrované spojení přes HTTPS. V&nbsp;tom případě bude nejspíš odpověď serveru začínat: <code>HTTP/1.1 301 Moved permanently</code> a&nbsp;bude následovat hlavička <code>Location:</code>, která udává, na jaké adrese najdete stránku nyní (https://...).
 
</div>
 
</div>
  

Verze z 4. 5. 2020, 11:03


Obsah

Protokol HTTP


Chování klienta a serveru

Příprava na stažení webové stránky

  1. Uživatel zadá adresu do adresního řádku prohlížeče.
  2. Pro navázání spojení se serverem je třeba získat IP adresu serveru.
  3. Prohlížeč proto osloví DNS server a přeloží doménové jméno na IP adresu (například www.oauh.cz212.111.4.142).
Tato komunikace ještě přímo nesouvisí s protokolem HTTP, využíváme zde Protokoly aplikační vrstvy.

HTTP: Odeslání příkazu a přijetí odpovědi

  1. Prohlížeč naváže spojení se serverem pomocí IP adresy (využije služeb protokolu TCP).
  2. Prohlížeč pošle příkazy, které požaduje provést
    Příklad: GET nazev_stranky.htm HTTP/1.1
  3. K požadavku může připojit ještě další informace: hlavičky protokolu HTTP. Jejich počet je volitelný.
  4. Některé hlavičky mohou být povinné (například hlavička Host v protokolu HTTP 1.1).
  5. Požadavek končí prázdným řádkem.

Zpracování požadavku: dynamické stránky

HTTP: Odpověď serveru

  1. Jako odpověď server vrátí verzi protokolu, stavový kód a textový popis stavu.
    • Příklad: HTTP/1.1 200 OK ... požadavek skončil bez chyby
    • Příklad: HTTP/1.1 404 Page Not Found ... požadovaný soubor na serveru nebyl nalezen.
  2. Následují hlavičky odpovědi. (Počet je volitelný.)
  3. Poté server připojí prázdný řádek a data souboru, který byl požadován.
  4. Přijetím odpovědi komunikace končí.
  5. Protože je protokol bezstavový, může server zapomenout veškeré informace. Příští spojení bude zcela nezávislé na tomto.
  6. Prohlížeč následně zobrazí stránku podle popisu v jazyce HTML
Protokol HTTP verze 1.1 umožňuje po ukončení komunikace (po přijetí odpovědi) ihned poslat další požadavek bez ukončení spojení. Server tedy spojení neuzavírá ihned po odeslání odpovědi, ale až s nějakým zpožděním.

Obrázky a jiné objekty ve stránkách



Metody HTTP


Metoda GET


Další metody

POST
PUT
DELETE


Hlavičky protokolu HTTP

Příklady hlaviček prohlížeče


Příklady hlaviček serveru



Verze protokolu HTTP


Úkol: Prohlédněte si komunikaci

Úkol
Prohlédněte si komunikaci mezi klientem a serverem
  1. Najděte stránku WebSniffer.cc.
  2. Zadejte nějakou URL adresu do okénka.
  3. Web sniffer vám vypíše kompletní komunikaci mezi vaším prohlížečem a serverem.
  4. Zobrazen máte požadavek s odeslanými hlavičkami i přijatou odpověď včetně hlaviček, které poskytuje server.


Úkol: Odeslání požadavku ručně

Úkol: Vyzkoušejte si ručně, co musí udělat prohlížeč!
  • Vyberte si web, ke kterému se zkusíte připojit. (V našem příkladu píšeme www.oauh.cz. Vy napište skutečnou URL adresu bez HTTP.
  • Do poznámkového bloku (či jiného čistě textového editoru) si připravte požadavek:
GET / HTTP 1.1
Host: www.oauh.cz
<prázdný řádek>
  • Připravený požadavek (včetně prázdného řádku na konci) zkopírujte do schránky.
  • Spusťte program PuTTY a vyplňte údaje pro připojení k serveru.
Server: www.oauh.cz
Port: 80
Connection-type: raw
  • Aby se po ukončení spojení okno neuzavřelo, zatrhněte navíc:
Close window on exit: Never
  • Ihned po navázání spojení klikněte do okénka PuTTY pravým tlačítkem.
    • Tím provedete operaci „paste“: odešlete otevřeným spojením celý obsah schránky Windows (ve schránce máte připravený požadavek HTTP GET).
  • Zkontrolujte odpověď.
    • Odpověď serveru by měla začínat: HTTP/1.1 200 OK
    • Pokud je odpověď jiná, najděte chybový kód a upravte postup.
    • Dnes servery často vyžadují šifrované spojení přes HTTPS. V tom případě bude nejspíš odpověď serveru začínat: HTTP/1.1 301 Moved permanently a bude následovat hlavička Location:, která udává, na jaké adrese najdete stránku nyní (https://...).
Obvyklé chyby
  • Chybějící hlavička Host:
  • Špatná velikost písmen (dodržte malá a velká písmena podle vzoru).
  • Chybějící prázdný řádek na konci (požadavek končí prázdným řádkem — dvěma dvojicemi CR+LF).
Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje