# 13 • Internet

- internetové zdroje, URL, mime type, relativní / absolutní cesta, převod IP a domény

# Internet

**Internet** je celosvětová **decentralizovaná** síť propojených počítačových sítí, které spolu komunikují pomocí protokolové rodiny **TCP/IP**. Žádný centrální vlastník neexistuje, jednotlivé sítě patří různým provozovatelům (poskytovatelé, univerzity, firmy, státy), spojuje je dohoda na společných protokolech.

### Historie ve třech mezníkách

| Rok | Událost |
| --- | --- |
| 1969 | **ARPANET** — první uzly mezi UCLA a Stanford. 29. října odeslána první zpráva ("LOGIN"), server spadl po druhém písmenu. |
| 1983 | Přechod ARPANETu na **TCP/IP** — datum považované za technické "narození" internetu. |
| 1989–1991 | **Tim Berners-Lee** v CERNu navrhuje a spouští **WWW** — HTTP protokol, HTML, první prohlížeč i server. |

### Internet ≠ WWW (klasický chyták)

| Pojem | Co to je |
| --- | --- |
| **Internet** | Fyzická a logická infrastruktura - "síť sítí", protokoly TCP/IP. |
| **WWW (Web)** | **Jedna ze služeb** běžící na internetu - hypertextové dokumenty přenášené přes HTTP/HTTPS. |
| **TCP** | Transportní protokol - spolehlivý přenos, kontrola pořadí, opětovné odeslání ztracených paketů. |
| **IP** | Adresování a směrování paketů mezi zařízeními. Verze IPv4 a IPv6. |

### Další služby běžící na internetu

E-mail (**SMTP**, **IMAP**, **POP3**), přenos souborů (**FTP**, **SFTP**), vzdálená správa (**SSH**), překlad jmen (**DNS**), čas (**NTP**), telefonie (**VoIP/SIP**), streamování, IoT (**MQTT**), real-time komunikace (**WebSocket**, **WebRTC**).

### TCP/IP model: 4 vrstvy

| Vrstva | Co dělá | Příklady |
| --- | --- | --- |
| **Aplikační** | Konkrétní služba | HTTP, SMTP, DNS, SSH, FTP |
| **Transportní** | Doručení mezi procesy | **TCP** (spolehlivý), **UDP** (rychlý, bez kontrol) |
| **Internetová** | Adresace, směrování mezi sítěmi | **IP**, ICMP (ping) |
| **Vrstva síťového rozhraní** | Fyzický přenos po lince | Ethernet, Wi-Fi
 |

# Internetové zdroje

- cokoli, co lze v síti adresovat a získat: dokument, soubor, služba, datový tok
- Každý zdroj má:
    - **Jednoznačnou adresu** (URI / URL)
    - **Typ obsahu** (MIME type)
    - **Protokol**, kterým se k němu přistupuje (HTTP, HTTPS, FTP, …)

### Typy zdrojů

| Kategorie | Příklady |
| --- | --- |
| **Statické dokumenty** | HTML, CSS, JS, obrázky, PDF |
| **Dynamické zdroje** | API endpointy (REST, GraphQL), serverem generované stránky |
| **Multimédia** | Video (MP4, WebM), audio (MP3, OGG), HLS/DASH streamy |
| **Služby** | E-mail, cloud storage, databáze přes API |

### URI vs. URL vs. URN

| Pojem | Význam | Příklad |
| --- | --- | --- |
| **URI** *(Uniform Resource Identifier)* | Obecný identifikátor zdroje - **nadřazený pojem**. | Libovolné URL nebo URN. |
| **URL** *(Uniform Resource Locator)* | URI, které popisuje **kde** zdroj je. | `https://example.com/index.html` |
| **URN** *(Uniform Resource Name)* | URI, které popisuje **jméno** zdroje nezávisle na umístění. | `spotify:artist:413GiX0PBqVdux5JihvMyA` |
- každé URL je URI, ale ne každé URI je URL. V praxi se s URN setkáš zřídka, většinou jde o URL.

