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).