# Livello Trasporto Il livello di trasporto del modello TCP/IP è uno dei componenti fondamentali nell'architettura delle reti di computer e gioca un ruolo cruciale nella gestione della comunicazione end-to-end tra dispositivi su una rete. Questo livello si colloca al terzo posto nella pila protocollo TCP/IP, situato sopra il livello Internet e sotto il livello Applicazione. Ha di conseguenza l'obiettivo di far arrivare i dati al livello applicazione dell'altro host e può sfruttare l'infrastruttura del livello internet sotto di lui. Il livello di trasporto è progettato per fornire un meccanismo di trasferimento dei dati tra gli host in modo affidabile, efficiente e trasparente, **indipendentemente dalle caratteristiche della rete sottostante**. Le sue principali responsabilità includono la segmentazione e il riassemblaggio dei dati, il controllo degli errori, il controllo del flusso e la gestione della congestione. Due dei protocolli più importanti associati a questo livello sono **TCP** (Transmission Control Protocol) e **UDP** (User Datagram Protocol), ognuno dei quali fornisce diversi servizi in base alle esigenze delle applicazioni. ![Livello Trasporto](/resources/reti//immagini/livello-trasporto.png) --- ## Obiettivi e funzioni del livello trasporto * **Segmentazione e riassemblaggio**: I dati dall'applicazione vengono suddivisi in segmenti più piccoli per il trasporto e poi riassemblati al loro arrivo al destinatario. * **Multiplexing e demultiplexing**: Il livello di trasporto permette a più applicazioni di utilizzare contemporaneamente la rete, assegnando a ciascun segmento di dati una **porta** specifica. Permette quindi di identificare le applicazioni con accesso ad internet all'interno dei dispositivi * **Controllo degli errori**: Verifica l'integrità dei dati ricevuti e, nel caso di TCP, richiede la ritrasmissione di segmenti errati. * **Controllo del flusso**: Se gli host coinvolti nella comunicazione hanno prestazioni molto differenti può capitare che un pc più veloce "inondi" di dati uno più lento portando alla perdita di pacchetti. Mediante il controllo di flusso, un host in "difficoltà" può chiedere di abbassare il tasso di trasmissione in modo da poter gestire le informazioni in ingresso. * **Gestione della congestione**: Regola il tasso di trasmissione dei dati in risposta alla congestione della rete, riducendo il rischio di perdita di pacchetti. --- ## Come vengono indirizzati i dati all’applicazione corretta? Durante la comunicazione tra due dispositivi, è fondamentale che i dati inviati da un’applicazione raggiungano l’applicazione corretta sul dispositivo destinatario. Questo avviene attraverso l’uso dei **numeri di porta**. ### Numeri di porta Ogni applicazione in esecuzione su un dispositivo è associata a un numero di porta univoco. Quando un’applicazione invia dati, il livello trasporto aggiunge l’informazione della porta di origine e della porta di destinazione all’interno dell’header del *segmento* inviato. Questi numeri permettono al dispositivo destinatario di instradare i dati all’applicazione appropriata. **Esempi di porte riservate:** - **80:** HTTP. - **443:** HTTPS. - **25:** SMTP (invio di email). - **53:** DNS. - **22:** SSH (accesso remoto sicuro). <ex> Quando navighiamo su un sito web, il browser utilizza la porta **80** per HTTP o **443** per HTTPS per comunicare con il server web. Questi numeri di porta sono standard e riservati per questi protocolli, il che significa che qualsiasi client che desidera connettersi a un servizio web sa esattamente quali porte utilizzare. Allo stesso modo, se stiamo utilizzando un client email per inviare messaggi, questo utilizzerà la porta **25** per SMTP o **587** per SMTP con autenticazione. Questo sistema di porte riservate garantisce che i dati vengano indirizzati correttamente al servizio appropriato sul server di destinazione. </ex> --- ## Protocolli principali del livello trasporto Il livello trasporto utilizza due protocolli principali, **TCP** e **UDP**, ciascuno progettato per soddisfare esigenze specifiche. --- ### TCP (Transmission Control Protocol) #### Caratteristiche principali ![TCP Handshake +++ >](/resources/reti//immagini/tcp-handshake.png) TCP è un protocollo **orientato alla connessione** che garantisce **l'affidabilità** nella consegna dei dati. Prima che i dati possano essere scambiati, le due entità devono stabilire una connessione attraverso un processo noto come **handshake** a tre vie. TCP fornisce controllo dell'errore, controllo del flusso e meccanismi di gestione della congestione, assicurando così che i dati siano consegnati in ordine e senza duplicazioni. Questo lo rende ideale per applicazioni che richiedono consegne di dati affidabili, come il trasferimento di file, il caricamento di pagine web e la posta elettronica. #### Formato dell’header TCP ![TCP Headers +++ >](/resources/reti//immagini/tcp-headers.png) L’header di TCP contiene diverse informazioni essenziali per garantire l’affidabilità: - **Porta sorgente e porta di destinazione:** Identificano le applicazioni coinvolte nella comunicazione. - **Numero di sequenza:** Indica l’ordine dei dati. - **Numero di conferma (ACK):** Conferma la ricezione dei dati. - **Flags:** Contengono informazioni sullo stato della connessione (es. SYN per iniziare una connessione, FIN per terminarla). - **Finestra di ricezione:** Specifica quanti dati il destinatario può accettare prima di inviare un’ulteriore conferma. #### Quando utilizzare TCP TCP è ideale per applicazioni in cui l’affidabilità è fondamentale, come: - Trasferimenti di file (FTP). - Email (SMTP, IMAP). - Navigazione web (HTTPS). #### Invio dei segmenti TCP e gestione degli ACK Il protocollo TCP suddivide i dati da trasmettere in unità più piccole chiamate **segmenti**, che vengono numerati in base alla sequenza di byte inviati. Ogni segmento contiene un **numero di sequenza** unico, che permette al destinatario di ricostruire correttamente l’ordine dei dati ricevuti. Quando il destinatario riceve un segmento, invia un **ACK (Acknowledgment)** al mittente, confermando che il segmento è stato ricevuto correttamente. L’ACK include il numero di sequenza del prossimo byte che il destinatario si aspetta di ricevere, segnalando così al mittente che può procedere con l’invio del segmento successivo. Se un segmento viene perso o danneggiato durante la trasmissione, il destinatario non invierà l’ACK previsto. Il mittente, rilevando l’assenza dell’ACK entro un determinato intervallo di tempo (timeout), ritrasmette il segmento mancante. Questo meccanismo garantisce che tutti i dati arrivino integri e nell’ordine corretto. <ex> 1. Il mittente invia un segmento con **numero di sequenza 1001**. 2. Il destinatario lo riceve e risponde con un `ACK 1101`, indicando che ha ricevuto i primi 100 byte e si aspetta il prossimo segmento a partire dal byte 1101. 3. Se il segmento successivo (1101-1200) non arriva, il destinatario non invierà un `ACK 1201` quindi il mittente, dopo il timeout, lo ritrasmetterà. </ex> --- ### UDP (User Datagram Protocol) A differenza di TCP, UDP è un protocollo **non orientato alla connessione** che fornisce una modalità di trasmissione con uno **sforzo minimo**. Non garantisce la consegna, l'ordine o l'integrità dei dati, rendendolo molto più veloce e più leggero di TCP. UDP è adatto per applicazioni che possono tollerare una certa perdita di dati ma richiedono trasmissioni ad alta velocità o bassa latenza, come lo streaming video, i giochi online e la voce su IP (VoIP). #### Caratteristiche principali - **Senza connessione:** UDP non stabilisce una connessione prima di inviare i dati, rendendolo più veloce di TCP. - **Non affidabile:** Non garantisce l’ordine dei pacchetti né la ritrasmissione in caso di perdita. - **Leggerezza:** L’header di UDP è molto più semplice, riducendo il carico. #### Formato dell’header UDP ![UDP Headers +++ >](/resources/reti//immagini/udp-headers.png) L’header di UDP è minimalista e contiene solo le informazioni essenziali: - **Porta sorgente e porta di destinazione:** Come in TCP, identificano le applicazioni. - **Lunghezza:** Specifica la dimensione totale del pacchetto UDP. - **Checksum:** Verifica l’integrità dei dati. #### Quando utilizzare UDP UDP è ideale per applicazioni dove la velocità è più importante dell’affidabilità, come: - Streaming video e audio. - Chiamate VoIP. - Servizi DNS. --- ## Confronto tra TCP e UDP | **Caratteristica** | **TCP** | **UDP** | |-------------------------|------------------------------------|----------------------------------| | **Affidabilità** | Garantita | Non garantita | | **Connessione** | Orientata alla connessione | Senza connessione | | **Velocità** | Più lento | Più veloce | | **Dimensione dell’header** | Maggiore | Minore | | **Applicazioni tipiche**| Trasferimenti di file, email | Streaming, DNS, gaming | --- <lf> ![Meme Postino Trasporto](/resources/reti//immagini/meme-postino-trasporto.png) </lf> <rt> ![Meme Mamma Trasporto](/resources/reti//immagini/meme-mamma-trasporto.png) </rt> ## Conclusione Il livello trasporto è essenziale per garantire una comunicazione efficace e adattabile tra applicazioni, fornendo protocolli progettati per esigenze diverse. TCP offre affidabilità e controllo, mentre UDP è veloce e leggero, rendendo entrambi indispensabili per un’ampia gamma di applicazioni moderne.