## URL — anatomie podrobně

`https://user:pass@www.example.com:443/sekce/stranka.html?dotaz=ahoj&id=5#kotva
└─┬─┘   └───┬───┘ └──────┬──────┘ └┬┘ └────────┬────────┘ └──────┬──────┘ └─┬─┘
 schéma  userinfo       host      port        cesta             query     fragment`

| Část | Popis | Příklad |
| --- | --- | --- |
| **Schéma** (protokol) | Způsob komunikace | `http`, `https`, `ftp`, `mailto`, `file`, `ws`, `data` |
| **Userinfo** *(nepovinné)* | Přihlašovací údaje (dnes se nepoužívá z bezpečnostních důvodů) | `user:heslo@` |
| **Host** | Doménové jméno nebo IP adresa | `www.example.com`, `192.168.1.1`, `[::1]` |
| **Port** *(nepovinné)* | Číslo portu na hostiteli | `:80`, `:443`, `:8080` |
| **Cesta** *(path)* | Umístění zdroje na serveru | `/sekce/stranka.html` |
| **Query string** | Parametry oddělené `&`, začíná `?` | `?id=5&lang=cz` |
| **Fragment** *(kotva)* | Odkaz na část stránky, klientská část — **server ji nevidí** | `#uvod` |

### URL encoding (percent-encoding)

Speciální znaky v URL se musí zakódovat — URL může obsahovat jen omezenou sadu ASCII znaků. Vše ostatní se převede na `%XX`, kde `XX` je hexadecimální hodnota bytu v UTF-8:

| Znak | Kódování |
| --- | --- |
| mezera | `%20` (nebo `+` v query stringu) |
| `?` | `%3F` |
| `&` | `%26` |
| `#` | `%23` |
| `ě` | `%C4%9B` (2 byty v UTF-8) |

`https://example.com/hled%C3%A1n%C3%AD?q=Karel%20%C4%8Capek`
****

### Časté URL schémata

| Schéma | Použití |
| --- | --- |
| `http://`, `https://` | Webové stránky |
| `ftp://`, `sftp://` | Přenos souborů |
| `mailto:` | Otevře e-mailový klient — `mailto:axo@ax4.cz?subject=Hi` |
| `tel:` | Vytočí číslo — `tel:+420123456789` |
| `file://` | Lokální soubor |
| `data:` | Inline data - `data:image/png;base64,iVBORw0...` |
| `ws://`, `wss://` | WebSocket |

# Absolutní vs. relativní adresa

| Typ | Popis | Příklad |
| --- | --- | --- |
| **Absolutní** | Plná cesta včetně schématu a domény | `https://example.com/img/logo.png` |
| **Kořenově relativní** | Začíná `/`, vztažená ke **kořeni domény** | `/img/logo.png` |
| **Dokumentově relativní** | Vztažená k aktuálnímu dokumentu | `img/logo.png`, `../styl.css` |

### Speciální zápisy v relativních cestách

- `./` — aktuální složka *(často volitelné)*
- `../` — nadřazená složka
- `../../` — o dvě úrovně výš

### Kdy použít co

- **Absolutní** — odkazy na cizí weby, jednoznačnost (e-maily, RSS, sdílení).
- **Dokumentově relativní** — vlastní obsah uvnitř složky.
- **Kořenově relativní** — vlastní obsah napříč stránkami; **bezpečné při přesunu** mezi localhost / staging / produkcí, protože doména se mění, ale struktura projektu ne.

# MIME typy (Media Types)

**MIME** *(Multipurpose Internet Mail Extensions)* - standard původně z roku 1991 pro přílohy v e-mailu, dnes používaný **všude**, kde se přenáší obsah po síti. Říká **jaký typ dat** je v souboru, aby je klient správně zpracoval.

Server posílá MIME typ v HTTP hlavičce `Content-Type`, prohlížeč podle něj rozhodne, jak data zobrazit, stáhnout, nebo spustit.

**Formát:** `typ/podtyp` (např. `text/html`, `image/png`).

