9.8. Porty#
IP adresa říká, kterému hostiteli je paket určen. Moderní hostitel provozuje mnoho programů najednou – webový prohlížeč, chatovací klient, videohovor, zálohovací úlohu – a každý z nich paralelně odesílá a přijímá pakety. IP vrstva je nedokáže od sebe rozlišit; každý příchozí paket prostě předá „hostiteli“. Něco musí rozhodnout, který paket patří kterému programu.
Odpovědí je číslo portu. Každý paket na transportní vrstvě nese kromě IP hlavičky dvě další pole: zdrojový port a cílový port. Každé je 16bitové celé číslo, takže na jednoho hostitele existuje 65535 možných čísel portů. V kombinaci s IP adresou port identifikuje jeden konkrétní koncový bod uvnitř hostitele – jednu konkrétní konverzaci konkrétního programu.
Mnoho programů sdílí jednu IP adresu; cílový port směruje každý příchozí paket ke správnému z nich.#
9.8.1. Dobře známé porty#
Prvních 1024 čísel portů je podle konvence vyhrazeno pro standardní služby. Několik, se kterými se čtenář setká:
22 – SSH (protokol Secure Shell, používaný pro šifrované vzdálené přihlášení).
53 – DNS, Domain Name System (popsán na stránce Jména a DNS).
80 – HTTP, Hypertext Transfer Protocol – nešifrovaný protokol webu.
123 – NTP, Network Time Protocol (jak zařízení nastavují své hodiny podle časového serveru).
443 – HTTPS, HTTP přenášené přes TLS (Transport Layer Security, standardní šifrovací obal pro internetové protokoly) – protokol stojící za každou webovou stránkou, která v prohlížeči zobrazuje ikonu zámku.
Tato konvence je tím, co umožňuje prohlížeči připojit se k http://example.com bez uvedení portu – předpokládá 80, protože to je dobře známý port pro HTTP. Kamera připojující se k webovému serveru dělá totéž.
Nad 1024 jsou čísla portů neomezená a může si je nárokovat jakýkoli program. Databázové servery (5432 pro PostgreSQL, 3306 pro MySQL), aplikační servery a vlastní protokoly se všechny nacházejí někde ve vyšším rozsahu.
9.8.2. Dočasné porty#
Servery naslouchají na známém portu. Klienti používají na své straně jiný port, zvolený nově pro každé odchozí spojení.
Když se kamera připojí k webovému serveru na portu 443, konverzace probíhá mezi
camera IP : <some-port> <--> server IP : 443
<some-port> je dočasný port – MicroPython zvolí nepoužité číslo z vysokého rozsahu, použije ho po dobu trvání spojení a poté ho uvolní. Skript se nemusí starat o to, které číslo bylo zvoleno; soketová vrstva se o to postará.
9.8.3. Naslouchání versus komunikace#
Úloha, kterou port plní, závisí na tom, na které straně konverzace se nachází. Dva odlišné případy:
Naslouchající port patří programu, který chce přijímat nevyžádaná spojení. Program řekne MicroPythonu „jakékoli příchozí pakety adresované mně na port 80 jsou moje“ a čeká. Tohle dělají servery.
Připojený port patří programu, který chce zahájit konverzaci. Program zvolí (nebo požádá MicroPython, aby zvolil) dočasný port, odešle paket s tímto portem jako zdrojovým a s dobře známým portem serveru jako cílovým a pro zbytek konverzace používá stejnou dvojici portů.
Jediný program může dělat obojí najednou a držet pro každou roli jiné porty. Kamera by mohla naslouchat na portu 8000 pro příchozí HTTP spojení z konfiguračního uživatelského rozhraní a zároveň držet odchozí HTTPS spojení ke vzdálenému serveru na portu 443. Tyto dvě role se navzájem neovlivňují – každá konverzace je identifikována úplnou čtveřicí (src IP, src port, dst IP, dst port) a žádné dvě konverzace nesdílejí stejnou čtveřici.
9.8.4. Co porty odemykají#
S porty na svém místě může transportní vrstva konečně vyřešit problém doručování od programu k programu. Paket nyní nese dostatek informací k tomu, aby byl směrován nejen ke správnému hostiteli (IP adresa), ale i ke správnému soketu uvnitř tohoto hostitele (číslo portu).
Následující dvě stránky popisují dvě varianty, které transportní vrstva nad tímto adresováním nabízí: UDP (User Datagram Protocol – každý paket nezávislý, žádné záruky) a TCP (Transmission Control Protocol – spojený, spolehlivý, uspořádaný proud).