9.8. Porty

Adres IP mówi, do którego hosta przeznaczony jest pakiet. Nowoczesny host uruchamia jednocześnie wiele programów – przeglądarkę internetową, komunikator, rozmowę wideo, zadanie kopii zapasowej – a każdy z nich równolegle wysyła i odbiera pakiety. Warstwa IP nie ma jak ich odróżnić; po prostu przekazuje każdy nadchodzący pakiet „do hosta”. Coś musi zdecydować, który pakiet należy do którego programu.

Odpowiedzią jest numer portu. Każdy pakiet w warstwie transportowej niesie dwa dodatkowe pola poza nagłówkiem IP: port źródłowy i port docelowy. Każdy z nich jest 16-bitową liczbą całkowitą, więc na hosta przypada 65535 możliwych numerów portów. W połączeniu z adresem IP port identyfikuje jeden konkretny punkt końcowy wewnątrz hosta – konkretną konwersację konkretnego programu.

Po prawej stronie pojedyncze pudełko hosta z adresem IP oznaczonym u góry. Trzy programy wewnątrz hosta są oznaczone jako "serwer HTTP", "rozmowa wideo", "komunikator", każdy podłączony do innego numeru portu oznaczonego odpowiednio 80, 5004 oraz 4321. Trzy strzałki docierają do hosta z sieci, każda oznaczona portem docelowym; każda strzałka trafia na pasujący program.

Wiele programów współdzieli jeden adres IP; port docelowy kieruje każdy nadchodzący pakiet do właściwego z nich.

9.8.1. Porty powszechnie znane (well-known)

Pierwsze 1024 numery portów są umownie zarezerwowane dla standardowych usług. Kilka z nich, na które czytelnik się natknie:

  • 22 – SSH (protokół Secure Shell, używany do szyfrowanego zdalnego logowania).

  • 53 – DNS, czyli Domain Name System (omówiony na stronie Nazwy i DNS).

  • 80 – HTTP, czyli Hypertext Transfer Protocol – nieszyfrowany protokół sieci WWW.

  • 123 – NTP, czyli Network Time Protocol (sposób, w jaki urządzenia ustawiają zegary na podstawie serwera czasu).

  • 443 – HTTPS, czyli HTTP przenoszony przez TLS (Transport Layer Security, standardowa warstwa szyfrowania dla protokołów internetowych) – protokół stojący za każdą stroną internetową, która pokazuje ikonę kłódki w przeglądarce.

To właśnie ta umowa umożliwia przeglądarce połączenie z http://example.com bez podawania portu – zakłada port 80, ponieważ jest to powszechnie znany port dla HTTP. Kamera łącząca się z serwerem WWW robi to samo.

Powyżej 1024 numery portów nie są ograniczone i dowolny program może je zająć. Serwery baz danych (5432 dla PostgreSQL, 3306 dla MySQL), serwery aplikacji oraz protokoły niestandardowe – wszystkie funkcjonują gdzieś w wyższym zakresie.

9.8.2. Porty efemeryczne

Serwery nasłuchują na znanym porcie. Klienci używają innego portu po swojej stronie, wybieranego na nowo dla każdego połączenia wychodzącego.

Gdy kamera łączy się z serwerem WWW na porcie 443, konwersacja toczy się między

camera IP : <some-port>     <-->     server IP : 443

<some-port> to port efemeryczny – MicroPython wybiera nieużywany numer z wysokiego zakresu, używa go przez czas trwania połączenia, a następnie zwalnia. Skrypt nie musi przejmować się tym, który numer został wybrany; obsługuje to warstwa gniazd.

9.8.3. Nasłuchiwanie a komunikacja

Rola, jaką odgrywa port, zależy od tego, po której stronie konwersacji się znajduje. Dwa odrębne przypadki:

  • Port nasłuchujący należy do programu, który chce odbierać niezamówione połączenia. Program mówi MicroPythonowi „wszelkie przychodzące pakiety zaadresowane do mnie na port 80 są moje” i czeka. Robią to serwery.

  • Port połączony należy do programu, który chce zainicjować konwersację. Program wybiera (lub prosi MicroPythona o wybranie) port efemeryczny, wysyła pakiet z tym portem jako źródłowym i powszechnie znanym portem serwera jako docelowym, a następnie używa tej samej pary portów przez resztę konwersacji.

Pojedynczy program może robić jedno i drugie naraz, utrzymując różne porty dla każdej roli. Kamera może nasłuchiwać na porcie 8000 na przychodzące połączenia HTTP z interfejsu konfiguracyjnego oraz utrzymywać wychodzące połączenie HTTPS do zdalnego serwera na porcie 443. Te dwie role nie kolidują ze sobą – każda konwersacja jest identyfikowana przez pełną czwórkę (src IP, src port, dst IP, dst port) i żadne dwie konwersacje nie współdzielą tej samej czwórki.

9.8.4. Co odblokowują porty

Mając porty na miejscu, warstwa transportowa może wreszcie rozwiązać problem dostarczania od programu do programu. Pakiet niesie teraz wystarczającą informację, aby zostać skierowanym nie tylko do właściwego hosta (adres IP), ale i do właściwego gniazda wewnątrz tego hosta (numer portu).

Następne dwie strony omawiają dwa warianty, jakie warstwa transportowa oferuje na bazie tego adresowania: UDP (User Datagram Protocol – każdy pakiet niezależny, bez gwarancji) oraz TCP (Transmission Control Protocol – połączeniowy, niezawodny, uporządkowany strumień).