### Hlavní kategorie

| Kategorie | Popis | Příklady |
| --- | --- | --- |
| `text/*` | Textové formáty | `text/html`, `text/css`, `text/plain`, `text/javascript` |
| `image/*` | Obrázky | `image/png`, `image/jpeg`, `image/svg+xml`, `image/webp` |
| `audio/*` | Audio | `audio/mpeg`, `audio/ogg`, `audio/wav` |
| `video/*` | Video | `video/mp4`, `video/webm` |
| `application/*` | Binární / strukturovaná data | `application/json`, `application/pdf`, `application/zip`, `application/wasm` |
| `multipart/*` | Více částí v jedné zprávě | `multipart/form-data` (upload souborů) |

### Nejčastější MIME typy

| Přípona | MIME typ |
| --- | --- |
| `.html` | `text/html` |
| `.css` | `text/css` |
| `.js` | **`text/javascript`** *(`application/javascript` je dnes obsolete)* |
| `.json` | `application/json` |
| `.xml` | `application/xml` |
| `.jpg`, `.jpeg` | `image/jpeg` |
| `.png` | `image/png` |
| `.svg` | `image/svg+xml` |
| `.pdf` | `application/pdf` |
| `.zip` | `application/zip` |
| `.mp4` | `video/mp4` |
| `.wasm` | `application/wasm` |

### Příklad HTTP odpovědi

```
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 1234

<!DOCTYPE html>
<html>...
```

### Proč na MIME typu záleží

Pokud server odešle špatný MIME typ:

- prohlížeč může **zobrazit zdrojový kód** místo stránky,
- **odmítnout spustit JavaScript** (moderní prohlížeče vyžadují `text/javascript` u modulů),
- nesprávně otevřít soubor (např. PDF jako text).

**Bezpečnost:** prohlížeč dělá tzv. **MIME sniffing** — pokusí se uhodnout typ podle obsahu, pokud server neposlal `Content-Type`. To je historicky zdrojem útoků (uploaduješ `.jpg`, který je ve skutečnosti HTML s JS). Proto se posílá hlavička `X-Content-Type-Options: nosniff`, která tomu zabrání.

# IP adresy

**IP adresa** je číselný identifikátor každého zařízení v síti. Dvě verze:

| Verze | Délka | Formát | Příklad | Adresní prostor |
| --- | --- | --- | --- | --- |
| **IPv4** | 32 bitů | čtyři čísla 0–255 oddělená tečkou | `192.168.1.1` | ~4,3 miliardy |
| **IPv6** | 128 bitů | osm hexadecimálních skupin oddělených `:` | `2001:0db8:85a3::8a2e:0370:7334` | ~3,4 × 10³⁸ |

### IPv4 - vyčerpání

IANA (centrální registr) přidělila **poslední volné bloky v únoru 2011**, regionální registry pak postupně (RIPE pro Evropu v listopadu 2019). Adresy se dnes recyklují, obchodují a maskují přes **NAT** a **CGNAT** (Carrier-Grade NAT — NAT na úrovni poskytovatele, takže za jednou veřejnou IP může být tisíce zákazníků).

### IPv6 - pomalý přechod

Standardizována 1998 (RFC 2460), dnes nese **cca 40–45 % globálního provozu**. Zkrácený zápis: nuly lze vynechat (`2001:db8::1`), nejdelší řadu nul nahradit `::` (jen jednou v adrese).

### Veřejné vs. privátní adresy

| Typ | Význam | Rozsahy (IPv4, RFC 1918) |
| --- | --- | --- |
| **Veřejné** | Unikátní v celém internetu, směrovatelné | vše ostatní |
| **Privátní** | Pouze v lokální síti (LAN), neroutují se na internet | `10.0.0.0/8`, `172.16.0.0/12`, `192.168.0.0/16` |
| **Loopback** | Vlastní zařízení | `127.0.0.1` (IPv4), `::1` (IPv6) |

