Livello di trasporto: TCP, UDP, QUIC, porte e socket sono i concetti al centro di questa lezione, dedicata alla comunicazione end-to-end tra processi applicativi. Il testo spiega che il livello di trasporto ha il compito di fornire un canale logico di comunicazione tra applicazioni, sfruttando i servizi del livello di rete.
Vengono poi presentati i principali protocolli di trasporto: TCP, UDP e QUIC.
TCP offre una comunicazione affidabile e orientata alla connessione, grazie a meccanismi come ACK, ritrasmissione, controllo di flusso e controllo della congestione. UDP, invece, è un protocollo più semplice e veloce, non orientato alla connessione e non affidabile, adatto a comunicazioni in tempo reale come streaming, VoIP, giochi online e applicazioni IoT. La lezione introduce anche QUIC, un protocollo moderno basato su UDP ma progettato per offrire comunicazioni più rapide, sicure ed efficienti, soprattutto nel Web moderno e in HTTP/3.
Nella parte finale vengono spiegati i concetti di porta e socket, utili per indirizzare i dati verso il processo corretto e gestire la comunicazione tra applicazioni.
Livello di trasporto
Il compito del livello di trasporto è fornire servizi al soprastante livello applicativo e, per raggiungere tale scopo, sfrutta i servizi offerti dal sottostante livello 3, il livello di rete (Eddy, 2022).
Lo scopo del livello di trasporto è fornire un canale logico di comunicazione end-to-end per pacchetti. Nello specifico, si occupa di supplire alle carenze delle funzionalità di trasferimento in termini di affidabilità, implementando le suddette funzioni come garanzie sul trasporto stesso (Eddy, 2022).
Il livello di trasporto si trova solo negli end-systems (hosts) e consente il collegamento logico tra processi applicativi.

