9.8. Porte

Un indirizzo IP indica a quale host è destinato un pacchetto. Un host moderno esegue molti programmi contemporaneamente – un browser web, un client di chat, una videochiamata, un task di backup – e ciascuno di essi invia e riceve pacchetti in parallelo. Il livello IP non ha modo di distinguerli; consegna semplicemente ogni pacchetto in arrivo all“«host». Qualcosa deve decidere quale pacchetto appartiene a quale programma.

Il numero di porta è la risposta. Ogni pacchetto al livello di trasporto trasporta due campi aggiuntivi oltre all’intestazione IP: una porta sorgente e una porta di destinazione. Ciascuna è un intero a 16 bit, quindi ci sono 65535 numeri di porta possibili per host. Combinata con l’indirizzo IP, la porta identifica un endpoint specifico all’interno di un host – la conversazione specifica di un programma specifico.

Un singolo riquadro host sulla destra con un indirizzo IP etichettato in alto. Tre programmi all'interno dell'host sono etichettati come "server HTTP", "videochiamata", "client di chat", ciascuno collegato a un diverso numero di porta etichettato come 80, 5004 e 4321 rispettivamente. Tre frecce arrivano all' host dalla rete, ciascuna contrassegnata con una porta di destinazione; ogni freccia atterra sul programma corrispondente.

Molti programmi condividono un unico indirizzo IP; la porta di destinazione instrada ogni pacchetto in arrivo verso quello giusto.

9.8.1. Porte ben note

I primi 1024 numeri di porta sono riservati per convenzione ai servizi standard. Alcuni che il lettore incontrerà:

  • 22 – SSH (il protocollo Secure Shell, usato per il login remoto cifrato).

  • 53 – DNS, il Domain Name System (trattato in Nomi e DNS).

  • 80 – HTTP, l’Hypertext Transfer Protocol – il protocollo non cifrato del web.

  • 123 – NTP, il Network Time Protocol (il modo in cui i dispositivi impostano i loro orologi da un time server).

  • 443 – HTTPS, HTTP trasportato su TLS (Transport Layer Security, l’involucro di cifratura standard per i protocolli internet) – il protocollo dietro ogni pagina web che mostra un’icona a forma di lucchetto nel browser.

La convenzione è ciò che rende possibile a un browser connettersi a http://example.com senza specificare una porta – assume la 80 perché è la porta ben nota per l’HTTP. Una camera che si connette a un server web fa lo stesso.

Sopra la 1024, i numeri di porta non hanno restrizioni e qualsiasi programma può rivendicarne uno. I server di database (5432 per PostgreSQL, 3306 per MySQL), gli application server e i protocolli personalizzati si collocano tutti da qualche parte nell’intervallo più alto.

9.8.2. Porte effimere

I server ascoltano su una porta nota. I client usano una porta diversa sulla propria estremità, scelta nuovamente per ogni connessione in uscita.

Quando la camera si connette a un server web sulla porta 443, la conversazione avviene tra

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

La <some-port> è una porta effimera – MicroPython sceglie un numero inutilizzato da un intervallo alto, lo usa per la durata della connessione e lo rilascia in seguito. Lo script non deve preoccuparsi di quale numero sia stato scelto; se ne occupa il livello socket.

9.8.3. Ascoltare vs dialogare

Il ruolo che una porta svolge dipende da quale lato della conversazione si trova. Due casi distinti:

  • Una porta in ascolto appartiene a un programma che vuole ricevere connessioni non sollecitate. Il programma dice a MicroPython «qualsiasi pacchetto in arrivo indirizzato a me sulla porta 80 è mio» e attende. I server fanno questo.

  • Una porta connessa appartiene a un programma che vuole avviare una conversazione. Il programma sceglie (o chiede a MicroPython di scegliere) una porta effimera, invia un pacchetto con quella come porta sorgente e la porta ben nota del server come destinazione, e usa la stessa coppia di porte per il resto della conversazione.

Un singolo programma può fare entrambe le cose contemporaneamente, tenendo porte diverse per ciascun ruolo. Una camera potrebbe ascoltare sulla porta 8000 per connessioni HTTP in entrata da un’interfaccia utente di configurazione e mantenere una connessione HTTPS in uscita verso un server remoto sulla porta 443. I due ruoli non interferiscono – ogni conversazione è identificata dalla quadrupla completa (src IP, src port, dst IP, dst port), e non esistono due conversazioni che condividono la stessa quadrupla.

9.8.4. Cosa sbloccano le porte

Con le porte al loro posto, il livello di trasporto può finalmente risolvere il problema della consegna da programma a programma. Un pacchetto ora trasporta informazioni sufficienti per essere instradato non solo verso l”host giusto (l’indirizzo IP) ma verso il socket giusto all’interno di quell’host (il numero di porta).

Le due pagine successive trattano le due varianti che il livello di trasporto offre oltre a tale indirizzamento: UDP (lo User Datagram Protocol – ogni pacchetto indipendente, senza garanzie) e TCP (il Transmission Control Protocol – un flusso connesso, affidabile e ordinato).