Překlad mezi privátními a veřejnými adresami zajišťuje **NAT** (Network Address Translation) na routeru - zařízení v domácí síti sdílejí jednu veřejnou IP poskytovatele.
****

### CIDR notace (zápis sítí)

**CIDR** *(Classless Inter-Domain Routing)* zápis říká, **kolik bitů z adresy tvoří síťovou část**. Lomítko za adresou určuje délku prefixu:

| Zápis | Maska | Počet adres | Použití |
| --- | --- | --- | --- |
| `/8` | `255.0.0.0` | ~16 milionů | velká korporátní síť |
| `/16` | `255.255.0.0` | 65 536 | menší organizace |
| `/24` | `255.255.255.0` | 256 *(254 použitelných)* | typická domácí/malá síť |
| `/32` | `255.255.255.255` | 1 | jedna konkrétní adresa |

Příklad: `192.168.1.0/24` = síť, ve které prvních 24 bitů (`192.168.1.`) je síťová část a posledních 8 bitů adresuje 256 hostitelů (z toho 2 rezervované — network `192.168.1.0` a broadcast `192.168.1.255`).

## Porty

**Port** je číselný identifikátor služby (procesu) na zařízení. IP adresa identifikuje **stroj**, port konkrétní **aplikaci** běžící na něm.

> Analogie: **IP = budova, port = byt**.
> 

### Tři rozsahy portů (IANA)

| Rozsah | Název | Použití |
| --- | --- | --- |
| **0–1023** | Well-known | Systémové služby, vyžadují admin práva |
| **1024–49151** | Registered | Aplikace registrované u IANA |
| **49152–65535** | Dynamic / Ephemeral | Klient si bere náhodně pro odchozí spojení |

### Důležité porty k zapamatování

| Port | Služba |
| --- | --- |
| **80** | HTTP |
| **443** | HTTPS |
| **22** | SSH |
| **21** / 20 | FTP (control / data) |
| **25** | SMTP (odesílání pošty) |
| **143** | IMAP |
| **110** | POP3 |
| **53** | DNS (UDP, fallback TCP) |
| **67** / 68 | DHCP (server / klient) |
| **3306** | MySQL |
| **5432** | PostgreSQL |
| **6379** | Redis |
| **8080** | HTTP alternativní (proxy, dev servery) |

## DNS: překlad doménových jmen na IP

Lidé si pamatují jména (`google.com`), počítače pracují s čísly (`142.250.187.132`). 

**DNS** *(Domain Name System)* je **distribuovaná hierarchická databáze**, která mapuje doménová jména na IP adresy.

### Postup DNS dotazu krok za krokem

1. Uživatel zadá `www.seznam.cz` do prohlížeče.
2. OS zkontroluje **lokální cache** a soubor `hosts` (`/etc/hosts` na Linuxu/Macu, `C:\Windows\System32\drivers\etc\hosts` na Windows).
3. Pokud nenajde, dotáže se **DNS resolveru** (typicky u poskytovatele, nebo veřejný — `8.8.8.8` Google, `1.1.1.1` Cloudflare).
4. Resolver má vlastní cache. Pokud v ní není, postupně dotáže hierarchii:
    - **Root server** (`.`) — kdo spravuje `.cz`?
    - **TLD server** (`.cz`) — kdo spravuje `seznam.cz`?
    - **Autoritativní server** (pro `seznam.cz`) — jaká je IP `www.seznam.cz`?
5. Resolver vrátí IP klientovi a uloží do cache (podle TTL záznamu).
6. Prohlížeč naváže TCP spojení s touto IP a stáhne stránku.

`Klient → DNS resolver → Root (.) → TLD (.cz) → Autoritativní ([seznam.cz](http://seznam.cz/)) → IP`

### Typy DNS dotazů

- **Rekurzivní** — klient se ptá resolveru, resolver má za úkol vrátit hotovou odpověď (i kdyby musel běhat napříč celou hierarchií).
- **Iterativní** — server odpovídá "neznám, ale zeptej se támhle" — typicky mezi resolverem a autoritativními servery.

### Typy DNS záznamů