Protocolli di trasporto
Il livello di trasporto fornisce al livello applicativo delle connessioni con specifiche qualità, in particolare sfruttando i protocolli UDP, TCP e QUIC (Eddy, 2022; Iyengar & Thomson, 2021; Postel, 1980).
TCP
TCP (Transmission Control Protocol) è uno dei principali protocolli di comunicazione utilizzati nel livello di trasporto (Eddy, 2022).
Il TCP consente di avere un servizio orientato alla connessione e affidabile.
Tramite TCP, tra mittente e destinatario si stabilisce una connessione logica affidabile e bidirezionale.
Le caratteristiche principali del TCP includono:
Per inviare dati tramite TCP, il protocollo suddivide il messaggio dato dal livello applicativo in pacchetti più piccoli chiamati segmenti. Questi segmenti contengono (Eddy, 2022):
I segmenti TCP vengono inseriti in pacchetti IP (pacchetti creati nel livello di rete) e trasmessi attraverso la rete. I pacchetti IP possono anche seguire percorsi diversi prima di raggiungere la destinazione.
Una volta arrivati alla destinazione, il ricevitore assembla i segmenti in ordine di sequenza e utilizza le informazioni di controllo per confermare la ricezione dei segmenti.
Se un pacchetto non viene ricevuto correttamente, il TCP richiede la sua ritrasmissione al mittente per garantire l’integrità e l’affidabilità dei dati.
TCP è stato ed è ancora molto usato in Internet, soprattutto per servizi che richiedono affidabilità, come il trasferimento di file, molte comunicazioni web, email e accesso remoto.
Una connessione TCP passa almeno attraverso queste fasi (Eddy, 2022):
UDP
UDP (User Datagram Protocol), come TCP, è un protocollo del livello di trasporto, ma offre un servizio molto diverso (Postel, 1980).
A differenza del TCP, che offre una comunicazione affidabile e orientata alla connessione, l’UDP è un protocollo senza connessione e non garantisce l’affidabilità della consegna dei dati (Postel, 1980).
Questo significa che quando un’applicazione utilizza l‘UDP per inviare dati a un’altra applicazione, i dati vengono semplicemente inviati senza alcuna garanzia che siano ricevuti o consegnati correttamente.
L’UDP consente quindi di avere un servizio non orientato alla connessione e non affidabile.
Caratteristiche principali di UDP:
Poiché l’UDP non garantisce la consegna affidabile dei dati, le applicazioni che utilizzano questo protocollo devono gestire eventuali perdite o errori di dati a livello dell’applicazione stessa, se necessario (Eggert et al., 2017).
L’UDP è utilizzato in situazioni in cui la velocità e la semplicità sono più importanti dell’affidabilità nella consegna dei dati. Alcuni dei principali casi d’uso in cui l’UDP è preferito includono:
L’unità di dati inviata da UDP si chiama datagramma. Un datagramma UDP contiene un header, con informazioni di controllo essenziali, e un payload, cioè i dati ricevuti dall’applicazione.
QUIC
Dopo aver visto TCP e UDP, possiamo introdurre un protocollo più recente: QUIC (Quick UDP Internet Connections).
QUIC è un protocollo di trasporto moderno progettato per rendere le comunicazioni su Internet più veloci, sicure ed efficienti (Iyengar & Thomson, 2021).
È particolarmente importante perché viene usato da HTTP/3, una delle versioni più recenti del protocollo HTTP utilizzato per il Web (Bishop, 2022).
La caratteristica interessante di QUIC è che funziona sopra UDP.
Questo può sembrare strano, perché UDP è un protocollo non orientato alla connessione e non affidabile.
Tuttavia QUIC utilizza UDP come base e aggiunge sopra di esso molte funzionalità che normalmente associamo a TCP, come l’affidabilità, il controllo della congestione e la gestione della connessione (Iyengar & Thomson, 2021).
Uno dei motivi per cui QUIC è stato sviluppato è ridurre il tempo necessario per iniziare una comunicazione. Con TCP, prima bisogna stabilire una connessione; se poi si usa HTTPS (HTTP più la sicurezza), bisogna aggiungere anche la negoziazione crittografica.
Questo può richiedere più passaggi prima che i dati veri e propri inizino a essere scambiati.
QUIC integra invece la sicurezza direttamente nel protocollo e usa meccanismi basati su TLS. Questo permette di ridurre il numero di passaggi necessari per stabilire una connessione sicura. Il risultato è che, in molti casi, una comunicazione può iniziare più rapidamente (Thomson & Turner, 2021).
Un’altra caratteristica importante di QUIC è la gestione migliore delle interruzioni e dei cambi di rete. Per esempio, uno smartphone può iniziare a navigare usando il Wi-Fi e poi passare alla rete mobile.
Con una connessione tradizionale basata su TCP, questo cambio può interrompere la connessione, perché cambia l’indirizzo di rete (l’indirizzo IP) usato dal dispositivo.
QUIC, invece, è progettato per gestire meglio questi cambiamenti e mantenere la comunicazione attiva quando possibile (Iyengar & Thomson, 2021).
QUIC migliora anche la gestione di più flussi di dati all’interno della stessa connessione. Nel Web moderno, una pagina non è formata da un solo file: contiene testo, immagini, fogli di stile, script, video e molte altre risorse. QUIC permette di gestire più flussi in parallelo, riducendo il rischio che il ritardo o la perdita di una parte dei dati blocchi inutilmente anche le altre (Bishop, 2022; Iyengar & Thomson, 2021).
Questa caratteristica è importante perché nelle comunicazioni di rete alcuni pacchetti possono arrivare in ritardo o andare persi. Con alcuni sistemi tradizionali, la perdita di un pacchetto può rallentare anche dati che sarebbero già disponibili. QUIC cerca di ridurre questo problema separando meglio i diversi flussi di comunicazione.
Possiamo quindi vedere QUIC come un protocollo che unisce alcune caratteristiche positive di TCP e UDP:
QUIC è adatto al Web moderno, dove servono velocità, sicurezza e capacità di gestire molti flussi di dati contemporaneamente.
QUIC è particolarmente importante perché è alla base di HTTP/3, la versione più recente di HTTP (Bishop, 2022).
Porta
In un sistema di rete, una porta è il numero logico utilizzato per identificare un canale specifico di comunicazione all’interno di un host (Cotton et al., 2011).
È uno degli elementi fondamentali che permette a più applicazioni nello stesso host di usare contemporaneamente la rete senza interferire tra loro.
Immagina un centralino telefonico di una grande azienda.
Tutti i telefoni sono collegati a un unico numero (l’indirizzo reale), ma quando chiami quel numero puoi essere messo in contatto con diversi interni: vendite, assistenza, amministrazione… Ecco: il numero di telefono è come l’indirizzo reale del computer, mentre gli interni sono le porte.
Quindi ricapitolando:
Le porte sono lo strumento utilizzato per permettere a un host di effettuare contemporaneamente più connessioni diversificate verso altri host, facendo in modo che i dati relativi a un servizio specifico vengano indirizzati al processo che li sta aspettando (Internet Assigned Numbers Authority [IANA], n.d.).
Nelle comunicazioni basate su TCP o UDP, le porte sono usate per associare i dati al processo applicativo corretto (Cotton et al., 2011).
In una comunicazione di rete non esiste solo una porta: di solito ci sono una porta sorgente e una porta di destinazione.
In questo modo, il computer può distinguere più comunicazioni attive nello stesso momento. Per esempio, se un browser apre più connessioni verso siti web, il sistema operativo può usare porte sorgente diverse per riconoscere ciascuna comunicazione.
Le porte sono 216=65536, classificabili in tre gruppi (IANA, n.d.):
Esempio
Vediamo un esempio di porta conosciuta.
Quando visiti un sito web come “www.example.com” nel tuo browser, stai implicitamente comunicando con il server attraverso il protocollo HTTP (Hypertext Transfer Protocol) sulla porta predefinita 80. Il protocollo HTTP è utilizzato per richiedere e trasferire pagine web e altri contenuti attraverso il web.
Vediamo un esempio di porta registrata.
Un’azienda vuole creare un servizio web che consente di sommare due numeri.
Tale servizio deve ricevere in input due numeri e restituire in output un numero che sarà la somma dei due input.
Il programma di calcolo viene associato alla porta 3000.
Tutti i client che vogliono usare il servizio devono collegarsi all’indirizzo del server specificando la porta 3000, inserire nel messaggio due numeri e ricevere come risultato un numero che sarà la somma dei due numeri precedenti (protocollo).
Vediamo un esempio di porta dinamica.
Quando apriamo un sito HTTPS, il browser si collega alla porta 443 del server web. Il computer dell’utente, però, usa anche una propria porta temporanea, scelta automaticamente dal sistema operativo, per identificare quella specifica comunicazione.
Per esempio, il browser potrebbe comunicare così: client: porta 52341 → server: porta 443.
Se l’utente apre più schede o più servizi contemporaneamente, il sistema operativo può assegnare porte dinamiche diverse, in modo da distinguere le varie comunicazioni attive.
Socket
Quando due dispositivi comunicano attraverso una rete, non basta conoscere il loro indirizzo e la porta: serve anche un meccanismo che gestisca la connessione vera e propria tra i due programmi.
Questo meccanismo è la socket.
La socket rappresenta il punto software attraverso cui il programma comunica in rete (Gilligan et al., 2003).
La socket è l’oggetto software che permette a un programma di inviare e ricevere dati su una rete, sfruttando un indirizzo e una porta:
Quando un’applicazione vuole comunicare con un’altra applicazione remota, crea una socket:
La comunicazione tra le due applicazioni avviene scambiando dati attraverso le loro rispettive socket.
Una socket locale è identificata almeno da un indirizzo, una porta e un protocollo di trasporto, per esempio TCP o UDP (Gilligan et al., 2003).
Nel caso di una connessione TCP, la comunicazione viene identificata in modo più preciso dalla combinazione di indirizzo e porta del mittente, indirizzo e porta del destinatario, e protocollo utilizzato (Eddy, 2022).
Con questi elementi, una socket identifica in maniera puntuale una specifica comunicazione tra due host.
Le fasi di una connessione con la socket sono:
Le socket si classificano in due categorie, ciascuna caratterizzata da una propria modalità di comunicazione.
Esempio
Di seguito sono descritti i passaggi che avvengono quando un utente richiede tramite browser l’apertura della pagina www.wikipedia.org:
Si esamina un esempio molto semplice di socket.
In questo esempio il client manda un numero al server e il server calcola il quadrato del numero e restituisce il risultato al client.
Di seguito è riportato il codice del livello applicativo del server e del client, che sfrutta chiamate del livello di trasporto per mandare effettivamente i messaggi.
Le chiamate al livello di trasporto sono:
Lato client
Lato server
Sotto si vedono le socket rispettivamente del client e del server.
Socket Client
indirizzoServer = "127.0.0.1" portaServer = 65432 numero = 5 socket = CONNETTI(indirizzoServer, portaServer) INVIA(socket, numero) risultato = RICEVI(socket) CHIUDI(socket)
Socket Server
portaServer = 65432
ITERA: # il server quando finisce un’operazione si rimette in ascolto
socket = ATTENDI(portaServer)
dato = RICEVI(socket)
risultato = dato * dato
INVIA(socket, risultato)
CHIUDI(socket)







No responses yet