Indirizzamento: porte logiche, socket e connessioni

// obiettivi di apprendimento
Descrivere il numero di porta come intero a 16 bit e spiegare le tre categorie IANA (well-known, registered, dynamic/ephemeral)
Definire il concetto di socket come 5-tupla e spiegare perché un server può gestire N connessioni TCP simultanee sulla stessa porta
Riconoscere le porte notevoli dei principali protocolli applicativi (HTTP, HTTPS, SSH, DNS, SMTP, FTP, POP3, IMAP, DHCP)
Usare i comandi netstat e ss per visualizzare porte in ascolto e connessioni attive su un sistema Linux
📄
Slides
PDF con tabella porte e schemi socket
Scarica →
Networking & OS Anno 4 · Modulo 3 · Lezione 2

Il numero di porta — 16 bit che fanno tutto il lavoro

Una volta che il pacchetto IP raggiunge l’host corretto, chi decide a quale processo consegnarlo? Il numero di porta: un intero a 16 bit (range 0–65535) che identifica in modo univoco un processo o servizio all’interno di un host. È il meccanismo più semplice e più potente del livello Transport.

// definizione formale
Il numero di porta è un intero non negativo a 16 bit (0–65535) che, abbinato all’indirizzo IP e al protocollo Transport, identifica univocamente un endpoint di comunicazione. È assegnato dall’IANA (Internet Assigned Numbers Authority) nella fascia 0–49151 e dal sistema operativo in modo dinamico nella fascia 49152–65535.

Le tre categorie IANA

L’IANA divide l’intero spazio delle porte in tre fasce con regole di assegnazione diverse:

WELL-KNOWN
0 – 1023

Riservate a servizi di sistema. Richiedono privilegi di root per essere usate. Assegnate formalmente da IANA. Esempi: 80 (HTTP), 443 (HTTPS), 22 (SSH).

REGISTERED
1024 – 49151

Assegnate da IANA su richiesta di organizzazioni/vendor per applicazioni specifiche. Esempi: 3306 (MySQL), 5432 (PostgreSQL), 8080 (HTTP alternativo).

DYNAMIC / EPHEMERAL
49152 – 65535

Assegnate dal sistema operativo al lato client in modo temporaneo per la durata di una connessione. Chiamate anche porte effimere o source port.

// nota — porte effimere su Linux

Su Linux il range effimero configurabile è visualizzabile con cat /proc/sys/net/ipv4/ip_local_port_range. Il default è tipicamente 32768–60999, che si discosta leggermente dalla definizione IANA. Ogni OS usa il range che preferisce in quel range high port.

Porte notevoli dei protocolli principali

PortaProtocolloServizioNote
20 / 21TCPFTP20 = dati, 21 = controllo
22TCPSSHSecure Shell — accesso remoto cifrato
25TCPSMTPInvio email tra server
53UDP / TCPDNSUDP per query brevi; TCP per zone transfer
67 / 68UDPDHCP67 = server, 68 = client (broadcast)
80TCPHTTPWeb non cifrato
110TCPPOP3Scarica email dal server
143TCPIMAPAccesso email con sincronizzazione server
443TCPHTTPSHTTP over TLS — web cifrato
3306TCPMySQLRegistered — database
3389TCPRDPRemote Desktop Protocol (Windows)
5432TCPPostgreSQLRegistered — database
8080TCPHTTP-altSpesso usato per proxy o server di sviluppo

Il Socket — l’endpoint di comunicazione

Il numero di porta da solo non basta a identificare una comunicazione. Serve sapere anche: quale host? Quale protocollo? La risposta è il socket.

// definizione formale — socket
Un socket è l’astrazione software che rappresenta un endpoint di comunicazione a livello Transport. È definito dalla 5-tupla:

{ protocollo, IP_sorgente, porta_sorgente, IP_destinazione, porta_destinazione }

Due socket con 5-tuple identiche identificano la stessa connessione; due socket che differiscono anche solo per un campo identificano connessioni distinte.

Socket TCP — connessioni multiple sulla stessa porta server

Un server web ascolta sulla porta 80. Tre client si connettono contemporaneamente. Come fa il kernel a non confonderli? Grazie alla 5-tupla: anche se dst_port=80 è uguale per tutti e tre, le 5-tuple sono diverse perché src_ip e/o src_port differiscono.