| Záznam | Význam |
| --- | --- |
| **A** | IPv4 adresa pro doménu |
| **AAAA** | IPv6 adresa pro doménu |
| **CNAME** | Alias na jinou doménu (`www.example.com → example.com`) |
| **MX** | Mailový server pro doménu, s prioritou |
| **NS** | Autoritativní jmenné servery domény |
| **TXT** | Libovolný text (ověřování vlastnictví, SPF, DKIM) |
| **PTR** | Reverzní záznam (IP → doména) |
| **SOA** | "Start of Authority" — metadata zóny |

### Moderní rozšíření

- **DoH** *(DNS over HTTPS)* — DNS dotazy uvnitř šifrovaného HTTPS, znesnadňuje odposlech a manipulaci poskytovatelem.
- **DoT** *(DNS over TLS)* — totéž přes čistý TLS, port 853.
- **DNSSEC** — kryptografický podpis záznamů proti podvržení

# Domény a jejich struktura

**Doména** je textová adresa zdroje na internetu. Má **stromovou hierarchii** — čte se **zprava doleva**.

`www  .  google  .  com  .
 │       │         │     │
 │       │         │     └── kořenová doména (root, ".") — obvykle se nepíše
 │       │         └──────── TLD (Top-Level Domain)
 │       └────────────────── SLD (Second-Level Domain)
 └────────────────────────── subdoména (3. úroveň)`

| Úroveň | Příklad | Popis |
| --- | --- | --- |
| **Root** | `.` | Vrchol hierarchie, spravuje 13 root serverů (logicky — ve skutečnosti stovky přes anycast) |
| **TLD** | `.cz`, `.com`, `.org` | Domény nejvyšší úrovně |
| **SLD** | `google`, `seznam`  | Druhá úroveň - registruje si firma/osoba |
| **Subdoména** | `www`, `mail`, `api` |  |

### Typy TLD

| Typ | Zkratka | Příklady | Popis |
| --- | --- | --- | --- |
| **Národní** | ccTLD | `.cz`, `.sk`, `.de`, `.uk` | Country Code TLD — určuje stát |
| **Generické** | gTLD | `.com`, `.org`, `.net`, `.edu`, `.gov` | Obecné, podle účelu |
| **Nové gTLD** | — | `.shop`, `.tech`, `.app`, `.ai` | Od roku 2014, tematické |
| **Sponzorované** | sTLD | `.museum`, `.aero`, `.jobs` | Pro specifické komunity |
| **Infrastrukturní** | — | `.arpa` | Technické účely (reverzní DNS) |

### FQDN

**FQDN** *(Fully Qualified Domain Name)* — plně kvalifikované doménové jméno **včetně tečky na konci**, která reprezentuje root:

`www.example.com.`

V praxi tečku skoro nikdy nepíšeme, ale technicky je tam.
****

### Správa domén

- **Globálně:** **ICANN** *(Internet Corporation for Assigned Names and Numbers)* — koordinuje TLD a kořenovou zónu.
- **Pro .cz:** **CZ.NIC** — sdružení, které spravuje národní doménu, provozuje DNS infrastrukturu a vyvíjí Knot DNS.
- **Konkrétní doménu** si registruješ u **registrátora** (Wedos, Forpsi, Namecheap…), který je akreditovaný u ICANN/CZ.NIC.

### IDN - diakritika v doménách

**IDN** *(Internationalized Domain Names)* umožňují použít Unicode znaky v doménách, např. `háčky.cz`. Interně se ale kódují do ASCII pomocí **Punycode**:

`ř.vercel.app →  xn--hga.vercel.app`

Prefix `xn--` značí, že jde o Punycode-zakódovanou doménu.

# HTTP a HTTPS

### HTTP verze

| Verze | Rok | Klíčové vlastnosti |
| --- | --- | --- |
| **HTTP/1.1** | 1997 | Textový protokol, persistent connections (keep-alive), pipelining (málo používaný) |
| **HTTP/2** | 2015 | **Binární**, multiplexing (víc requestů přes jedno spojení), komprese hlaviček (HPACK), server push |
| **HTTP/3** | 2022 | Postavený na **QUIC** místo TCP (běží na UDP), rychlejší handshake, odolný proti packet loss na mobilní síti |

### HTTP metody

| Metoda | Význam | Bezpečná? | Idempotentní? |
| --- | --- | --- | --- |
| **GET** | Stáhne zdroj | ✓ | ✓ |
| **POST** | Vytvoří / odešle data | ✗ | ✗ |
| **PUT** | Nahradí zdroj | ✗ | ✓ |
| **PATCH** | Částečná úprava | ✗ | ✗ (často) |
| **DELETE** | Smaže zdroj | ✗ | ✓ |
| **HEAD** | Jako GET, ale jen hlavičky | ✓ | ✓ |
| **OPTIONS** | Vrátí dostupné metody | ✓ | ✓ |

### HTTP status kódy

| Kategorie | Význam | Příklady |
| --- | --- | --- |
| **1xx** | Informační | `100 Continue` |
| **2xx** | Úspěch | `200 OK`, `201 Created`, `204 No Content` |
| **3xx** | Přesměrování | `301 Moved Permanently`, `302 Found`, `304 Not Modified` |
| **4xx** | Chyba klienta | `400 Bad Request`, `401 Unauthorized`, `403 Forbidden`, `404 Not Found`, `429 Too Many Requests` |
| **5xx** | Chyba serveru | `500 Internal Server Error`, `502 Bad Gateway`, `503 Service Unavailable`, `504 Gateway Timeout` |

### HTTPS = HTTP + TLS

- **HTTPS** šifruje obsah pomocí **TLS** *(Transport Layer Security)*.
- **SSL** *(Secure Sockets Layer)* — historický předchůdce, **od roku 2015 deprecated** (RFC 7568) kvůli zranitelnostem (POODLE, BEAST). Dnes se používá výhradně **TLS** — aktuálně TLS 1.3 (2018) a TLS 1.2.
- Server prokazuje identitu **certifikátem** vydaným **certifikační autoritou** (Let's Encrypt, DigiCert, …).
- Port **443**.

## Cesta od kliknutí ke stránce — vše propojené

Zadám do prohlížeče `https://www.seznam.cz`. Co se stane?

1. **Parsování URL** — prohlížeč rozdělí URL na schéma (`https`), host (`www.seznam.cz`), port (`443` default), cestu (`/`).
2. **DNS resolution** — OS zkontroluje cache a `hosts`. Pokud nenajde, pošle dotaz resolveru. Ten projde hierarchií Root → `.cz` → `seznam.cz` a vrátí IP adresu. Cache si IP uloží podle TTL.
3. **TCP handshake** — prohlížeč naváže spojení na získanou IP, port 443. **Tříkrokový handshake** (SYN → SYN-ACK → ACK).
4. **TLS handshake** — klient a server se domluví na šifrovacích algoritmech, server pošle certifikát, klient ho ověří proti CA. Vytvoří se sdílený klíč pro symetrické šifrování.
5. **HTTP request** — prohlížeč pošle:

```
GET / HTTP/2
Host: www.seznam.cz
User-Agent: Mozilla/5.0 ...
Accept: text/html,...
```

**6. HTTP response** — server vrátí:

```
 HTTP/2 200 OK
 Content-Type: text/html; charset=UTF-8
 Content-Length: 45231
 
 <!DOCTYPE html>...
```

**7. Parsování HTML** — prohlížeč buduje DOM strom a zároveň objevuje další zdroje k načtení.

1. **Načítání podzdrojů** — pro každý `<link>`, `<script>`, `<img>` se spustí další request (paralelně, multiplexovaně přes HTTP/2). Server u každého pošle příslušný **MIME type** v `Content-Type`, prohlížeč podle toho rozhodne, co s daty udělat.
2. **Vykreslení** — prohlížeč zkombinuje DOM + CSSOM, spočítá layout, vykreslí pixely, spustí JavaScript.