// TRE CONNESSIONI TCP VERSO LO STESSO SERVER — 3 SOCKET DISTINTI
Socket 1: { TCP, 192.168.1.10:52341, 93.184.216.34:80 }
Socket 2: { TCP, 192.168.1.11:52341, 93.184.216.34:80 }
Socket 3: { TCP, 192.168.1.10:52342, 93.184.216.34:80 }
← diverso IP sorgente → socket 1 ≠ socket 2
← stessa IP, porta diversa → socket 1 ≠ socket 3

Socket UDP — connectionless

UDP non mantiene connessioni. Il socket UDP è identificato solo da (dst_ip, dst_port). Più client possono inviare datagrammi alla stessa porta UDP del server: arrivano tutti allo stesso socket. La distinzione tra mittenti diversi è lasciata all’applicazione (che legge l’indirizzo sorgente di ogni datagramma ricevuto).

// esempio — DNS

Un DNS resolver ascolta su UDP porta 53. Riceve query da decine di client contemporaneamente sullo stesso socket. Risponde a ciascuno usando l’IP sorgente ricevuto nel datagramma in entrata. Nessuna connessione, nessuno stato mantenuto.

Visualizzare porte e connessioni attive

Su sistemi Linux puoi ispezionare in tempo reale quali porte sono in ascolto e quali connessioni sono attive con due strumenti fondamentali:

// COMANDI — porte e connessioni
# Tutte le connessioni TCP e UDP, numeriche, con PID
$ ss -tulnp
-t TCP  -u UDP  -l listening  -n numerico  -p mostra PID/processo
# Alternativa classica (più lenta, deprecata su sistemi moderni)
$ netstat -an
-a tutte le connessioni  -n numerico (no DNS lookup)
# Solo porte TCP in ascolto (listening)
$ ss -tlnp
# Esempio output ss -tlnp (estratto)
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:((“sshd”,pid=1234))
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:((“nginx”,pid=5678))
LISTEN 0 128 127.0.0.1:3306 0.0.0.0:* users:((“mysqld”,pid=9012))
// sicurezza — porta aperta = superficie d’attacco

Ogni porta in ascolto è un potenziale punto d’ingresso. Il principio di minimizzazione della superficie d’attacco impone di chiudere tutte le porte non necessarie tramite firewall (regole iptables / nftables). Il comando ss -tlnp è il primo strumento di verifica post-installazione su qualsiasi server.

Il flusso completo: da applicazione a rete

Vediamo in sequenza cosa succede quando il tuo browser apre una connessione HTTPS:

// FLUSSO — browser apre https://example.com
1. Browser richiede connessione a 93.184.216.34:443 (HTTPS)
2. SO assegna porta effimera: es. 52341
3. Socket creato: { TCP, 192.168.1.5:52341, 93.184.216.34:443 }
4. TCP aggiunge header con src=52341, dst=443
5. IP aggiunge header con src=192.168.1.5, dst=93.184.216.34
6. Ethernet incapsula e invia al gateway
La risposta segue il percorso inverso; il kernel usa la 5-tupla per consegnarla al socket corretto del browser.
📌 Riepilogo — Punti chiave
  • Le porte sono interi a 16 bit (0–65535): 0–1023 well-known (root), 1024–49151 registered, 49152–65535 dynamic/ephemeral
  • Il socket è la 5-tupla {protocollo, IP_src, porta_src, IP_dst, porta_dst}: identifica univocamente un endpoint di comunicazione
  • Un server TCP può gestire N connessioni simultanee sulla stessa porta: le 5-tuple differiscono per IP/porta sorgente dei client
  • UDP non mantiene connessioni: il socket è identificato solo da (dst_ip, dst_port); tutti i datagrammi arrivano allo stesso socket
  • Porte notevoli da ricordare: 22 SSH, 25 SMTP, 53 DNS, 80 HTTP, 110 POP3, 143 IMAP, 443 HTTPS, 67/68 DHCP
  • ss -tulnp è il comando moderno per visualizzare porte in ascolto e connessioni attive su Linux

Lascia un commento