Reti di calcolatori uniVR - Dipartimento di Informatica Amos Lo Verde 6 febbraio 2023 2 Indice I Teoria 1 1 Introduzione alle reti 1.1 Architetture di rete . . . . . . . . . . . . . . 1.1.1 Core della rete . . . . . . . . . . . . 1.2 Commutazione di circuito e pacchetto . . . 1.2.1 Ritardo di trasmissione dei pacchetti 1.3 Modello a strati . . . . . . . . . . . . . . . . 1.3.1 Funzionalità dei diversi livelli . . . . 1.3.2 Indirizzi IP . . . . . . . . . . . . . . 1.3.3 Subnetting . . . . . . . . . . . . . . 1.4 Blocco CIDR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 5 6 6 9 12 12 14 17 18 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 23 23 25 26 32 33 34 35 36 37 38 39 39 3 Livello di trasporto 3.1 Multiplexing e demultiplexing . . . . . . . . . . . . . . . . . . . . . 3.1.1 Multiplexing e demultiplexing non orientati alla connessione 3.1.2 Multiplexing e demultiplexing orientati alla connessione . . 3.2 Trasporto non orientato alla connessione (UDP) . . . . . . . . . . . 3.2.1 Struttura dei segmenti UDP . . . . . . . . . . . . . . . . . . 3.2.2 Checksum UDP . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Trasporto orientato alla connessione (TCP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 43 44 45 46 47 47 48 . . . . . . . . . . . . . . . . . . . . . su Internet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Livello applicativo 2.1 Web e HTTP . . . . . . . . . . . . . . . . . . . 2.1.1 Protocollo HTTP . . . . . . . . . . . . . 2.1.2 Connessioni persistenti e non persistenti 2.1.3 Formato dei messaggi HTTP . . . . . . 2.1.4 Interazione utente-server: i cookie . . . 2.1.5 Web caching . . . . . . . . . . . . . . . 2.2 DNS: servizio di directory di Internet . . . . . . 2.2.1 Organizzazione gerarchica . . . . . . . . 2.2.2 Rapporto tra DNS e cache di rete . . . 2.3 Posta elettronica in Internet . . . . . . . . . . . 2.3.1 Protocollo SMTP . . . . . . . . . . . . . 2.3.2 Formato dei messaggi di posta . . . . . 2.3.3 Protocolli di accesso alla posta . . . . . i . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii INDICE 3.4 3.5 3.3.1 Struttura dei segmenti TCP . . . . . . . . . . . 3.3.2 Timeout e stima del tempo di andata e ritorno 3.3.3 Trasferimento dati affidabile . . . . . . . . . . . 3.3.4 Controllo di flusso . . . . . . . . . . . . . . . . 3.3.5 Gestione della connessione TCP . . . . . . . . Principi del controllo di congestione . . . . . . . . . . 3.4.1 Cause e costi della congestione . . . . . . . . . 3.4.2 Approcci al controllo di congestione . . . . . . Controllo di congestione TCP . . . . . . . . . . . . . . 3.5.1 Slow start . . . . . . . . . . . . . . . . . . . . . 3.5.2 Congestion avoidance . . . . . . . . . . . . . . 3.5.3 Fast recovery . . . . . . . . . . . . . . . . . . . 4 Livello di rete (piano dei dati) 4.1 Panoramica del livello di rete . . . . . . . . . . . . . 4.1.1 Inoltro e instradamento . . . . . . . . . . . . 4.1.2 Modelli di servizio . . . . . . . . . . . . . . . 4.2 Protocollo IP . . . . . . . . . . . . . . . . . . . . . . 4.2.1 Formato dei datagrammi Ipv4 . . . . . . . . . 4.2.2 Frammentazione dei datagrammi Ipv4 . . . . 4.2.3 Indirizzamento Ipv4 . . . . . . . . . . . . . . 4.2.4 Come ottenere l’indirizzo di un host: DHCP . 4.2.5 NAT . . . . . . . . . . . . . . . . . . . . . . . 4.2.6 Formato dei datagrammi Ipv6 . . . . . . . . . 5 Livello di rete (piano di controllo) 5.1 Algoritmi di instradamento . . . . . . 5.1.1 Instradamento link-state . . . . 5.1.2 Instradamento distance-vector 5.2 Instradamento tra ISP: BGP . . . . . 5.2.1 Ruolo di BGP . . . . . . . . . 5.2.2 Distribuzione delle informazioni 5.2.3 Selezione delle rotte migliori . . 5.3 Protocollo ICMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . dei cammini in . . . . . . . . . . . . . . . . . . 6 Livello di collegamento 6.1 Introduzione al livello di collegamento . . . . . . . . . 6.1.1 Servizi offerti dal livello di collegamento . . . . 6.1.2 Implementazione del livello di collegamento . . 6.2 Tecniche di rilevazione e correzione degli errori . . . . 6.2.1 Controllo di parità . . . . . . . . . . . . . . . . 6.2.2 Checksum . . . . . . . . . . . . . . . . . . . . . 6.3 Collegamenti broadcast e protocolli di accesso multiplo 6.3.1 Protocolli ad accesso casuale . . . . . . . . . . 6.4 Reti localmente commutate . . . . . . . . . . . . . . . 6.4.1 Indirizzi MAC . . . . . . . . . . . . . . . . . . 6.4.2 Protocollo ARP . . . . . . . . . . . . . . . . . . 6.4.3 Struttura dei frame Ethernet . . . . . . . . . . 6.4.4 LAN estese . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 52 53 55 57 59 60 64 65 66 67 68 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 69 70 71 71 71 72 73 75 76 78 . . . . . . . . . . . . . . . BGP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 82 84 84 87 87 88 89 90 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 91 92 93 94 95 96 97 97 103 103 104 105 106 . . . . . . . . . . . . . . . . . . . . . . . . . . iii INDICE 6.5 II Reti wireless . . . . . . . . . . . . . . . . 6.5.1 Wireless LAN . . . . . . . . . . . 6.5.2 Algoritmo CSMA/CA . . . . . . 6.5.3 Problema del terminale nascosto 6.5.4 Framing . . . . . . . . . . . . . . 6.5.5 VPN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Esercizi 108 108 108 110 112 113 115 7 Traduzione IP 117 7.1 Esercizio 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 7.2 Esercizio 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 8 Indirizzamento 119 9 Creazione di sottoreti 9.1 Esercizio 1 . . . . . . 9.1.1 Parte 1 . . . 9.1.2 Parte 2 . . . 9.2 Esercizio 2 . . . . . . 9.3 Esercizio 3 . . . . . . 9.4 Esercizio 4 . . . . . . 9.5 Esercizio 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 121 121 122 123 124 125 126 10 TCP 10.1 Esercizio 10.2 Esercizio 10.3 Esercizio 10.4 Esercizio 10.5 Esercizio 10.6 Esercizio 1 2 3 4 5 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 129 130 131 131 133 134 11 Collegamento 11.1 Esercizio 1 11.2 Esercizio 2 11.3 Esercizio 3 11.4 Esercizio 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 135 136 136 137 iv INDICE Parte I Teoria 1 Introduzione alle reti Questo corso si occupa di risolvere il problema della comunicazione tra calcolatori. I problemi si dividono in due tipologie: 1. L’infrastruttura da utilizzare per il trasporto del messaggio, ossia l’architettura di rete, la quale comprende: l’infrastruttura assieme al software, che permettono il trasporto/trasmissione dell’informazione. 2. La composizione del messaggio tramite protocolli di comunicazione. Definizione. Un protocollo definisce il formato e l’ordine dei messaggi scambiati tra due o più entità di comunicazione, così come le azioni intraprese in fase di trasmissione e/o ricezione di un messaggio o di un altro evento. Per comprendere meglio il concetto di protocollo si può pensare al “protocollo umano”, ossia le buone maniere con le quali inizia una conversazione tra due persone: l’interpretazione dei messaggi inviati determina il tipo di risposta. In modo simile accade con i calcolatori, dove per esempio si invia una richiesta di connessione al web server (vedi Figura 1.1) mettendosi in attesa di una risposta. Il web server riceverà il messaggio di richiesta di connessione e restituirà un messaggio di risposta di connessione. A questo punto il computer invia il nome della pagina che vuole prelevare dal server tramite un messaggio GET, e a sua volta il web server restituirà la pagina web (come file) al computer. Figura 1.1: Analogia di protocolli. 3 4 CAPITOLO 1. INTRODUZIONE ALLE RETI Approcci Top-down e Bottom-up Esempio (Lettera cartacea). Quando un utente A deve scrivere una lettera a un utente B, scrive il proprio messaggio su un foglio scegliendo il linguaggio da utilizzare. Il messaggio viene poi inserita all’interno di una busta nella quale si specificano determinate informazioni: indirizzo di destinazione, nome, cognome, via, ecc. La lettera viene imbucata e spedita all’ufficio postale, che a sua volta comunica con altri uffici postali in base al percorso da seguire. Infine una volta arrivata la lettera alla casella postale del destinatario, l’utente compierà prima un controllo delle informazioni aggiunte nella busta e infine leggerà il messaggio contenuto. Figura 1.2: Esempio scambio di informazioni. La comunicazione tra calcolatori avviene mediante due differenti approcci: • top-down: parte dall’informazione generata lato utente fino ad arrivare all’infrastruttura. • bottom-up: parte dall’infrastruttura fino ad arrivare all’informazione generata lato utente. Un’altra importante considerazione da fare sono i livelli composti sullo stesso piano: indicano i protocolli di scambio di informazione, specificando che ogni protocollo è a sé stante e non ha nulla a che fare con gli altri livelli. 5 1.1. ARCHITETTURE DI RETE 1.1 Architetture di rete La principale architettura di rete da cui partire è Internet 1 , composta da vari elementi di base che definiscono l’architettura stessa: • Calcolatori: host (ospiti) o sistemi periferici (end system). • Apparati di rete (router ). • Collegamenti fisici/cablati o wireless. La prima forma di rete che si può trovare è la rete locale (LAN Local Area Network ); è caratterizzata da (vedi Figura 1.3): • Un router di bordo con il compito di separare la rete locale (LAN) da Internet. • Un access point che permette il collegamento wireless dei dispositivi interni alla rete. • Uno switch avente lo scopo di formare collegamenti cablati per i dispositivi e rendere operativo l’access point. Access Point Internet router switch Figura 1.3: Esempio di rete LAN. In una rete aziendale questi tre componenti sono separati, mentre in una rete domestica sono tutti “collassati” in un unico apparato per ragioni di spazio. Inoltre è importante notare che lo switch collega tutti i calcolatori all’interno di una rete, ma non con componenti all’esterno, viceversa al router è possibile collegare due calcolatori tra LAN differenti. 1 Internet è definita anche “reti delle reti”. 6 CAPITOLO 1. INTRODUZIONE ALLE RETI 1.1.1 Core della rete Come visto in precedenza i router consentono la comunicazione tra computer di diverse reti, ecco che la porzione di rete in cui si presenta il percorso di comunicazione è detta core. Internamente al core si distinguono diverse tipologie di ISP (Internet Service Provider ) divise in livelli, ossia organizzazioni che gestiscono le infrastrutture di rete: • ISP livello 1: la rete spazia geograficamente su più nazioni (è internazionale). • ISP livello 2: viene coperto solo il territorio nazionale. • ISP livello 3: la copertura riguarda territori locali. ISP livello 2 ISP livello 1 ISP livello 2 LAN ISP livello 1 ISP livello 1 ISP livello 3 LAN Figura 1.4: Livelli di ISP. Nel caso in cui venga spedito un pacchetto, la LAN comunica con l’ISP, con il quale ha sottoscritto il collegamento, e successivamente verrà scelto un percorso per raggiungere la destinazione. Le varie problematiche di percorso sono gestite dalle reti e definite con il termine di instradamento: si ricerca il compromesso tra il percorso più breve e quello più veloce (non sempre il percorso breve risulta essere veloce). 1.2 Commutazione di circuito e pacchetto Il metodo di trasferimento per un’informazione si è evoluto nel corso degli anni: • Commutazione a circuito: è il metodo più vecchio e attualmente inutilizzato per la rete Internet. Tra due utenti A e B esiste un percorso composto da risorse fisiche con il quale possono comunicare: la capacità del canale viene interamente dedicata alla comunicazione. 7 1.2. COMMUTAZIONE DI CIRCUITO E PACCHETTO Pro: se sono presenti molte informazioni da trasmettere in modo costante2 , allora il ritardo di trasferimento è contenuto. Contro: se la produzione dell’informazione è discontinua, allora si verifica uno spreco di risorse. Informazione dicontinua Informazione Informazione Informazione continua tempo tempo Spreco di risorse Figura 1.5: Informazione continua e discontinua. • Commutazione a pacchetto: l’informazione viene suddivisa in unità indipendenti chiamati pacchetti. Informazione Pacchetto 1 Pacchetto 2 Pacchetto 3 Intestazione Figura 1.6: Informazione suddivisa in pacchetti. A ogni pacchetto viene inclusa un’ulteriore informazione definita intestazione, che permette di arrivare a destinazione in maniera autonoma. Assumendo che un computer A debba comunicare con un computer B e un computer C comunichi con un computer D, allora quando l’informazione viene prodotta ciascun nodo possiede un buffer per memorizzare i pacchetti che sono stati creati. 2 L’informazione è prodotta continuamente senza intervalli d’attesa. 8 CAPITOLO 1. INTRODUZIONE ALLE RETI A B Buffer Multiplex statistico Buffer C D Buffer Pro: le risorse vengono utilizzate con maggiore efficienza attraverso il multiplex statistico. I pacchetti vengono dunque mescolati tra loro in maniera casuale, senza che il router sappia quando le informazioni vengono generate. Man mano che si generano i dati, vengono caricati all’interno dello stesso buffer, così che non si sprechino risorse quando il nodo li produce discontinuamente . Contro: possono verificarsi potenziali perdite dei pacchetti e maggiori ritardi: 1. Il buffer presenta una dimensione limitata, pertanto quando viene occupato interamente inizia a scartare i pacchetti che lo raggiungono ed è poi necessario doverli rimandare. Inoltre il punto di perdita può avvenire in un qualsiasi momento all’interno della rete, perciò bisogna anche stabilire chi ha il compito di rispedire i dati persi. 2. Il ritardo va confrontato con quello della commutazione a circuito in cui si preserva un certo tempo per l’instaurazione del circuito, ossia si genera un ritardo dovuto alla distanza dei due dispositivi. Sorgente Destinazione Instaurazione del circuito Ritardo distanza Trasferimento dell'informazione Figura 1.7: Ritardo nella commutazione a circuito. Il ritardo totale risulta essere: ritardo instaurazione del circuito + ritardo della distanza + ritardo del trasferimento dell’informazione. Diversamente per la commutazione a pacchetto non c’è l’instaurazione del circuito, ma il pacchetto trasferito deve essere prima completamente ricevuto per essere ritrasmesso. 9 1.2. COMMUTAZIONE DI CIRCUITO E PACCHETTO Informazione Sorgente Destinazione Ritardo dovuto allo store & forward Figura 1.8: Ritardo nella commutazione a pacchetto. Tale modalità di trasferimento è chiamata store & forward : ogni router prima memorizza completamente l’informazione e poi la spedisce. Il ritardo totale risulta dipendere di conseguenza dal numero di apparati attraversati. 1.2.1 Ritardo di trasmissione dei pacchetti su Internet In base a quanto affrontato in precedenza (vedi Figura 1.8) si verificano quattro cause per il ritardo di trasmissione dei pacchetti: 1. Elaborazione, nell’ordine di misura in µs. 2. Accodamento, varia a seconda degli altri punti. 3. Trasmissione, nell’ordine di misura in 10/100 µs. 4. Propagazione, nell’ordine di misura in ms. 10 CAPITOLO 1. INTRODUZIONE ALLE RETI Elaborazione: è il tempo necessario per determinare la porta del router ; esiste la tabella di routing che indica dove devono dirigersi i pacchetti. Accodamento: è il tempo speso nel buffer prima di essere trasmesso. Trasmissione: è dipendente dalla velocità di trasmissione e dalla dimensione del pacchetto. temp trasmissione = dim pacchetto vel trasmissione Propagazione: è il tempo per percorrere la distanza verso il router successivo. In linea di massima vengono definiti gli ordini di grandezza dei ritardi: • Per trasmissioni locali (territorio nazionale) il ritardo è sui 10 − 20 ms. • Per trasmissioni internazionali (sullo stesso continente) il ritardo è sui 30 − 50 ms. • Per trasmissioni intercontinentali il ritardo è sui 100 − 150 ms. Tracciamento dei pacchetti Per tracciare i tempi di ritardo dei pacchetti esistono vari strumenti a seconda di ciò che serve conoscere: • PING: il calcolatore manda una serie di messaggi e misura il tempo che intercorre tra l’invio e la ricezione della risposta (RTT Round Trip Time). Figura 1.9: Esempio di PING. 1. L’istruzione ping www.repubblica.it indica alla macchina di effettuare un ping all’indirizzo indicato. 2. Viene ripetuto il comando ping, ma con un altro nome (diverso dall’istruzioine iniziale) che lo segue. Non essendoci un unico server che risponde alle richieste, si viene indirizzati verso un server fisico con un nome differente che risponderà alla richiesta. 3. Tra parentesi è descritto un codice numerico, il quale identifica il server fisico, e prende il nome di indirizzo IP. 4. L’ultimo parametro specifica il tempo che si impiega per raggiungere il server e tornare indietro. In questo caso tutti i tempi sono abbastanza vicini tra loro, di conseguenza non sono avvenuti momenti di congestione3 . 3 Lungo il percorso in un qualsiasi luogo i pacchetti trovano delle code che aumentano il ritardo. 1.2. COMMUTAZIONE DI CIRCUITO E PACCHETTO 11 • TRACEROUTE: la macchina determina l’RTT tra la sorgente e tutti gli apparati di rete intermedi. Figura 1.10: Esempio di traceroute. 1. L’istruzione traceroute www.repubblica.it indica alla macchina di effettuare un traceroute all’indirizzo indicato. 2. Il primo numero che viene indicato identifica l’apparato che si incontra durante il percorso; nell’esempio effettuato ci sono stati 16 apparati (vedi Figura 1.10). Subito dopo segue difatti l’indirizzo IP o nome logico dell’apparato. 3. I tre valori di ritardo sono legati ai tre invii di pacchetti all’apparato, quindi cambiano ogni volta in base alla situazione in cui è la rete. Nel caso i valori di ritardo siano minori rispetto le righe precedenti non significa che alcuni apparati funzionano meglio di altri, bensì le misurazioni sono effettuate in momenti diversi comportando risultati diversi. 4. Gli asterischi indicano che lo specifico router è stato configurato in maniera tale da ignorare i pacchetti, così da non restituire alcuna risposta e non poter misurare il ritardo. Quando si trovano all’interno di una rete due porzioni di cammino equivalenti nel costo, si effettua il load balancing . Questa tecnica consiste nel mandare i pacchetti in cammini differenti, al fine di non sovraccaricare il singolo percorso. Figura 1.11: Esempio di load balancing. 12 CAPITOLO 1. INTRODUZIONE ALLE RETI ⇒ Quanta informazione si riesce a trasmettere tra sorgente e destinazione? Sul singolo collegamento si ha una quantità definita banda di trasmissione. Ogni collegamento possiede due direzioni: upload e download ; in tecnologie come l’ADSL la A iniziale dell’acronimo significa asimmetrico, quindi le due velocità non è detto che siano le stesse, invece tecnologie come quella ethernet sono tipicamente simmetriche offrendo la medesima banda in entrambe le direzioni. La velocità è relativa, per esempio, al percorso tra la propria casa e la centrale telefonica. Nel momento in cui bisogna proseguire il percorso entrano in gioco altri fattori: • Se ci sono percorsi con più link la velocità di trasmissione è determinata dal collo di bottiglia (bottleneck ), cioè bisogna sottostare a chi possiede la banda più limitata. La velocità di trasmissione end-to-end è chiamata throughput (THR). 1.3 Modello a strati Quando due entità devono comunicare tra di loro bisogna risolvere due problemi: • Comunicazione fisica: è il trasferimento dell’informazione, ossia come vengono presi i bit generati dal calcolatore A e trasportati l’altro calcolatore e viceversa. • Comunicazione logica: riguarda l’informazione che viene scambiata, ovvero la codifica dell’informazione. Comunicazione logica MESSAGGIO Livelli H1 H1 MESSAGGIO H1 H2 H1 H1 H1 H2 H1 H1 H2 H1 H2 . . . H1 H1 H2 H1 H2 . . . bit 1 0 1 1 0 Comunicazione fisica Figura 1.12: Modello a strati/livelli. Ogni strato/livello svolge una serie di operazioni di elaborazioni, difatti la comunicazione tra due strati/livelli omologhi (peer ) avviene attraverso un protocollo. Definizione (Protocollo). Insieme di regole che sovraintendono alla comunicazione tra entità dello stesso livello. Il protocollo definisce il formato dei messaggi/intestazione (header ) e il comportamento/le azioni da intraprendere. 1.3.1 Funzionalità dei diversi livelli Il modello (teorico) ISO/OSI (ISO International Organization for Standardization, OSI Open System Interconnection) comprende sette differenti livelli che operano come visto in precedenza: 13 1.3. MODELLO A STRATI fisico, collegamento, rete, trasporto, sessione, presentazione e infine applicazione. In generale l’host detiene tutti i livelli, poiché (vedi Figura 1.2) è necessario indicare tutte le specifiche informazioni per inviare il messaggio e poi conoscerle quando lo si deve ricevere. Soltanto i sistemi intermedi possiedono i primi tre livelli, perché il loro scopo è quello di portare a destinazione il pacchetto, non serve conoscere il contenuto e pertanto si semplifica l’architettura. Tale modello teorico è stato sostituito dal modello TCP/IP (TCP Transmission Control Protocol, IP Internet Protocol ). I sistemi intermedi mantengono la stessa struttura proposta con il modello ISO/OSI (tre livelli), mentre gli host nello user space si hanno solo due livelli anziché quattro: trasporto e applicazione. APPLICAZIONE Livelli dei mezzi RETE COLLEGAMENTO DATI Livelli degli host TRASPORTO FISICO Il livello di trasporto ingloba anche i livelli di sessione e presentazione che erano presenti nel modello ISO/OSI. Il nome TCP/IP deriva dai due principali protocolli utilizzati in questa architettura: 14 CAPITOLO 1. INTRODUZIONE ALLE RETI • Livello di trasporto: TCP. • Livello di rete: IP. L’insieme dei protocolli di un’architettura è chiamato “stack protocollare”. Nel modello TCP/IP a volte può capitare di vedere rappresentazioni che uniscono in un solo livello (accesso alla rete) i livelli fisico e collegamento dati. Cos’è un’entità? L’entità è il processo avviato dalla macchina. Di norma viene identificata mediante l’indirizzo del calcolatore (indirizzo IP) e l’identificatore del processo (porta). Su due calcolatori ci sono una serie di processi, se due di questi vogliono comunicare tra loro allora al calcolatore A verrà associato un IP e altrettanto al calcolatore B, invece il processo sarà legato a una specifica porta4 . La tupla (IPA , IPB , portaA , portaB ) identifica un flusso di comunicazione. ⇒ Dove si trovano queste informazioni (IP e porta)? Tra le varie informazioni dell’header di trasporto c’è il numero di porta: APPLICAZIONE Messaggio TRASPORTO H1 RETE H1 H1 H2 H1 H2 H1 : tra le varie informazioni contenute nell’header di trasporto c’è il numero di porta. H2 : tra le varie informazioni contenute nell’header di rete c’è l’indirizzo IP. 1.3.2 Indirizzi IP Gli indirizzi IP5 sono identificatori univoci di un host all’interno della rete. Sono dedicati all’header del livello di rete (IP) 32 bit e ci sono due sezioni: IP sorgente e IP destinazione. Esempio (Indirizzo IP). 10101110.10101100.00011001.10011001 | {z } 32 bit Per facilitare la lettura degli indirizzi si considerano i 32 bit prendendo 8 bit per quattro blocchi, e si traduce ciascun blocco in un intero: 8 bit → Tutti i blocchi vengono separati con un punto. 4 Le porte sono diverse per tutti i processi. del livello di rete. 5 Indirizzi 28 − 1 = 255 15 1.3. MODELLO A STRATI Processo che gira su host A Processo che gira su host B IPS = A IPD = B PAYLOAD HEADER PAYLOAD HEADER IPS = B IPD = A Notazione decimale puntata ⇒ I bit degli indirizzi IP hanno tutti lo stesso peso? prefisso suffisso z }| { z }| { Esempio (Numeri telefonici linee fisse). 0039 045 |{z} 802 7059 |{z } |{z} |{z } pref. codice univr inter. città verona interno In generale si possono identificare due porzioni del numero di telefono: • Prefisso: internazionale, codice città e rete. Questa porzione è utilizzata per identificare geograficamente dove si trova la rete. • Suffisso: interno che appartiene alla rete. ⇒ Come si identificano le cifre che appartengono al prefisso e quelle del suffisso? Nel caso dei numeri telefonici si ha: 045/ . . . / . . . / . . . La suddivisione tra prefisso e suffisso è utilizzata anche negli indirizzi IP: il prefisso indica una rete specifica all’interno di Internet, mentre il suffisso identifica un host della rete. Al prefisso vengono dedicati un certo numero di bit in base alla grandezza della rete. Si utilizza la notazione barrata: dopo l’indirizzo di aggiunge una barra che indica il prefisso: 157.27.12.63/16, in questo esempio i primi 16 bit indicano il prefisso. Esempio (Traduzione di indirizzi IP). • 11100011.11011011.10001011.01101111: si utilizza la somma delle potenze del 2: 1 1 1 0 0 1 1 1 . 17 16 05 14 13 02 11 10 . 17 06 05 04 13 02 11 10 . 07 16 15 04 13 12 11 10 27 26 25 24 23 22 21 20 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 128 + 64 + 32 + 4 + 2 + 1 . 128 + 64 + 16 + 8 + 2 + 1 . 128 + 8 + 2 + 1 . 64 + 32 + 8 + 4 + 2 + 1 Risultato finale → 231.219.139.111 16 CAPITOLO 1. INTRODUZIONE ALLE RETI • 221.34.255.82: si utilizza il metodo delle sottrazioni successive o del resto con la divisione per 2: 221 110 55 27 13 6 3 1 2 2 2 2 2 2 2 1 0 1 1 1 0 1 1 34 17 8 4 2 1 2 2 2 2 2 0 1 0 0 0 1 255 127 63 31 15 7 3 1 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 82 41 20 10 5 2 1 2 2 2 2 2 2 0 1 0 0 1 0 1 Risultato finale → 11011101.00100010.11111111.01010010 Esempio (Calcolo degli host). Quanti host sono contenuti in un indirizzo con /20? xxxxxxxx.xxxxxxxx.xxxxxx | {z } xx.xxxxxxxx | {z } prefisso 20 bit suffisso 12 bit #host = 232−20 = 212 = 4096 indirizzi Conoscere il proprio IP e dimensione della rete Per conoscere il proprio IP si utilizzano i comandi ifconfig (GNU/Linux, Mac Os) e ipconfig (Windows) sul prompt/shell. 1. L’indirizzo presente è quello assegnato alla macchina. 2. La netmask 6 permette di sapere qual è la dimensione della rete. Per identificare il numero di bit per il prefisso, i calcolatori utilizzano una sequenza di 32 bit in cui i bit associati al prefisso sono posti a 1, mentre quelli del suffisso a 0. 6 Lo si può trovare in forma decimale o esadecimale. 17 1.3. MODELLO A STRATI Nella precedente Figura la maschera è in notazione decimale e corrisponde a: 255.255.255.0 → 11111111.11111111.11111111.00000000 Se la netmask fosse stata in notazione esadecimale non sarebbe cambiato niente: 0xffffff00 → 11111111.11111111.11111111.00000000 Esempio. Un /16 viene tradotto come 11111111.11111111.00000000.00000000, questa è definita maschera. Di conseguenza nella Figura del comando ifconfig la maschera corrisponde a una /24. Per determinare altre informazioni sulla rete c’è a disposizione il comando: whois ⟨indirizzo ip⟩. In genere le voci: • inetnum: è il range degli indirizzi disponibili (partendo dal primo fino ad arrivare all’ultimo). • route: indica la medesima informazione di inetnum, ma con la notazione barrata. Esempio. Dato l’indirizzo 157.27.200.150 appartenente alla rete 157.27.0.0/16, dunque i primi 16 bit sono quelli dedicati al prefisso. Osservazione (1). quando si ha a che fare con intere reti, ci si focalizza sul prefisso e tutti i bit del suffisso sono posti a 0. Osservazione (2). se il comando ifconfig mostra di essere su una /24 e whois su una /16. Il motivo di questa situazione è dato dal subnetting. 1.3.3 Subnetting Il subnetting è il processo di suddivisione della rete in sotto reti: nel momento in cui è necessario gestire reti molto grandi risulta comodo suddividere ulteriormente la rete in sotto reti. Rete universitaria Sotto rete 1 Sotto rete 2 GARR Sotto rete 3 Esempio (Rete universitaria). Poiché ci sono più sedi è difficile gestire un’unica rete, allora l’idea è quella di spezzare (per esempio) una /16 e generare diverse /20. La rete dall’esterno continua ad apparire a /16, ma internamente dopo aver suddiviso in sotto reti è facile creare un instradamento che avviene sulla scala minore. 18 CAPITOLO 1. INTRODUZIONE ALLE RETI ⇒ Come si creano sotto reti partendo da un blocco di indirizzi? Viene preso un indirizzo casuale in notazione decimale puntato 180.190.0.0/16, e lo si trasforma in binario 10110100.10111110.00000000.00000000/16. Bisogna dividere la rete in due sotto reti di pari dimensione: si considera il primo bit del suffisso incorporandolo nella parte di prefisso (cambiando da 16 a 17 bit): • Prima sotto rete: 10110100.10111110. ? 0000000.00000000/17 • Seconda sotto rete: 10110100.10111110. ? 0000000.00000000/17 Come ultimo bit di suffisso (rettangolo colorato) va inserito rispettivamente 0 e 1: • Prima sotto rete: 10110100.10111110. 0 0000000.00000000/17, traducendosi in: 180.190.0.0/17 • Seconda sotto rete: 10110100.10111110. 1 0000000.00000000/17, traducendosi in: 180.190.128.0/17 Inizialmente la rete disponeva di 232−16 = 216 = 65536 indirizzi, mentre ora entrambe le sotto reti hanno a disposizione 232−17 = 215 = 32768 indirizzi. 1.4 Blocco CIDR I blocchi di indirizzi sono detti anche blocchi CIDR (Classless Inter Domain Routing). Storicamente l’indirizzamento era classfull, ossia un approccio basato su classi, in cui i bit iniziali dell’indirizzo determinavano automaticamente la classe d’appartenenza. Esempio. Se l’indirizzo IP inizia con 0, allora il prefisso è di 8 bit e appartiene alla classe A: IP }| { z . 01011011.11101100.10000011 Classe A 01010111 {z } | {z } | prefisso suffisso Altrimenti se corrisponde a 1 si controlla il secondo bit, se è uguale a 0 allora il prefisso è di 16 bit e appartiene alla classe B: IP Classe B z }| { 10010111.01011011 . 11101100.10000011 | {z } | {z } prefisso suffisso Nel caso fosse 1 si controlla il terzo bit, se è pari a 0 allora il prefisso risulta essere di 24 bit e appartiene alla classe C: IP Classe C z }| { 11010111.01011011.11101100 . 10000011 | {z } | {z } prefisso suffisso 1.4. BLOCCO CIDR 19 Andando avanti esistono anche le classi D (1110) ed E (1111). Nonostante la comodità di questa rappresentazione, l’utilizzo si è fermato agli anni ’90. Esistono un insieme di indirizzi IP riservati, ovvero che non possono essere assegnati agli host, ma svolgono determinati compiti: • Indirizzo di rete: i bit che appartengono al suffisso sono tutti 0 (xxxxxxx.xxxxxxx.xxxxxxx.00000000), il suo scopo è quello di identificare un blocco. • Indirizzo di directed broadcast: i bit del suffisso sono tutti uguali a 1 (xxxxxxx.xxxxxxx.xxxxxxx.11111111), lo si utilizza quando qualcuno vuole inviare un messaggio a tutti gli host appartenenti alla rete. • Indirizzo dove ogni bit è 0 (00000000.00000000.00000000.00000000). • Indirizzo con ogni bit a 1 (11111111.11111111.11111111.11111111). 20 CAPITOLO 1. INTRODUZIONE ALLE RETI Livello applicativo Il livello d’applicazione genera un messaggio applicativo, visto come un’unità che deve essere trasmesso verso una determinata destinazione. Poiché questo livello si interfaccia con quello di trasporto, deve decidere la tipologia di servizio offerto: a livello di trasporto ci sono solo due protocolli, quindi quando l’applicazione ha un messaggio da spedire deve scegliere quale di questi due servizi utilizzare. I protocolli disponibili sono: • TCP (Transission Control Protocol ): prevede un servizio orientato alla connessione e il trasporto affidabile dei dati. Quando un’applicazione invoca TCP come protocollo riceve questi servizi: – Servizio orientato alla connessione: si fa in modo che client e server si scambino informazioni di controllo a livello di trasporto prima che i messaggi a livello di applicazione comincino a fluire. Tale procedura è nominata handshaking : mette in allerta client e server, preparandoli alla partenza di pacchetti. Dopo questa fase, si dice che esiste una connessione TCP tra le socket dei due processi: la connessione è full-duplex , ovvero i due processi possono scambiarsi contemporaneamente messaggi sulla connessione. Infine l’applicazione deve chiudersi quando la connessione termina di inviare messaggi. – Servizio di trasferimento affidabile: i processi comunicanti possono contare su TCP per trasportare i dati senza errori e nel giusto ordine. Quando un lato dell’applicazione passa un flusso di byte alla sua socket, può affidarsi a TCP per consegnare lo stesso flusso di informazioni alla socket di ricezione, senza alcuna perdita o duplicazione. Il protocollo TCP include anche un meccanismo di controllo della congestione. In poche parole si esegue una “strozzatura” del processo d’invio (client o server ) quando il traffico di rete appare eccessivo. • UDP (User Datagram Protocol ): è un protocollo molto leggero, senza connessione e non necessita di handshaking: non fornisce un servizio di trasferimento dati affidabile. Quando un processo invia un messaggio tramite la socket UDP, il protocollo non garantisce che questo raggiunga il processo di destinazione; per di più i messaggi potrebbero non raggiungere la destinazione in ordine. Non è contenuto nemmeno un meccanismo di controllo della congestione, pertanto un processo d’invio UDP spedisce i dati al livello sottostante (di rete) a qualsiasi velocità. 21 22 CAPITOLO 2. LIVELLO APPLICATIVO Il reale throughput end-to-end disponibile può essere inferiore alla velocità d’invio, a causa della banda limitata dei collegamenti coinvolti o a causa della congestione. Un’applicazione che intende comunicare con un host deve selezionare uno di questi due servizi appena descritti. Apertura di una socket Specificare il servizio di livello di trasporto da utilizzare, nella pratica consiste aprire una socket. Per socket si identifica un insieme di parametri, un’astrazione software, che identifica un flusso informativo attraverso: • IP sorgente; • IP destinazione; • Porta sorgente (il processo che genera il flusso); • Porta destinazione. Viene dunque invocata una funzione a livello applicativo che passa questi parametri. Architettura client-server Nella comunicazione tra due host si possono identificare due ruoli distinti: client e server. Il processo che assume il ruolo di client è detto processo client: responsabile di iniziare la comunicazione mandando al server il primo messaggio; in generale, ma non sempre, possiede un indirizzo IP dinamico1 . Il processo server è un processo caricato su un host sempre raggiungibile (possiede un indirizzo IP fisso), pertanto è sempre in ascolto. 1 Rimane lo stesso per tutta la sessione, ma se la macchina cambia posizione all’interno della rete, allora cambia anche indirizzo. 2.1. WEB E HTTP 23 Esempio. Quando un client apre una socket verso un server web, lo fa utilizzando il servizio di livello di trasporto (HTTP) legato al protocollo TCP. Un aspetto da tenere in considerazione è che in questa architettura i client non comunicano direttamente tra loro. Inoltre sono spesso utilizzati data center , i quali consentono di ospitare molti host che creano un potente server virtuale: solitamente ne fanno uso servizi molto imponenti come motori di ricerca, posta elettronica, social networking, ecc. Architettura P2P In un’architettura P2P (peer-to-peer ) l’infrastruttura di server in data center è minima o assente, invece la comunicazione è diretta tra coppie arbitrarie di host, chiamati peer 2 , collegati in modo intermittente. I peer non appartengono a un fornitore di servizi, ma sono computer fissi e portatili controllati dagli utenti. I servizi che possono sfruttare tale architettura di rete possono essere: applicazioni per la condivisione di file, telefonia e videoconferenza su Internet, ecc. Alcune applicazioni potrebbero possedere un’architettura ibrida, combinando P2P con quella client-server. Per esempio applicazioni di messaggistica istantanea, in cui i server sono utilizzati per tenere traccia degli indirizzi IP degli utenti, ma i messaggi sono inviati direttamente tra gli host senza passare attraverso nodi intermedi. 2.1 Web e HTTP A partire dai primi anni del ’90 compare una nuova applicazione: il World Wide Web. Il Web è stata la prima applicazione Internet che ha cambiato il modo di interagire all’interno e all’esterno degli ambienti di lavoro, infatti a differenza dalle altre tipologie di trasmissione (come quella radiotelevisiva) è che opera su richiesta (on demand ). 2.1.1 Protocollo HTTP Il protocollo principale dell’applicazione Web è quello HTTP (HyperText Transfer Protocol ). Questo protocollo è implementato in due programmi, client e server, in esecuzione su sistemi periferici diversi che comunicano tra loro scambiandosi messaggi HTTP. È bene che il passaggio delle informazioni sia stabile e affidabile, di conseguenza l’HTTP si appoggia sul protocollo TCP. Il client inizia una richiesta verso il server per una pagina web, detta anche documento. Essa è costituita da un insieme di oggetti, ossia semplicemente: file HTML, immagini JPEG, applet Java, video, ecc.; tale documento è indirizzabile tramite un URL (Uniform Resource Locator ). La maggioranza di pagine web consiste in un file HTML principale organizzato secondo una propria struttura e avente diversi oggetti referenziati (vedi Figura 2.1). 2 Che significa “pari”, inteso sullo stesso piano. 24 CAPITOLO 2. LIVELLO APPLICATIVO Testo Testo Immagine 1 Immagine 2 Figura 2.1: Struttura di pagina web e oggetti. Quando i client vogliono comunicare con il server, l’utente dal proprio computer utilizza un browser web che implementa il lato client di HTTP, allo stesso modo il web server implementa il lato server di HTTP, il quale ospita gli oggetti da raggiungere indirizzabili tramite URL. Quando l’utente richiede una pagina web cliccando su un collegamento ipertestuale, il browser invia al server messaggi di richiesta HTTP per gli oggetti presenti all’interno del documento. A sua volta il server riceve le richieste e risponde con messaggi di risposta HTTP contenenti gli oggetti. HTTP fa affidamento al protocollo TCP, dunque non si deve preoccupare: dei dati smarriti, di come TCP recuperi le perdite o del riordino dei dati all’interno della rete. Inoltre i server HTTP non mantengono informazioni sui client, difatti è classificato come protocollo senza memoria di stato (stateless protocol ). 25 2.1. WEB E HTTP Client Server www.univr.it Apertura della connessione (eseguita da TCP) GET Maximum segment size REPLY REPLY REPLY Nel dettaglio questa rappresentazione serve a comprendere meglio i passaggi che avvengono durante la comunicazione: • Il protocollo TCP dà il via a una connessione tra client e server, necessaria a informare il server che da lì a poco seguirà una fase di richiesta. Attenzione: la connessione creata non ha niente a che fare con la commutazione a circuito. • Dopo l’apertura della connessione, viene mandata una richiesta di livello applicativo che trasporta un messaggio GET: avvisa il server che si vuole ottenere la struttura della pagina indicata. • Il server risponde con un messaggio di REPLY contenente la pagina stessa. In alcuni casi se la risposta risultasse troppo grande rispetto a un parametro chiamato maximum segment size 3 , allora verrebbe spezzettata in più parti così da essere riassemblati una volta raggiunta la destinazione. 2.1.2 Connessioni persistenti e non persistenti A seconda dell’applicazione e del suo impiego la serie di richieste potrebbe essere effettuata in sequenza, periodicamente a intervalli regolari o in maniera intermittente. Quando tale interazione client-server ha luogo su TCP, gli sviluppatori devono scegliere se ciascuna coppia richiesta/risposta deve essere inviata su una connessione TCP separata o se devono essere sulla medesima connessione. Il primo dei due approcci si dice che usa connessioni non persistenti, mentre il secondo usa connessioni persistenti. Esempio (Connessione non persistente). Si ipotizza che una pagina consisti in un file HTML principale e 10 immagini JPEG con tutti questi oggetti memorizzati sullo stesso server, e che l’URL del file HTML principale sia: http://www.someSchool.edu/someDepartment/home.index. I seguenti passi indicano cosa avviene: 1. Il processo client HTTP inizializza una connessione TCP con il server www.someSchool.edu sulla porta 80 (porta predefinita per HTTP). Associata alla connessione TCP ci saranno una socket per il client e una per il server. 3 Parametro legato alle caratteristiche tecnologiche della connessione. 26 CAPITOLO 2. LIVELLO APPLICATIVO 2. Il client HTTP, tramite la propria socket, invia al server un messaggio di richiesta HTTP che include il percorso /someDepartment/home.index. 3. Il processo server HTTP riceve il messaggio di richiesta attraverso la propria socket associata alla connessione, recupera l’oggetto /someDepartment/home.index dalla memoria centrale o di massa, lo incapsula in un messaggio di risposta HTTP che viene inviato al client mediante la socket. 4. Il processo server HTTP comunica a TCP di chiudere la connessione. Tuttavia la connessione non termina finché non si è certi che il client abbia ricevuto integro il messaggio di risposta. 5. Il client HTTP riceve il messaggio di risposta e la connessione TCP termina. Il messaggio indica che l’oggetto incapsulato è un file HTML e trova i riferimenti ai 10 oggetti JPEG. Quanto appena elencato nell’esempio proposto indicano l’utilizzo di connessioni non persistenti, in cui ogni connessione TCP viene chiusa dopo l’invio dell’oggetto da parte del server. Ciò significa che ciascuna porta trasporta soltanto un messaggio di richiesta e uno di risposta (quindi sono state generate 11 connessioni TCP). Di contro le connessioni non persistenti presentano qualche limite: • Per ogni oggetto richiesto occorre stabilire e mantenere una nuova connessione. • Per ciascuna di queste connessioni si devono allocare buffer e mantenere variabili TCP sia nel client sia nel server. Questo pone un grosso peso al web server che può dover servire contemporaneamente richieste provenienti da centinaia di diversi client. • Ciascun oggetto subisce un ritardo di consegna di 2 RTT: uno per stabilire la connessione TCP e il secondo per richiedere e ricevere un oggetto. Invece con HTTP 1.1 nelle connessioni persistenti il server lascia la connessione TCP aperta dopo l’invio di una risposta, pertanto le richieste e le risposte successive tra gli stessi client e server possono essere trasmesse sulla stessa connessione. Nel dettaglio non solo si può inviare un’intera pagina web su una sola connessione TCP, ma anche spedire allo stesso client più pagine web. Tutte le richieste di oggetti possono essere effettuate di seguito senza aspettare le risposte delle richieste pendenti (pipelining). In generale il server HTTP chiude la connessione quando essa rimane inattiva per un certo lasso di tempo (un intervallo configurabile). 2.1.3 Formato dei messaggi HTTP Le specifiche HTTP includono la definizione dei due formati dei messaggi di richiesta e riposta; HTTP è un protocollo testuale: il messaggio è scritto in testo ASCII, in modo che l’utente sia in grado di leggerlo. Messaggio di richiesta HTTP Il messaggio di richiesta può consistere in un numero indefinito di righe. Ogni riga è seguita da un carattere di ritorno a capo (carriage return) e un carattere di nuova linea (line feed ). La prima riga è detta riga di richiesta (request line) e quelle successive sono dette righe di intestazione (header lines). 2.1. WEB E HTTP 27 Figura 2.2: Formato generale dei messaggi di richiesta HTTP. • La riga di richiesta presenta tre campi (separati da uno space): il metodo, l’URL e la versione di HTTP. Il campo del metodo può assumere diversi valori, tra cui: – GET: richiede un oggetto identificato dal campo URL; – POST: l’oggetto è richiesto tramite i dati inseriti in un form; – HEAD: è simile al metodo GET, ma il server quando risponde tralascia gli oggetti richiesti; – PUT: consente agli utenti di inviare un oggetto a un percorso specifico su un determinato web server ; – DELETE: consente la cancellazione di un oggetto su un server. La maggior parte di richieste HTTP usano il metodo GET per quando il browser richiede un oggetto identificato dal campo URL. • Le righe di intestazione specificano: l’Host su cui risiede l’oggetto4 ; Connection indica se il browser che comunica al server si deve occupare delle connessioni persistenti; Useragent dichiara il tipo di browser cui effettua la richiesta; infine Accept-language specifica la lingua preferita (se disponibile) dall’utente. Esempio. Sul browser si ricerca www.univr.it/pagina.html GET /pagina.html HTTP/1.1 Host: www.univr.it Connection: close User-agent: Mozilla/4.0 Accept-language: en Sul browser si ricerca http://www.someSchool.edu/somedir/page.html GET /somedir/page.html HTTP/1.1 Host: www.someschool.edu Connection: close User-agent: Mozilla/5.0 Accept-language: fr 4 L’informazione fornita dalla linea di intestazione dell’host viene richiesta dalle cache dei proxy. 28 CAPITOLO 2. LIVELLO APPLICATIVO Dopo le iniziali righe di richiesta e di intestazione segue una riga vuota di separazione, e si arriva al corpo dell’entità (entity body). Quest’ultimo risulta vuoto nel caso del metodo GET, diversamente si riempie quando un client HTTP fa uso del metodo POST per riempire un campo form: i contenuti richiesti alla pagina web dipendono dall’inserimento nel campo che finisce all’interno del corpo dell’entità. Messaggio di risposta HTTP Il messaggio di risposta avviene sempre, anche quando la richiesta effettuata è stata creata erratamente. In questo caso il messaggio è composto da: una prima riga detta riga di stato, poi da una o più righe di intestazione e infine dal corpo. Figura 2.3: Formato generale dei messaggi di risposta HTTP. • La riga di stato è formata da tre campi: la versione del protocollo, un codice di stato e un corrispettivo messaggio di stato. • Le righe di intestazione si differenziano in varie etichette: Connection comunica al client le intenzioni verso la connessione TCP dopo l’invio del messaggio (se chiuderla o no); Date indica l’ora e la data di creazione e invio della risposta da parte del server ; Server specifica come è stato generato il messaggio di risposta (analoga all’User-agent); LastModified dichiara l’istante e la data il cui l’oggetto è stato creato o modificato per l’ultima volta; Content-Length comunica il numero di byte dell’oggetto inviato; Content-Type indica il tipo dell’oggetto nel corpo. • Il corpo è la parte più importante del messaggio: contiene l’oggetto richiesto. Esempio. Risposta al precedente secondo esempio: HTTP/1.1 200 OK Connection: close Date: Thu, 18 Aug 2015 15:44:04 GMT Server: Apache/2.2.3 (CentOS) Last-Modified: Tue, 18 Aug 2015 15:11:04 GMT Content-Length: 6821 Content-Type: text/html (data data data data data ...) 2.1. WEB E HTTP 29 Nell’esempio si verifica uno dei tanti codici di stato: • 200 OK: la richiesta ha successo e come risposta si invia l’informazione. • 301 Moved Permanently: l’oggetto richiesto è stato trasferito in modo permanente. Il nuovo URL è specificato nell’intestazione Location del messaggio di risposta. • 400 Bad Request: è un codice di errore generico che indica l’invio di una richiesta non compresa dal server. • 404 Not Found: il documento richiesto non esiste sul server. • 505 HTTP Version Not Supported: il server non dispone della versione di protocollo HTTP richiesta. Interazione con i web server Il comando Telnet5 apre una connessione TCP alla porta 80 dell’host cis.poly.edu e invia una richiesta HTTP. Successivamente avviene un messaggo di risposta che include il file HTML e altri parametri visti in precedenza. In alternativa, solo per i sistemi Unix e Unix-like, è possibile utilizzare il comando nc (netcat). Oltre all’indicare il nome dell’host e la porta con la quale aprire una connessione TCP, ci sono dei parametri da aggiungere: • -v sta per verbose, ossia fornisce alcune informazioni aggiuntive. • -c per MacOs e -C per GNU/Linux: invia CRLF (Carriage Return Line Feed ) come fine riga. 5 Disponibile per sistemi Windows e GNU/Linux. 30 CAPITOLO 2. LIVELLO APPLICATIVO 1. Si avvia il comando nc specificando i parametri -vC, il nome dell’host e la porta. 2. Si riceve un messaggio di successo alla connessione. 3. Manualmente si inserisce la richiesta dal fare al server (si preme il tasto “invio” due volte per spedire la richiesta). 4. Il server risponde indicando l’errore 400, poiché la richiesta prima non è stata effettuata correttamente secondo le regole. 1. In questo esempio oltre ad aver effettuato la richiesta GET e stato specificato pure l’host. 2. Il server risponde indicando il codice 301, cioè che la pagina richiesta è stata spostata in maniera permanente (l’URL appare in Location). Quest’ultimo tentativo invece riporta un esito positivo, poiché la richiesta è stata espressa correttamente ed è presente al posto giusto la pagina. 2.1. WEB E HTTP 31 Quando si vuole accedere a un sito che utilizza il protocollo https bisogna cambiare comando: openssl. Seguono una serie di parametri: s_client identifica la macchina come client che vuole effettuare la richiesta; -crlf specifica la codifica dell’invio a capo; -connect connette all’indirizzo che si vuole raggiungere. Se si invia tale comando si ricevono varie informazioni dove: • In una prima fase, essendo HTTPS, c’è lo scambio di informazioni relative alla creazione di una connessione sicura (connessione cifrata). Vengono scambiati certificati, chiavi, ecc. • Prima di rendere disponibile la console per inserire le richieste come negli esempi fatti con telnet e nc, c’è una voce identificata come TLS session ticket lifetime hint: 7200 (seconds). Questa riga significa che l’informazione deve essere scritta entro 7200 secondi, altrimenti si interrompe la connessione. • Dopo la creazione di una connessione sicura si inseriscono normalmente le richieste al server. 32 CAPITOLO 2. LIVELLO APPLICATIVO 2.1.4 Interazione utente-server: i cookie I server HTTP sono privi di stato, ciò semplifica la progettazione e garantisce maggiori prestazioni. Tuttavia è bene che i web server autentichino gli utenti, sia per limitare l’accesso sia per fornire contenuti in funzione della loro identità. Ecco che l’HTTP adotta i cookie, ossia un meccanismo che consente ai server di tener traccia degli utenti (sono spesso presenti nella maggior parte di siti commerciali). Come mostrato in figura la tecnologia cookie presenta quattro componenti: 1. Una riga di intestazione nel messaggio di risposta HTTP. 2. Una riga di intestazione nel messaggio di richiesta HTTP. 3. Un file mantenuto sul sistema dell’utente e gestito dal browser. 4. Un database sul sito. Tenendo ancora in considerazione quest’ultimo esempio, ciò che accade è: 0. In un tempo passato l’utente ha effettuato l’accesso al sito di eBay. 1. L’utente accede al Web tramite browser e si dirige sul sito di Amazon.com. 2. Quando la richiesta arriva al web server di Amazon, il sito crea un identificativo unico e una voce nel proprio database, indicizzata dal numero identificativo. 3. A questo punto il server risponde al browser dell’utente, includendo nella risposta HTTP l’intestazione Set-cookie (contenitore del numero identificativo). 2.1. WEB E HTTP 33 4. Nel momento in cui il browser dell’utente riceve il messaggio di risposta, visualizza l’intestazione Set-cookie: aggiunge una riga al file dei cookie che gestisce. Essa include il nome dell’host del server e il numero identificativo. 5. Si noti che il file di cookie contiene già una voce per eBay, difatti mentre l’utente naviga sul sito di Amazon, ogni volta che richiede una pagina web, il browser consulta il file dei cookie. Estrae il numero identificativo per il sito ponendo nella richiesta HTTP una riga di intestazione del cookie che include tale numero: Cookie: 1678. Seguendo tale modo è possibile monitorare l’attività degli utenti all’interno dei siti, nonostante non si conosca necessariamente il nome, si sa esattamente quali pagine sono state visitate dall’utente X (numero identificativo). I cookie possono anche essere usati per creare un livello di sessione utente al di sopra di HTTP che è privo di stato. Per esempio nei servizi di posta elettronica, il browser invia le informazioni del cookie al server permettendo a quest’ultimo di identificare l’utente attraverso la sessione utente dell’applicazione. Con l’utilizzo dei cookie nascono controversie riguardo la violazione della privacy dell’utente. Usando una combinazione di cookie e di informazioni fornite dall’utente, un sito web può imparare molto sull’utente e potrebbe vendere i dati a terze parti. 2.1.5 Web caching Una web caching , nota come anche proxy server/caching , è un’entità di rete che soddisfa richieste HTTP al posto del web server effettivo. Il proxy ha una propria memoria su disco (una cache) in cui conserva copie di oggetti recentemente richiesti. Il browser di un utente può essere configurato in modo che tutte le richieste HTTP dell’utente vengano dirette al proxy server. Esempio (Il browser richiede l’oggetto http://www.someschool.edu/campus.gif). 1. Il browser stabilisce una connessione TCP con il proxy server e invia una richiesta HTTP per l’oggetto specificato. 2. Il proxy controlla la presenza di una copia dell’oggetto memorizzata localmente. Se l’oggetto viene rilevato, il proxy lo inoltra all’interno di un messaggio di risposta HTTP. 34 CAPITOLO 2. LIVELLO APPLICATIVO 3. Se invece la cache non dispone dell’oggetto, apre una connessione TCP verso il server d’origine, ossia in questo esempio www.someschool.edu. Poi il proxy invia una richiesta HTTP per l’oggetto. Una volta ricevuta tale richiesta, il server d’origine invia al proxy l’oggetto all’interno di una risposta HTTP. 4. Quando il proxy riceve l’oggetto ne salva una copia nella propria memoria locale e ne inoltra un’altra copia, contenuto all’interno di un messaggio HTTP, al browser sulla connessione TCP esistente con il proxy. Il web caching si è sviluppato per due principali ragioni: • Riduce di molto i tempi di risposta alle richieste dei client. • Riduce il traffico sul collegamento di accesso a Internet, con il vantaggio di non dover aumentare l’ampiezza di banda frequentemente. GET condizionale Sebbene il web caching riduca i tempi di risposta percepiti dall’utente, introduce un nuovo problema: la copia di un oggetto che risiede in cache potrebbe essere scaduta, per esempio viene modificato nel tempo all’interno del sito. Ecco che HTTP presenta un meccanismo tale per cui permette alla cache di verificare se i suoi oggetti sono aggiornati. Questo meccanismo è noto come GET condizionale: un messaggio di richiesta HTTP viene detto messaggio di GET condizionale se usa il metodo GET e include una riga di intestazione If-modified-since. Client Cache Server GET GET If-modified-sin ce: ... dif Not Mo ied Se il valore della riga di intestazione If-modified-since equivale esattamente al valore della riga di intestazione Last-Modified (analizzata nella Figura 2.3), allora ritorna come risposta lo stato 304 Not Modified che comunica al proxy di poter proseguire e inoltrare al browser richiedente la copia dell’oggetto presente in cache. Altrimenti si procede con i passaggi visti per il funzionamento del proxy. 2.2 DNS: servizio di directory di Internet Il DNS (Domain Name System) si occupa di tradurre un indirizzo logico www.nomesito.tld nel corrispondente indirizzo IP. L’utente inserisce nella barra degli indirizzi del browser il nome logico. Prima di creare una connessione tra client e server, avviene una comunicazione con il server DNS in cui viene inviata 35 2.2. DNS: SERVIZIO DI DIRECTORY DI INTERNET una richiesta DNS. A questo punto il server DNS fornisce una risposta che contiene l’indirizzo IP, così che si possa dare il via alla connessione tra client e server. Client Browser Server DNS Server Richiesta DN S www.univr.it Connessione 2.2.1 Organizzazione gerarchica Nessun DNS server ha le corrispondenze per tutti gli host in Internet, infatti sono distribuite tra tutti i DNS server. Esistono tre classi di DNS server organizzati mediante una gerarchia: root server , top-level domain server (TLD) e server autoritativi. Figura 2.4: Gerarchia parziale di server DNS. • Root server : forniscono gli indirizzi IP dei server TLD. • DNS server : si occupano dei domini di primo livello: .com, .net, .edu e .gov; tutti i domini di primo livello relativi ai vari paesi: .it, .uk, .fr, .jp, ecc. Inoltre forniscono gli indirizzi IP dei server autoritativi. • DNS server autoritativi: possiedono i record di organizzazioni dotate di host pubblicamente accessibili tramite Internet. Esempio. Considerando l’indirizzo www.univr.it, lo si legge da destra verso sinistra: .it → corrisponde al dominio principale. In genere può anche specificare la posizione geografica come in questo caso, ma altre volte non è specificato come con i .com (commerciale). Se ne occupa il TLD. 36 CAPITOLO 2. LIVELLO APPLICATIVO univr → identifica all’interno del dominio principale il dominio locale. Se ne occupa il DNS locale. www → identifica una macchina specifica all’interno del dominio locale. Se ne occupa il DNS locale. DNS locale Client www.sito.org DNS root TLD .org TLD .it TLD .com DNS locale ? TLD .org reply Server sito.org ? reply ? IP www.sito. org IP Un utente cerca un certo sito www.sito.org, allora il client interroga il DNS locale. Se il server non riconosce il sito non può fare altro che rivolgersi al DNS root. A questo punto il DNS locale prende in carico la richiesta del client e chiede al root server DNS quale è il TLD che gestisce il .org. In risposta riceve quindi l’indirizzo del TLD .org. Successivamente il DNS locale manda una richiesta al TLD .org chiedendogli quale sia l’indirizzo del server sito.org. Siccome il TLD .org mantiene una lista delle associazioni tra il dominio ricercato e il server DNS locale del sito stesso, risponde con l’indirizzo di quest’ultimo. Infine il DNS locale è finalmente in grado di connettersi al server locale che gestisce tutte le macchine relative al dominio sito.org: gli viene richiesto quale sia l’IP della macchina www.sito.org. Ecco che dopo tutti questi passaggi il client riceve l’IP finale al quale rivolgersi. Per non ripetere l’intero processo di richieste appena visto, il server DNS locale mantiene in memoria le risposte precedenti. Ciò significa che se un altro client successivamente effettua una richiesta per lo stesso sito, il server DNS risponde direttamente con l’informazione desiderata. 2.2.2 Rapporto tra DNS e cache di rete Client www.repubblica.it DNS Cache Server di origine DNS che IP ca If-modified-sinc e Figura 2.5: Rapporto cache/DNS. 2.3. POSTA ELETTRONICA IN INTERNET 37 È ovvio che server come quello per esempio di Repubblica sono tanto carichi di traffico. Di conseguenza l’idea è quella di piazzare per la rete Internet una serie di web cache vicine agli utenti; in questo modo quando un utente fa una richiesta per andare in un determinato sito, in realtà viene rigirato verso la cache più vicina. Quest’ultima ha il compito di mantenere le informazioni allineate rispetto quelle presenti nel server di Repubblica. La prima cosa che fa il client è una richiesta al DNS (vedi Figura 2.5), il quale non risponde con l’indirizzo IP del server di origine, bensì della cache. Il client esegue allora un collegamento con la cache 6 , che per prima cosa verifica se le informazioni sono aggiornate in memoria e poi risponde alla richiesta ricevuta dall’utente. 2.3 Posta elettronica in Internet La posta elettronica rappresenta ancora una delle più importanti killer application. L’e-mail rappresenta un mezzo di comunicazione asincrono: le persone inviano e leggono i messaggi nel momento loro più opportuno, senza doversi coordinare con altri utenti. La moderna posta elettronica ha molte caratteristiche importanti come: gli allegati (attachment), i collegamenti ipertestuali, il testo con formattazione HTML e le foto incorporate. Un tipico messaggio inizia il proprio viaggio dallo user agent 7 , giunge al mail server del mittente e prosegue fino al mail server del destinatario, dove viene depositato nella sua casella. Figura 2.6: Sistema di posta elettronica di Internet. Nell’esempio di Figura 2.6 vengono mostrati: • Agenti utente (user agent): consentono agli utenti di leggere, rispondere, salvare e comporre messaggi. 6 Una 7 Sono buona cache gestisce mediamente il 70-80% delle richieste. i servizi come Microsoft Outlook o Apple Mail. 38 CAPITOLO 2. LIVELLO APPLICATIVO • Server di posta (mail server ): costituiscono la parte centrale dell’infrastruttura del servizio di posta elettronica. Ogni destinatario possiede una casella di posta (mailbox ) collocata in un mail server. • Protocollo SMTP (Simple Mail Transfer Protocol ): rappresenta il principale protocollo a livello di applicazione per la posta elettronica. 2.3.1 Protocollo SMTP Il protocollo SMTP (Simple Mail Transfer Protocol ) trasferisce i messaggi dal mail server del mittente a quello del destinatario, facendo uso del servizio TCP. Questo protocollo è molto più vecchio di HTTP e presenta alcune vecchie caratteristiche, per esempio tratta il corpo e le intestazioni di tutti i messaggi di posta come semplice ASCII a 7 bit. Tuttavia SMTP non usa mail server intermedi per inviare la posta, anche quando i mail server finali sono collocati nel punto più lontano: se il server di un utente A si trova a Hong Kong e quello di un utente B si trova a New York, la connessione TCP ha luogo direttamente tra le due città. In dettaglio se il server di B è spento, il messaggio rimane nel mail server di A attendendo di effettuare un nuovo tentativo; il messaggio non viene posizionato in alcun mail server intermedio. Il processo di trasferimento SMTP di un messaggio da un mail server a un altro avviene nella seguente maniera: 1. Il client SMTP fa stabilire a TCP una connessione sulla porta 25 verso il server SMTP. Se il server è inattivo, il client riprova più tardi. 2. Dopo aver stabilito la connessione, il server e il client effettuano una qualche forma di handshaking a livello applicativo. Durante questa fase il client indica l’indirizzo e-mail del mittente e quello del destinatario. 3. Successivamente il messaggio viene inviato tramite il servizio TCP. Infine viene ordinato a TCP di chiudere la connessione. Confronto con HTTP Entrambi i due protocolli vengono utilizzati per trasferire file da un host a un altro: • HTTP: trasferisce file, spesso chiamati oggetti, da un web server a un web client (in genere browser ). • SMTP: trasferisce file, ossia messaggi di posta elettronica, da un mail server a un altro. Durante il trasferimento sia HTTP sia SMTP utilizzano connessioni persistenti, ma presentano altre differenze come: 1. HTTP è un protocollo pull , ovvero: qualcuno carica informazioni su un web server e gli utenti usano HTTP per “attirarle” a sé dal server. In particolare la connessione TCP viene iniziata dalla macchina che vuole ricevere il file. SMTP è un protocollo push, cioè: il mail server di invio “spinge” i file al mail server in ricezione. Pertanto la connessione TCP viene iniziata dall’host che vuole spedire i file. 2. SMTP compone i messaggi in ASCII a 7 bit, se per caso un messaggio contiene caratteri che non appartengono all’ASCII a 7 bit o dati binari (come un’immagine), ugualmente deve essere codificato in ASCII a 7 bit. Invece HTTP non impone tale vincolo. 2.3. POSTA ELETTRONICA IN INTERNET 39 3. HTTP incapsula ogni oggetto nel proprio messaggio di risposta HTTP, mentre la posta elettronica colloca tutti gli oggetti in un unico messaggio. 2.3.2 Formato dei messaggi di posta Il corpo dei messaggi di posta elettronica è preceduto da un’intestazione contenente informazioni di servizio. Tale informazione periferica è contenuta in una serie di righe di intestazione. Queste righe sono separate dal corpo del messaggio mediante una riga senza contenuto. Come avviene per HTTP, tali righe contengono testo leggibile, costituito da una parola chiave seguita da due punti a loro volta seguiti da un valore. Alcune parole chiave sono obbligatorie, mentre altre sono facoltative: • From: è una parola chiave obbligatoria che contiene come valore la provenienza. • To: è una parola chiave obbligatoria che contiene come valore la destinazione. • Subject: è una parola chiave opzionale che contiene come valore un titolo descrittivo del messaggio. Esempio. Tipica intestazione di un messaggio: From: mittente@mail.com To: destinatario@mail.com Subject: Appunti del corso di reti. Dopo l’intestazione segue una riga vuota, per poi trovare il corpo del messaggio in ASCII. 2.3.3 Protocolli di accesso alla posta Quando SMTP consegna il messaggio dell’utente A al mail server destinatario, questo lo colloca nella casella di posta dell’utente B. Attualmente l’accesso alla posta elettronica utilizza un’architettura client-server : l’utente legge le e-mail con un client in esecuzione sul proprio sistema periferico. Eseguendo un client di posta su un PC locale, gli utenti beneficiano di molteplici possibilità, tra cui la capacità di visualizzare messaggi multimediali e allegati. Non conviene mantenere un mail server sul PC locale, perché dovrebbe essere sempre acceso. Dunque si preferisce che l’utente non abbia in esecuzione uno user agent sul PC locale, ma che acceda alla propria casella memorizzata su un mail server condiviso con altri utenti e sempre attivo. Tale server è generalmente gestito dall’ISP dell’utente, per esempio un’università o un’azienda. Considerando il percorso del messaggio, deve essere depositato nel mail server del destinatario. Per farlo bisognerebbe forzare lo user agent del mittente a spedire messaggi direttamente al mail server del destinatario utilizzando SMTP. Generalmente lo user agent del mittente non dialoga in modo diretto con il server del destinatario. Nel dettaglio l’utente A utilizza SMTP per spingere i messaggi di posta elettronica nel suo mail server, che adotta SMTP per comunicare il messaggio al mail server dell’utente B. POP3 POP3 è un protocollo d’accesso alla posta che entra in azione quando lo user agent (il client) apre una connessione TCP verso il mail server (il server ) sulla porta 110. 40 CAPITOLO 2. LIVELLO APPLICATIVO Quando viene stabilita la connessione TCP, POP3 procede in tre passi: 1. Autorizzazione: lo user agent invia nome utente e password in chiaro per autenticare l’utente. 2. Transizione: lo user agent recupera i messaggi. Inoltre può marcare i messaggi per la cancellazione, rimuovere i marcatori di cancellazione e ottenere statistiche sulla posta. 3. Aggiornamento: questa fase avviene dopo che il client ha inviato il comando quit, che conclude la sessione POP3: il server di posta rimuove i messaggi che sono stati marcati per la cancellazione. IMAP IMAP è anch’esso un protocollo d’accesso alla posta, ma a differenza di POP3 consente di effettuare diverse operazioni: • Associa ogni messaggio arrivato al server a una cartella. I messaggi che arrivano sono associati alla cartella INBOX del destinatario. • Il destinatario può spostare il messaggio in una nuova cartella creata dall’utente, leggerlo, cancellarlo e così via. • Fornisce comandi agli utenti per creare cartelle e spostare i messaggi da una cartella all’altra. Inoltre sono disponibili comandi per effettuare ricerche nelle cartelle remote sulla base di criteri specifici. • I server IMAP conservano informazioni di stato sull’utente da una sessione all’altra. • Consente agli user agent di ottenere singole parti, per esempio tenere solo l’intestazione o una parte di messaggio composto da più elementi. Livello di trasporto Posto tra il livello di applicazione e il livello di rete, il livello di trasporto costituisce una parte centrale dell’architettura stratificata delle reti e riveste la funzione critica di fornire servizi di comunicazione direttamente ai processi applicativi in esecuzione su host differenti. I processi applicativi usano la comunicazione logica fornita dal livello di trasporto per scambiare messaggi, senza preoccuparsi dei dettagli dell’infrastruttura fisica utilizzata per trasportarli. Figura 3.1: Comunicazione logica del livello di trasporto. 41 42 CAPITOLO 3. LIVELLO DI TRASPORTO Come rappresentato nella Figura 3.1 i protocolli a livello di trasporto sono implementati nei sistemi periferici, ma non nei router della rete. In lato mittente il livello di trasporto converte i messaggi che riceve da un processo applicativo in pacchetti a livello di trasporto, noti come segmenti (trasport-layer segment). Questo avviene spezzando se necessario i messaggi applicativi in parti più piccole e aggiungendo a ciascuna di esse un’intestazione di trasporto per creare un segmento. Il livello di trasporto passa il segmento al livello di rete, dove viene incapsulato all’interno di un pacchetto a livello di rete, chiamato datagramma, e inviato a destinazione. I router intermedi agiscono solo sui campi a livello di rete del datagramma, senza esaminare i campi del segmento incapsulato al suo interno. In lato ricevente il livello di rete estrae il segmento dal datagramma e lo passa al livello superiore (quello di trasporto). Quest’ultimo elabora il segmento ricevuto rendendo disponibili all’applicazione destinataria i dati del segmento. Relazione tra i livelli di trasporto e rete All’interno di un sistema periferico, un protocollo di trasporto trasferisce i messaggi dai processi applicativi al livello di rete e viceversa, ma non fornisce alcuna indicazione su come i messaggi siano trasferiti all’interno della rete. Come mostrato in Figura 3.1 i router intermedi non riconoscono né operano su alcuna informazione che il livello di trasporto possa aver aggiunto ai messaggi delle applicazioni. Una rete di calcolatori può rendere disponibili più protocolli di trasporto, ciascuno dei quali può offrire alle applicazioni un modello di servizio differente. Tali servizi sono vincolati dal modello di servizio del protocollo sottostante a livello di rete. Se il livello di rete non può fornire garanzie sul ritardo o sulla banda per i segmenti a livello di trasporto scambiati tra host, allora il protocollo a livello di trasporto non può offrire garanzie sul ritardo o sulla banda per i messaggi applicativi tra processi. Nonostante ciò alcuni servizi possono essere garantiti da un protocollo di trasporto, anche se il sottostante protocollo di rete non offre un servizio corrispondente. Per esempio un protocollo di trasporto offre il servizio di trasferimento dati affidabile alle applicazioni, persino quando il sottostante protocollo di rete non è affidabile, cioè quando il protocollo di rete smarrisce, altera o duplica i pacchetti. Oppure un altro caso può essere che il livello di trasporto utilizzi la crittografia per garantire che i messaggi delle applicazioni non vengano letti da intrusi, anche quando il livello di rete non riesce a garantire la riservatezza dei segmenti a livello di trasporto. Panoramica del livello di trasporto in Internet In generale la rete Internet è una rete TCP/IP, la quale mette a disposizione a livello d’applicazione due diversi protocolli: • UDP (User Datagram Protocol ): fornisce alle applicazioni un servizio non affidabile non orientato alla connessione. • TCP (Transmission Control Protocol ): offre un servizio affidabile e orientato alla connessione. 3.1. MULTIPLEXING E DEMULTIPLEXING 43 Terminologia: si chiama “segmento” il pacchetto a livello di trasporto. Tuttavia si definisce anche “segmento” un pacchetto a livello di trasporto per TCP, mentre altre volte definisce “datagramma” un pacchetto per UDP. In altri casi si usa il termine “datagramma” per il pacchetto a livello di rete. Si premette che il protocollo a livello di rete di Internet ha un nome: IP (Internet Protocol ). Questo protocollo fornisce comunicazione logica tra host; il suo modello di servizio prende il nome di best-effort delivery service 1 : quindi IP tenta di fare del proprio meglio per consegnare i segmenti tra host comunicanti, ma non offre garanzie: sulla consegna, sull’ordine originario e nemmeno sull’integrità dei dati all’interno dei segmenti. Per queste ragioni IP offre un servizio non affidabile. Il compito principale per i servizi UDP e TCP è quello di estendere il servizio di consegna di IP, questo passaggio da a consegna host-to-host consegna process-to-process prende il nome di multiplexing e demultiplexing a livello di trasporto2 . Inoltre UDP e TCP forniscono un controllo di integrità includendo campi per il riconoscimento di errori nelle intestazioni dei propri segmenti. In dettaglio UDP, come IP, dispone di un servizio inaffidabile non garantendo che i dati da un processo arrivino intatti o che arrivino in generale al destinatario. Dall’altra parte TCP può offrire un servizio di trasferimento affidabile grazie al controllo di flusso, ai numeri di sequenza, agli acknowledgment e ai timer. Per di più applica anche il controllo di congestione alle applicazioni e a Internet nel suo complesso. 3.1 Multiplexing e demultiplexing Nell’host destinatario il livello di trasporto riceve segmenti dal livello di rete immediatamente sottostante. Il livello di trasporto ha il compito di consegnare i dati di questi segmenti al processo applicativo appropriato in esecuzione nell’host. Esempio. In un calcolatore si hanno quattro processi applicativi in esecuzione: due Telnet, un FTP e un HTTP. Il livello di trasporto quando riceve dati dal livello di rete sottostante, li deve indirizzare a uno di questi quattro processi. Un processo può gestire una o più socket, attraverso le quali i dati fluiscono dalla rete al processo e viceversa. 1 Comunemente detto best-effort, ovvero “massimo sforzo”. seguenti paragrafi questo servizio è trattato per il livello di trasporto nel contesto di Internet, ma è presente in tutte le reti di calcolatori. 2 Nei 44 CAPITOLO 3. LIVELLO DI TRASPORTO Di conseguenza il livello di trasporto nell’host di ricezione in realtà non trasferisce i dati direttamente a un processo, ma a una socket che fa da intermediario. Ciascuna, poiché ce ne possono essere più di una, ha un identificatore univoco il cui formato dipende dal fatto che si tratti di socket UDP o TCP. In lato ricevente, il livello di trasporto esamina i campi delle socket di ricezione e quindi dirige il segmento. Il compito di trasportare i dati dei segmenti a livello di trasporto verso la giusta socket viene detto demultiplexing . Il compito di radunare frammenti di dati da diverse socket sull’host di origine e incapsulare ognuno con intestazioni a livello di trasporto per creare dei segmenti e passarli al livello di rete, viene detto multiplexing . Nell’immagine fornita in precedenza il livello di trasporto nell’host centrale deve effettuare il demultiplexing dal livello di rete di segmenti che possono arrivare sia per il processo P1 sia per P2 ; ciò avviene indirizzando i dati del segmento in ingresso alla giusta socket. Il livello di trasporto nell’host centrale deve raccogliere i dati in uscita dalle socket dei due processi, creare i segmenti a livello di trasporto e passarli al livello di rete. • Il multiplexing a livello di trasporto richiede che: 1. Le socket abbiano identificatori unici. 2. Ciascun segmento presenti campi che indichino la socket cui va consegnato il segmento. Questi sono: – I campi del numero di porta d’origine; – Il campo del numero di porta di destinazione; I numeri di porta sono di 16 bit e vanno da 0 fino a 65535. Quelli che vanno da 0 a 1023 sono chiamati numeri di porta noti (well-know port number ) e sono riservati per essere usati da protocolli applicativi come HTTP (porta 80) e FTP (porta 21). • Il servizio di demultiplexing viene implementato nel seguente modo: ogni socket nell’host deve avere un numero di porta, e quando un segmento arriva all’host il livello di trasporto esamina il numero della porta di destinazione e dirige il segmento verso la socket corrispondente. 3.1.1 Multiplexing e demultiplexing non orientati alla connessione Si genera una socket attraverso Python (clientSocket = socket(AF_INET, SOCK_DGRAM)) alla quale il livello di trasporto assegna automaticamente un numero di porta compreso tra 1024 e 65535 (che ancora non sia stata utilizzata). 3.1. MULTIPLEXING E DEMULTIPLEXING 45 A questo punto si suppone che un processo nell’host A con porta UDP 19157 voglia inviare un blocco di dati applicativi a un processo con porta UDP 46428 nell’host B. Il livello di trasporto crea un segmento che include i dati applicativi, i numeri di porta d’origine (19157) e di destinazione (46428) e altri valori. Questo segmento risultante viene passato al livello di rete che lo incapsula in un datagramma IP ed effettua un tentativo di best-effort di consegna del segmento al destinatario. Quando i segmenti arrivano dalla rete, l’host B dirige ciascun segmento, facendone il demultiplexing, alla socket appropriata esaminando il numero di porta di destinazione del segmento. Una socket UDP viene identificata completamente da una coppia che consiste di un indirizzo IP e di un numero di porta di destinazione. Se due segmenti UDP presentano diversi indirizzi IP e/o diversi numeri di porta d’origine, ma hanno lo stesso indirizzo IP e numero di porta di destinazione, allora saranno diretti allo stesso processo di destinazione tramite la medesima socket. 3.1.2 Multiplexing e demultiplexing orientati alla connessione Una socket TCP è identificata da quattro parametri: indirizzo IP d’origine, numero di porta d’origine, indirizzo IP di destinazione e numero di porta di destinazione. Quando arriva dalla rete un segmento TCP in un host, quest’utilmo utilizza i quattro valori per effettuare il demultiplexing e avviare il segmento verso la socket appropriata. A differenza di UDP, se giungono due segmenti TCP aventi indirizzi IP d’origine o numeri di porta di origine diversi, e anche a fronte di indirizzo IP e porta di destinazione uguali, allora vengono diretti a due socket differenti. Le uniche eccezioni sono i segmenti TCP che trasportano la richiesta per stabilire la connessione. 46 CAPITOLO 3. LIVELLO DI TRASPORTO 3.2 Trasporto non orientato alla connessione (UDP) Il protocollo UDP fa il minimo che si debba fare: funzione di multiplexing/demultiplexing, semplice controllo degli errori e non aggiunge nulla a IP. Infatti scegliere UDP al posto di TCP significa far comunicare in modo diretto l’applicazione con IP. UDP prende i messaggi dal processo applicativo, aggiunge il numero di porta d’origine e di destinazione per il multiplexing/demultiplexing, aggiunge altri piccoli campi e passa il segmento risultante al livello di rete. Quest’ultimo incapsula il segmento in un datagramma IP ed effettua il tentativo di consegna all’host di destinazione in modalità best-effort. Se il segmento arriva a destinazione, UDP utilizza il numero di porta di destinazione per consegnare i dati del segmento al processo applicativo corretto. Si nota però che in UDP non esiste handshaking tra le entità di invio e ricezione a livello di trasporto. Proprio per questo motivo si dice che UDP non è orientato alla connessione. Esempio. DNS è un tipico esempio di protocollo a livello applicativo che utilizza UDP. Uno sviluppatore dovrebbe scegliere UDP, per determinate applicazioni, anziché TCP per i seguenti motivi: • Controllo più fine a livello di applicazione su quali dati sono stati inviati e quando: non appena un processo applicativo passa dei dati a UDP, questo lo impacchetta in un segmento che trasferisce immediatamente al livello di rete. Pertanto non vengono introdotti ritardi (a differenza di TCP) nello stabilire una connessione. • Nessuno stato di connessione: UDP non conserva lo stato della connessione e non tiene traccia dei parametri di numero di sequenza e di acknowledgment. Per cui un server dedicato a una particolare applicazione può generalmente supportare molti più client attivi quando l’applicazione usa UDP al posto di TCP. • Minore spazio usato per l’intestazione del pacchetto: TCP aggiunge all’intestazione dei pacchetti 20 byte, mentre UDP solo 8. 3.2. TRASPORTO NON ORIENTATO ALLA CONNESSIONE (UDP) 47 A volte UDP viene preferito anche perché le applicazioni di gestione della rete vanno spesso in esecuzione quando la rete stessa è in uno stato di stress, più precisamente quando è difficile trasferire dati controllando la congestione o in maniera affidabile. In altri contesti viene preferito UDP per le applicazioni multimediali, ma per il trasporto di dati multimediali in streaming e per ragioni di sicurezza sul blocco del traffico UDP, TCP è più gettonato. Le applicazioni possono ottenere un trasferimento di dati affidabile anche con UDP, a patto che l’affidabilità sia all’interno dell’applicazione stessa. Per esempio il protocollo QUIC (Quick UDP Internet Connection), utilizzato dal browser Chrome di Google, utilizza UDP come protocollo di trasporto e implementa l’affidabilità in un protocollo a livello di applicazione. 3.2.1 Struttura dei segmenti UDP L’intestazione UDP presenta solo quattro campi di due byte ciascuno: • I numeri di porta consentono all’host di destinazione di trasferire i dati applicativi al processo corretto (si effettua il multiplexing). • Il campo lunghezza specifica il numero di byte del segmento UDP. Questo valore è necessario perché la grandezza del campo dati può essere diversa tra un segmento e quello successivo. • Il checksum viene utilizzato per verificare se sono avvenuti errori nel segmento ed è calcolato anche su alcuni campi dell’intestazione IP. 3.2.2 Checksum UDP Il checksum serve a rilevare gli errori, in sostanza viene utilizzato per determinare se i bit del segmento UDP sono stati alterati durante il loro trasferimento da sorgente a destinazione. In lato mittente UDP si effettua il complemento a 1 della somma di tutte le parole da 16 bit nel segmento, e l’eventuale riporto finale viene sommato al primo bit. Tale risultato viene posto nel campo checksum del segmento UDP. Esempio. Si considerano le tre seguenti parole: 0110011001100000 0101010101010101 1000111100001100 48 CAPITOLO 3. LIVELLO DI TRASPORTO La somma delle prime due è: 0110011001100000 0101010101010101 1011101110110101 Sommando la terza parola al risultato precedente si ottiene: 1011101110110101 1000111100001100 1100101011000001 0100101011000010 Nota bene: il riporto di quest’ultima somma è stato sommato al primo bit. Il complemento a 1 si ottiene convertendo i bit 0 in 1 e viceversa. Di conseguenza il checksum è 1011010100111101. In ricezione si sommano le tre parole iniziali e il checksum, se non ci sono errori l’addizione risulta 1111111111111111, altrimenti se un bit vale 0 significa che è stato introdotto almeno un errore nel pacchetto. Il motivo dell’esistenza di questo valore checksum è che non esiste garanzia che tutti i collegamenti tra origine e destinazione controllino gli errori. Inoltre anche se i segmenti fossero trasferiti correttamente lungo un collegamento, potrebbero verificarsi errori mentre il segmento si trova nella memoria di un router. UDP mette a disposizione a livello di trasporto un meccanismo di verifica su base end-to-end se si vuole che il servizio trasferimento dati sia in grado di rilevare eventuali errori. Tuttavia UDP non fa nulla per risolvere le situazioni di errore, alcune implementazioni si limitano a scartare il segmento danneggiato, mentre altre lo trasmettono all’applicazione con un avvertimento. 3.3 Trasporto orientato alla connessione (TCP) TCP viene detto orientato alla connessione in quanto i processi effettuano l’handshake prima di scambiarsi i dati. Come primo passo devono inviarsi reciprocamente alcuni segmenti preliminari per stabilire i parametri del successivo trasferimento dati. Il TCP non è un circuito end-to-end TMD o FMS, in quanto lo stato della connessione risiede completamente nei due sistemi periferici. Dato che il protocollo TCP va in esecuzione solo sui sistemi periferici e non negli elementi di rete intermedi, quest’ultimi non salvano lo stato della connessione rimanendo ignari delle connessioni che avvengono. Viene offerto il servizio full-duplex : su una connessione TCP tra il processo A su un host e il processo B su un altro host, dati a livello di applicazione possono fluire da entrambi i processi nello stesso momento in direzione opposta. TCP è definibile anche punto a punto, in quanto la connessione ha luogo solo tra un singolo mittente e un singolo destinatario; servizi come il multicast, ossia il trasferimento di dati da un mittente a molti destinatari in un’unica operazione, con TCP non è possibile. Si considera l’esempio di un processo client e un processo server che vogliono aprire una connessione. Il processo applicativo client informa il livello di trasporto client di voler stabilire una connessione 3.3. TRASPORTO ORIENTATO ALLA CONNESSIONE (TCP) 49 verso un processo server. A questo punto il TCP in esecuzione sul client procede a stabilire il collegamento con il TCP server : il client invia uno speciale segmento TCP e il server risponde con un secondo segmento speciale TCP, infine il client risponde per l’ultima volta con un terzo segmento speciale. I primi due segmenti non trasportano payload, ovvero non hanno dati a livello applicativo, mentre il terzo segmento può trasportare informazioni utili. Questa procedura per cui i due host si scambiano tre segmenti viene detta handshake a tre vie (three-way handshake). Dopo l’aver instaurato finalmente la connessione TCP i due processi applicativi possono scambiarsi dati. Una nota interessante di TCP è che le specifiche non si preoccupano di indicare quando si debbano inviare dati nel buffer, in sostanza vengono spediti al momento più opportuno. La massima quantità di dati prelevabili e posizionabili in un segmento viene limitata dalla dimensione massima di segmento (MSS maximum segment size). Il valore di MSS viene impostato determinando prima la lunghezza del frame più grande che può essere inviato a livello di collegamento dall’host mittente locale, la cosiddetta unità trasmissiva di segmento (MTU maximum transimission unit). Poi appunto si sceglie un MSS tale che il segmento TCP, una volta incapsulato in un datagramma IP, stia all’interno di un singolo frame a livello di collegamento. Esempio. I protocolli Ethernet e PPP hanno un MTU di 1500 byte, quindi un valore tipico di MSS è 1460 byte (poiché l’intestazione TCP/IP occupa 40 byte). Osservazione. MSS rappresenta la massima quantità di dati a livello di applicazione nel segmento e non la massima dimensione del segmento TCP con intestazioni incluse. TCP accoppia ogni blocco di dati del client a un’intestazione TCP, andando pertanto a formare segmenti TCP. Questi vengono passati al sottostante livello di rete, dove sono incapsulati separatamente nei datagrammi IP a livello di rete, successivamente immessi nella rete. MESSAGGIO H H H Quando il destinatario riceve un segmento, i dati vengono memorizzati nel buffer di ricezione della connessione TCP (ogni lato della connessione presenta un proprio buffer di invio e di ricezione). 3.3.1 Struttura dei segmenti TCP Il segmento TCP consiste di campi intestazione e di un campo contenente un blocco di dati proveniente dall’applicazione. MSS limita la dimensione massima del campo dati di un segmento, ergo quando TCP deve inviare un file di grandi dimensioni lo frammenta in porzioni di dimensione MSS (eccetto l’ultima porzione che ha dimensioni minori). Le applicazioni interattive invece trasmettono blocchi di dati più piccoli di MSS, per esempio le applicazioni di accesso remoto 50 CAPITOLO 3. LIVELLO DI TRASPORTO Figura 3.2: Struttura dei segmenti TCP. come Telnet hanno il campo dei dati di un solo byte. L’intestazione include numeri di porta di origine e di destinazione, utilizzati per il multiplexing/demultiplexing dei dati da e verso le applicazioni del livello superiori, e un campo checksum. L’intestazione dei segmenti TCP comprende poi i seguenti campi: • Numero di sequenza (sequence number ) e il campo numero di acknowledgment (acknowledgment number ): entrambi di 32 bit, vengono utilizzati dal mittente e dal destinatario TCP per implementare il trasferimento dati affidabile. • Finestra di ricezione (receive window ): è di 16 bit, viene utilizzato per il controllo di flusso. • Lunghezza dell’intestazione (header length): è di 4 bit, specifica la lunghezza dell’intestazione TCP in multipli di 32 bit. Tale dimensione è tuttavia variabile a causa del campo opzioni TCP. 3.3. TRASPORTO ORIENTATO ALLA CONNESSIONE (TCP) 51 • Opzioni (options): è di dimensione variabile, viene utilizzato quando il mittente e destinatario concordano la dimensione massima del segmento (MSS) o come fattore di scala per la finestra nelle reti ad alta velocità. • Flag : è di 6 bit: – ACK: viene usato per indicare che il valore trasportato nel campo di acknowledgment è valido, cioè il segmento contiene un acknowledgment per un segmento che è stato ricevuto con successo. – RST, SYN e FIN. vengono utilizzati per impostare e chiudere la connessione. – PSH: se possiede il valore 1 il destinatario deve inviare immediatamente i dati al livello superiore. – URG: indica la presenza di dati che l’entità mittente a livello superiore ha marcato come urgenti. Numeri di sequenza e numeri di acknowledgment I campi numero di sequenza e numero di acknowledgment rappresentano una parte critica del servizio di trasferimento dati affidabile di TCP. Quest’ultimo vede i dati come un flusso di byte non strutturati, ma ordinati. L’uso dei numeri di sequenza in TCP riflette questa visione, dato che i numeri di sequenza si applicano al flusso di byte trasmessi e non alla serie di segmenti trasmessi. Il numero di sequenza per un segmento è pertanto il numero nel flusso di byte del primo byte del segmento. Esempio. Un certo processo nell’host A invia un flusso di dati a un processo sull’host B tramite una connessione TCP. Ecco che TCP numera implicitamente ogni byte del flusso di dati sull’host A. Si ipotizza che il flusso consista in 500000 byte, che MSS valga 1000 byte e che il primo byte del flusso sia numerato con 0. Come si può notare TCP costruisce 500 segmenti, per i quali al primo viene assegnato il numero di sequenza 0, al secondo 1000, al terzo 2000 e così via. Tutti questi numeri vengono inseriti nel campo numero di sequenza dell’intestazione del segmento TCP. La faccenda si complica di più per il numero di acknowledgment. Di per sé il numero di acknowledgment che l’host A scrive nei propri segmenti è il numero di sequenza del byte successivo che attende dall’host B. Esempio. Un host A riceve da B tutti i byte numerati da 0 a 535 e sta per mandare un segmento all’host B. L’host A è in attesa dei successivi byte nel flusso di dati di B, perciò scrive 536 nel campo del numero di acknowledgment del segmento che spedisce a B. 52 CAPITOLO 3. LIVELLO DI TRASPORTO ⇒ Cosa succede quando un host riceve segmenti fuori dalla sequenza nella connessione TCP? Questo avvenimento viene gestito da chi implementa TCP, ma in generale: 1. Il destinatario scarta i segmenti non ordinati. 2. Il destinatario mantiene i byte non ordinati e attende quelli mancanti per colmare i vuoti. 3.3.2 Timeout e stima del tempo di andata e ritorno TCP sfrutta un meccanismo di timeout e ritrasmissione per recuperare i segmenti persi. Stima del tempo di andata e ritorno L’RTT misurato, denotato con SampleRTT, è la quantità di tempo che intercorre tra l’istante d’invio del segmento (quando viene passato a IP) e quello di ricezione dell’acknowledgment del segmento. La maggior parte delle implementazioni TCP effettuano una sola misurazione di SampleRTT alla volta: in ogni istante di tempo viene valutato uno solo dei segmenti trasmessi e per cui non si è ancora ricevuto l’acknowledgment. TCP non calcola mai il SampleRTT per i segmenti ritrasmessi, ma solo per quelli trasmessi una volta. Per effettuare una stima si calcola la media sui valori di SampleRTT, chiamata EstimatedRTT. Questo valore viene aggiornato da TCP a ogni nuovo SampleRTT: EstimatedRTT = (1 − α) · EstimatedRTT + α · SampleRTT dove α = 0.125 (valore raccomandato). Figura 3.3: Valori di SampleRTT ed EstimatedRTT con α = 0.125 per una connessione TCP. Oltre ad avere una stima RTT, è anche importante possedere la misura della sua variabilità. Quest’ultima viene detta DevRTT ed è una stima di quanto SampleRTT si discosta da EstimatedRTT: DevRTT = (1 − β) · DevRTT + β · | SampleRTT − EstimatedRTT | con β = 0.25 (valore raccomandato). 3.3. TRASPORTO ORIENTATO ALLA CONNESSIONE (TCP) 53 Impostazione e gestione del timeout di ritrasmissione L’intervallo di timeout di TCP non può essere inferiore a quello di EstimatedRTT, altrimenti verrebbero inviate ritrasmissioni inutili. Allo stesso tempo non deve nemmeno essere tanto maggiore di EstimatedRTT, altrimenti TCP non ritrasmetterebbe rapidamente il segmento perduto. Allora è bene impostare il timeout pari a EstimatedRTT più un certo margine, che deve essere grande quando c’è molta fluttuazione nei valori di SampleRTT e piccolo nel caso contrario. TimeoutInterval = EstimatedRTT + 4 · DevRTT Come valore iniziale di TimeoutInterval è raccomandato 1 secondo. Quando si verifica un timeout, allora TimeoutInterval viene raddoppiato per evitare timeout prematuri riferiti a segmenti successivi per cui si riceverà presto un acknowledgment. Nel momento in cui viene ricevuto un segmento ed EstimatedRTT viene aggiornato, accade che TiemoutInterval viene ricalcolato secondo la precedente formula. 3.3.3 Trasferimento dati affidabile Utilizzando il servizio IP, i datagrammi possono sovraffollare i buffer dei router e non raggiungere la destinazione, o arrivare in ordine casuale e con bit alterati. TCP ha il computo di creare un servizio di trasporto affidabile al di sopra del servizio inaffidabile e best-effort di IP, assicurando che il flusso di byte che i processi leggono dal buffer di ricezione TCP non sia alterato. Le procedure suggerite per la gestione dei timer utilizzano un solo timer di ritrasmissione, anche in presenza di più segmenti trasmessi. Si suppone che i dati vengano inviati solo in una direzione dell’host A all’host B e che il primo stia trasmettendo un file di grandi dimensioni. Esistono tre eventi principali relativi alla trasmissione e ritrasmissione dei dati: 1. Dati provenienti dall’applicazione: TCP incapsula i dati che gli giungono dall’applicazione in un segmento e lo passa a IP. Ciascun segmento include un numero di sequenza, il quale rappresenta il numero del primo byte di dati del segmento nel flusso di byte. Il timer viene avviato quando il segmento è passato a IP; il timer è associato al più vecchio segmento che non ha ricevuto acknowledgment. 2. Timeout: TCP risponde ritrasmettendo il segmento che lo ha causato e quindi riavviando il timer. 3. Ricezione di un ACK: questo evento deve essere gestito dal mittente TCP, e corrisponde all’arrivo del segmento di acknowledgment con un valore valido nel campo ACK. Quando ciò accade, TCP confronta il valore del campo ACK con la propria variabile SendBase. SendBase è una variabile di stato TCP avente il numero di sequenza del più vecchio byte che non ha ancora ricevuto un acknowledgment. Di conseguenza SendBase − 1 è il numero di sequenza dell’ultimo byte che si sa essere ricevuto correttamente e nell’ordine giusto. Se il valore del campo ACK è maggiore di SendBase, allora l’ACK si riferisce a uno o più segmenti che in precedenza non avevano ricevuto conferma. Il mittente aggiorna la propria variabile SendBase e riavvia il router se non ci sono più segmenti che necessitano di acknowledgment. 54 CAPITOLO 3. LIVELLO DI TRASPORTO Raddoppio dell’intervallo di timeout La prima variante utilizzata dalle implementazioni TCP consiste nella lunghezza dell’intervallo di timeout dopo la scadenza di un timer. Con questa modifica si ritrasmette il segmento con il più basso numero di sequenza che non abbia ricevuto ancora un acknowledgment, in tutti i casi in cui non si verifica, TCP imposta il successivo intervallo di timeout al doppio del valore precedente anziché derivarlo dagli ultimi EstimatedRTT e DevRTT. Esempio. Si suppone che il TimeoutInterval associato al più vecchio segmento che non ha ancora ricevuto acknowledgment sia 0.75 secondi quando il timer scade per la prima volta. TCP ritrasmette quindi questo segmento impostando il tempo di scadenza del timer a 1.5 secondi. Nel caso il timer scada ancora, TCP ritrasmette il segmento stabilendo il timer a 3 secondi e così via. Gli intervalli crescono esponenzialmente a ogni ritrasmissione, tutavia tutte le volte che il timer viene avviato dopo la ricezione di dati dall’applicazione superiore o di un ACK, allora il TimeoutInterval viene ricavato dai più recenti valori di EstimatedRTT e DevRTT. Ritrasmissione rapida Il mittente può rilevare in molti casi la perdita dei pacchetti grazie agli ACK duplicati relativi a un segmento il cui ACK è già stato ricevuto dal mittente. Quando il destinatario TCP riceve un segmento con numero di sequenza superiore al successivo numero di sequenza atteso e in ordine, rileva un segmento mancante nel flusso di dati. Il destinatario allora si limita a mandare nuovamente un acknowledgment relativo all’ultimo byte di dati che ha ricevuto in ordine: si duplica così un ACK. Dato che in molti casi il mittente invia un gran numero di segmenti, se uno di questi si smarrisce allora si verificano ACK duplicati. Nel caso in cui si siano ricevuti tre ACK duplicati, il mittente TCP effettua una ritrasmissione rapida rispedendo il segmento mancante prima che scada il timer. 3.3. TRASPORTO ORIENTATO ALLA CONNESSIONE (TCP) 55 Confronto tra Go-Back-N e ripetizione selettiva Il mittente TCP deve solo memorizzare il numero di sequenza più basso tra i byte trasmessi che non hanno ancora ricevuto acknowledgment (SendBase) e il numero di sequenza del successivo byte da inviare (NextSeqNum). In questo senso TCP assomiglia a un protocollo di tipo GBN. Tuttavia esistono alcune differenze chiave tra TCP e Go-Back-N: • Molte implementazioni TCP memorizzano in un buffer i segmenti ricevuti correttamente, ma non in ordine. • Si considera una sequenza di segmenti 1, 2, . . . , N che arrivano al destinatario in ordine e senza errori, ipotizzando che l’acknowledgment per il pacchetto n < N vada perduto, ma che i restanti N − 1 giungano al mittente prima dei rispettivi timeout. Allora GBN ritrasmetterebbe il pacchetto n e tutti quelli da n + 1 fino N ; TCP ritrasmetterebbe al massimo il segmento n, inoltre nel caso ricevesse l’acknowledgment del segmento n + 1 prima della scadenza del timeout del segmento n, non ritrasmetterebbe nemmeno n. Una modifica proposta di TCP (riscontro selettivo) consente al destinatario di mandare acknowledgment in modo selettivo per i segmenti non in ordine anziché cumulativamente per l’ultimo segmento ricevuto senza errori e nell’ordine giusto. Se combinato con la ritrasmissione selettiva, TCP è molto simile a un generico protocollo SR. Pertanto è corretto classificare il meccanismo di ripristino degli errori di TCP come un ibrido tra i protocollo GBN e SR. 3.3.4 Controllo di flusso Gli host estremi delle connessioni TCP possiedono dei buffer di ricezione, per i quali quando la connessione TCP riceve byte corretti e in sequenza, li riempiono. Il processo applicativo associato legge i dati dal buffer in un certo istante (non è detto che sia quando arrivano i dati). Se l’applicazione risulta lenta nella lettura si corre il rischio che il mittente mandi in overflow il buffer di ricezione. Dunque TCP offre un servizio di controllo di flusso alle proprie applicazioni: si controlla la velocità della frequenza d’invio del mittente con quella di lettura del destinatario. Questo controllo è detto controllo della congestione (vedi nel dettaglio le Sezioni 3.4 e 3.5). Le azioni effettuate dal controllo di flusso e di congestione sono simili, ossia rallentare il mittente, ma compiute per differenti ragioni. Si premettono le seguenti informazioni: • L’implementazione obbliga il destinatario TCP a scartare i segmenti non in ordine. • TCP fa mantenere al mittente una variabile chiamata finestra di ricezione che fornisce un’indicazione dello spazio libero nel buffer del destinatario. Essendo poi TCP full-duplex, i due mittenti mantengono le finestre di ricezione distinte. Esempio. Si suppone che l’host A invii un file di grandi dimensioni all’host B su una connessione TCP. L’host B alloca un buffer di ricezione, avente la dimensione denotata come RcvBuffer. Inoltre si definiscono ulteriori variabili: 56 CAPITOLO 3. LIVELLO DI TRASPORTO • LastByteRead: contiene il numero dell’ultimo byte nel flusso di dati che il processo applicativo in B legge dal buffer , • LastByteRcvd: contiene il numero dell’ultimo byte nel flusso dati che proviene dalla rete, inoltre viene copiato nel buffer di B. Poiché TCP non manda in overflow il buffer allocato si deve avere: LastByteRcvd − LastByteRead ≤ RcvBuffer La finestra di ricezione (rwnd) è impostata alla quantità di spazio disponibile nel buffer : rwnd = RcvBuffer − [ LastByteRcvd − LastByteRead ] In pratica l’host B comunica all’host A quanto spazio è disponibile nel buffer, scrivendo il valore Figura 3.4: rwnd è dinamica nel tempo. di rwnd nell’apposito campo dei segmenti che manda ad A. L’host B inizializza rwnd con il valore di RcvBuffer e tiene traccia di variabili specifiche per ogni connessione. In altrettanto modo l’host A tiene traccia di LastByteSent e LastByteAcked, ovvero l’ultimo byte mandato e l’ultimo byte per cui si è ricevuto acknowledgment. Se si mantiene la quantità di dati senza acknowledgment (ricavata dalla differenza delle due precedenti variabili in A) sotto il valore di rwnd, allora non si verifica l’overflow : LastByteSent − LastByteAcked ≤ rwnd Nonostante questo schema funzioni, esiste un problema tecnico dietro le quinte. Esempio. Si suppone che il buffer di ricezione dell’host B si riempia in modo che rwnd = 0, e che dopo averlo notificato all’host A non abbia più nulla da inviare. Quando il processo applicativo in B svuota il buffer, TCP non invia nuovi segmenti con nuovi valori di rwnd. Perciò l’host A rimane bloccato senza poter inviare ulteriori dati, perché non è informato sullo spazio libero presente nel buffer. Ecco che l’host A deve continuare a inviare segmenti a B finché rwnd non diventa 0: prima o poi il buffer inizierà a svuotarsi e i riscontri conteranno un valore non nullo per rwnd. UDP invece non offre un controllo di flusso. In un tipica implementazione UDP, il protocollo mette in coda i segmenti in un buffer di dimensione finita che precedete la socket. Se il processo non legge i segmenti del buffer a velocità sufficiente, si verifica un overflow con la perdita di alcuni segmenti. 3.3. TRASPORTO ORIENTATO ALLA CONNESSIONE (TCP) 3.3.5 57 Gestione della connessione TCP Si suppone che un processo in esecuzione in un host (client) voglia iniziare una connessione verso un altro processo in un altro host (server ). Il processo applicativo client informa per prima cosa il lato client di TCP di voler stabilire una connessione verso un processo nel server. Il TCP client procede a stabilire una connessione TCP con il TCP nel server così come segue: 1. TCP lato client invia uno speciale segmento3 , che non contiene dati a livello applicativo, bensì il bit SYN posto a 1 (vedi Figura 3.2), al TCP server. Inoltre il client sceglie un numero casuale di sequenza iniziale (client_isn) e lo pone nel campo di sequenza del segmento SYN iniziale. Quest’ultimo viene incapsulato in un datagramma IP e inviato al server. 2. Quando il precedente segmento SYN arriva all’host server (se arriva), il server : estrae il segmento dal datagramma, alloca i buffer e le variabili TCP alla connessione e invia un segmento4 di connessione approvata al client TCP. Anche questo segmento non contiene dati a livello applicativo, ma solo tre informazioni importanti: • SYN posto a 1. • Il campo ACK assume il valore client_isn + 1. • Il server sceglie il proprio numero di sequenza iniziale (server_isn) e lo pone nel campo numero di sequenza. 3. Alla ricezione di quest’ultimo segmento, anche il client alloca il buffer e variabili alla connessione. L’host invia al server un altro segmento in risposta al segmento di connessione approvata. Tale operazione viene svolta dal client ponendo il valore server_isn + 1 nel campo ACK dell’intestazione del segmento TCP. Il bit SYN è posto a 0 dato che la connessione è stata stabilita. Una volta conclusa questa serie di passi, gli host client e server possono scambiarsi i segmenti contenenti i dati (aventi sempre SYN posto a 0). 3 Questo 4 Viene segmento è chiamato segmento SYN. detto segmento SYNACK. 58 CAPITOLO 3. LIVELLO DI TRASPORTO Tutta la procedura per stabilire la connessione viene detta handshake a tre vie. In conclusione ciascuno dei due processi può terminare la connessione TCP. Quando ciò avviene le risorse negli host vengono deallocate. Il processo applicativo invia un comando di chiusura che forza il client TCP a inviare un segmento speciale al processo server ; nell’intestazione il bit FIN è posto a 1. Il server risponde inviando un acknowledgment al client e invia un segmento di shutodown con FIN = 1. Infine il client spedisce un acknowledgment a quest’ultimo segmento e le risorse vengono deallocate. 3.4. PRINCIPI DEL CONTROLLO DI CONGESTIONE 59 Nell’arco di una connessione TCP i protocolli in esecuzione negli host attraversano vari stati TCP: Figura 3.5: Stati visitati da un client TCP. Figura 3.6: Stati visitati da un server TCP. 3.4 Principi del controllo di congestione La congestione della rete è causata da troppe sorgenti che inviano dati a ritmi troppo elevati. 60 CAPITOLO 3. LIVELLO DI TRASPORTO 3.4.1 Cause e costi della congestione Scenario 1: due mittenti e un router con buffer illimitati Due host comunicano mediante una connessione che condivide un singolo router intermedio. Si ipotizza che un’applicazione nell’host A invii dati sulla connessione a una frequenza media λin byte/s. Ciascuna unità di dati viene mandata nella socket solo una volta. I dati vengono incapsulati e inviati senza porre rimedio a eventuali errori, controllo di flusso o di congestione. Analogamente l’host B trasmette dati a λin byte/s e condivide le stesse considerazioni dell’host A. I pacchetti degli host A e B passano attraverso un router e un collegamento uscente condiviso di capacità R. Il router possiede buffer che gli consentono di memorizzare i pacchetti entranti quando la loro velocità d’arrivo supera la capacità del collegamento uscente, in questo esempio si considerano con capienza illimitata. • Il grafico di sinistra mostra il throughput per connessione in funzione del tasso d’invio. Finché non supera il valore di R/2, il throughput del ricevente equivale alla velocità d’invio del mittente: tutto ciò che viene ricevuto dal destinatario con un ritardo finito. Una volta superato R/2, il throughput rimane costante. Questo limite superiore è conseguenza della condivisione della capacità di collegamento tra due connessioni. • Il grafico a destra mostra le conseguenze dell’avvicinarsi della velocità a R/2: aumenta sempre di più il ritardo. Quando supera R/2, il numero medio di pacchetti in coda nel router cresce senza limiti e il ritardo tende all’infinito. Di conseguenza avere un throughput che si avvicina a R potrebbe sembrare ottimale dal punto di vista del throughput, ma non dal punto di vista del ritardo. Quando il tasso d’arrivo dei pacchetti si avvicina alla capacità del collegamento, si rilevano lunghi ritardi d’accodamento. 3.4. PRINCIPI DEL CONTROLLO DI CONGESTIONE 61 Scenario 2: due mittenti e un router con buffer limitati A differenza dello scenario precedente si assume la dimensione dei buffer limitata. Quindi i pacchetti che giungono in un buffer già pieno vengono scartati. Si suppone poi che le due connessioni siano affidabili: se un pacchetto che contiene un segmento a livello di trasporto viene scartato, allora il mittente lo ritrasmetterà. Si denota ancora il tasso di trasmissione verso la socket con λin byte/s e con λ′in il tasso al quale il livello di trasporto invia segmenti (grandezza detta carico offerto alla rete). Si valutano le prestazione considerando i seguenti casi: • Caso poco probabile: l’host A è in grado di determinare se il buffer nel router abbia spazio a disposizione e trasmettere un pacchetto solo quando è libero il buffer. In tal caso non si verifica nessun smarrimento: λ′in = λin ; il throughput della connessione sarebbe λin : Dal punto di vista del throughput le prestazioni sarebbero ideali: tutto quando è trasmesso e ricevuto. La velocità media non supera R/2, visto che niente viene smarrito. • Caso più realistico: il mittente ritrasmette solo quando è certo che un pacchetto sia andato perduto, magari impostando un valore di timeout con un valore sufficientemente grande per essere certi che il pacchetto sia stato perso. 62 CAPITOLO 3. LIVELLO DI TRASPORTO Il carico offerto λ′in è uguale a R/2 e il tasso con cui i dati vengono consegnati è R/3. Pertanto su 0.5 R unità di dati trasmessi: 0.333 R byte/s sono originali e 0.166 R byte/s sono quelli ritrasmessi (entrambi in media). Il mittente deve effettuare ritrasmissioni per compensare i pacchetti scartati/perduti a causa di un overflow nel buffer. • Ultimo caso: il mittente va in timeout prematuramente e ritrasmette un pacchetto che ha subito ritardi, ma che non è stato perduto. Ovviamente il destinatario mantiene una singola copia delle tante ricevute dallo stesso pacchetto, tuttavia il router effettua un lavoro inutile. La seguente Figura confronta throughput e traffico immesso nella rete nell’ipotesi che ciascun pacchetto sia instradato mediamente due volte nel router. Le ritrasmissioni non necessarie da parte del mittente come risposta a lunghi ritardi costringono un router a utilizzare la larghezza di banda per instradare copie di pacchetti non necessarie. Il throughput assume asintoticamente il valore R/4 quando il carico offerto tende a R/2. Scenario 3: quattro mittenti, router con buffer finiti e percorsi con più collegamenti Si suppone che i pacchetti siano trasmessi da quattro host, ciascuno su percorsi composti da due collegamenti sovrapposti tra loro. Ogni host utilizza un meccanismo di timeout e ritrasmissioni per implementare il servizio affidabile di trasferimento dati e tutti gli host hanno lo stesso valore di λin ; si ipotizza una capacità dei collegamenti del router di R byte/s. 3.4. PRINCIPI DEL CONTROLLO DI CONGESTIONE 63 Esempio. Si considera la connessione dell’host A e C, che passa per i router R1 e R2. Questa connessione condivide il router R1 con la connessione D − B e il router R2 con la connessione B − D. • Per valori molto piccoli di λin , gli overflow dei buffer sono rari e il throughput è circa uguale al traffico. • Per valori leggermente più grandi di λin , il corrispondente throughput è anch’esso più grande, mentre gli overflow rimangono rari. Perciò per piccoli valori di λin , l’incremento di λin provoca un incremento di λout . • Per valori molto grandi di λin si prende in considerazione il traffico da A verso C: giunge al router R2 dopo essere stato inoltrato da R1: non può presentare un tasso d’arrivo maggiore di R. Se λ′in è estremamente grande per tutte le connessioni, il tasso d’arrivo del traffico B − D su R2 è maggiore di quella di A − C. Dato che su R2 il traffico di A − C è in competizione con quello di B − D per il limitato spazio nei buffer, allora la quantità di traffico di A − C che passa attraverso R2 diminuisce sempre di più al crescere del traffico trasportato da B − D. 64 CAPITOLO 3. LIVELLO DI TRASPORTO Ne segue che il throughput end-to-end di A − C si annulla in caso di traffico pesante. In questo scenario ogni volta che un pacchetto viene scartato sul router del secondo hop, il lavoro effettuato dal router del primo hop nell’instradamento del pacchetto verso il secondo router diventa sprecato. La capacità trasmissiva utilizzata dal primo router per instradare il pacchetto al secondo potrebbe essere ottimizzata trasmettendo un altro pacchetto. Ecco che quando un pacchetto viene scartato lungo il percorso, la capacità trasmissiva, utilizzata dai collegamenti per instradare il pacchetto fino al punto in cui è stato scartato, risulta sprecata. 3.4.2 Approcci al controllo di congestione Ad alto livello si possono distinguere tra i livelli di rete che offrono o meno assistenza esplicita al livello di trasporto al fine di controllare la congestione. • Controllo di congestione end-to-end : il livello di rete non fornisce supporto esplicito al livello di trasporto per il controllo di congestione, la cui presenza deve essere dedotta dai sistemi periferici sulla base dell’osservazione del comportamento della rete. La perdita di segmenti TCP viene considerata una chiara indicazione di congestione della rete e TCP diminuisce, di conseguenza anche l’ampiezza della propria finestra. • Controllo di congestione assistito dalla rete: i componenti a livello di rete (i router ) forniscono un feedback esplicito sullo stato di congestione della rete. Le versioni di default di TCP e IP in Internet adottano l’approccio end-to-end, ma possono anche implementare l’opzione di controllo di congestione assistito dalla rete. In quest’ultimo caso, l’informazione di congestione viene solitamente fornita dalla rete al mittente in due modi. • Può essere trasmesso un avviso diretto da un router al mittente tramite un chokepacket. • Un router imposta un campo in un pacchetto che fluisce dal mittente al destinatario per indicare la congestione. 3.5. CONTROLLO DI CONGESTIONE TCP 3.5 65 Controllo di congestione TCP TCP presenta il meccanismo di controllo della congestione. Inoltre deve utilizzare il controllo di congestione end-to-end anziché quello assistito dalla rete, dato che il livello IP non offre ai sistemi periferici un feedback esplicito sulla congestione della rete. TCP approccia imponendo a ciascun mittente un limite alla velocità d’invio sulla propria connessione in funzione della congestione di rete percepita. • Se il mittente TCP si accorge di condizioni di scarso traffico sul percorso che porta alla destinazione, allora incrementa il proprio tasso trasmissivo. • Se percepisce traffico sul percorso, allora riduce il tasso trasmissivo. ⇒ Come può il mittente TCP limitare la velocità d’invio del traffico sulla propria connessione? TCP fa tenere traccia agli estremi della connessione di una variabile aggiuntiva, ovvero la finestra di congestione indicata con cwnd, la quale impone un vincolo alla velocità di immissione di traffico da parte del mittente. LastByteSend − LastByteAcked ≤ min (cwnd,rwnd) Si assume che il buffer di ricezione sia abbastanza capiente da poter ignorare il vincolo della finestra di ricezione; la quantità di dati che non hanno ricevuto acknowledgment è limitata solo a cwnd. Inoltre il mittente ha sempre dati da inviare, per cui la finestra di congestione è sempre in uso. Quindi all’inizio di ogni RTT, il vincolo consente al mittente di trasmettere cwnd byte di dati sulla connessione; una volta terminato RTT il mittente riceve gli acknowledgment relativi ai dati. Ecco che la velocità d’invio del mittente è circa cwnd/RTT byte/s. Se si modifica cwnd, il mittente è in grado di regolare la velocità d’invio sulla propria connessione. ⇒ Come percepisce la congestione sul percorso che porta alla destinazione? Si definisce “evento perdita” per il mittente TCP l’occorrenza di un timeout o della ricezione di tre ACK duplicati da parte del destinatario. In presenza di un’eccessiva congestione, uno o più buffer dei router lungo il percorso vanno in overflow, causando l’eliminazione di un datagramma. Questo poi a sua volta costituisce un evento di perdita presso il mittente, che lo considera come un’indicazione di congestione sul percorso tra sé e il destinatario. Considerando il caso ottimistico di una rete priva di congestione, gli acknowledgment relativi ai vari segmenti verranno ricevuti dal mittente TCP. • Se gli acknowledgment arrivano con frequenza relativamente bassa, allora la finestra di congestione verrà ampliata lentamente. • Se gli acknowledgment giungono con una frequenza alta, allora la finestra di congestione verrà ampliata rapidamente. Dato che TCP utilizza gli acknowledgment per scatenare gli incrementi dell’ampiezza della finestra di congestione, si dice che TCP è auto-temporizzato. ⇒ Come fanno i mittenti TCP a determinare la loro velocità di trasmissione in modo da non congestionare la rete, ma allo stesso tempo utilizzare tutta la banda disponibile? Quale algoritmo dovrebbe essere utilizzato dal mittente per variare la velocità d’invio in funzione della congestione end-to-end ? 66 CAPITOLO 3. LIVELLO DI TRASPORTO L’algoritmo di controllo di congestione TCP presenta tre componenti principali: 1. Slow start (vedi Sezione 3.5.1); 2. Congestion avoidance (vedi Sezione 3.5.2); 3. Fast recovery (vedi Sezione 3.5.3). Slow start e congestion avoidance sono componenti obbligatorie di TCP e differiscono dal modo in cui aumentano cwnd in risposta degli acknowledgment ricevuti. 3.5.1 Slow start Quando inizia una connessione TCP, il valore cwnd viene inizializzato a 1 MSS, comportando una velocità di invio iniziale di circa MSS/RTT. Successivamente si incrementa di 1 MSS alla volta il valore cwnd ogni volta che un segmento trasmesso riceve un acknowledgment. TCP invia il primo segmento nella rete e attende un riscontro. Se il segmento riceve un acknowledgment prima che si verifichi un evento di perdita, allora il mittente incrementa la finestra di congestione di 1 MSS e invia due segmenti di massima dimensione. Questi segmenti ricevono a loro volta degli acknowledgment e il mittente incrementa la finestra di congestione di 1 MSS per ciascuno di essi portandola a 4 MSS e così via. Questo processo ha come effetto il raddoppio della velocità trasmissiva a ogni RTT, pertanto la velocità parte lentamente, ma cresce in modo esponenziale. ⇒ Quando si ferma la crescita esponenziale? 1. Il primo modo si verifica quando c’è un evento perdita indicato da un evento timeout, il mittente TCP pone il valore di cwnd a 1 e inizia nuovamente il processo di slow start. Inoltre viene posto il valore di una seconda variabile di stato, ssthresh a cwnd/2 (metà del valore che aveva la finestra quando la congestione è stata rilevata). 3.5. CONTROLLO DI CONGESTIONE TCP 67 2. Il secondo modo è legato al valore ssthresh, ovvero nel momento in cui cwnd è pari a ssthresh la fase di slow start termina. Per di più TCP entra in modalità di congestion avoidance. 3. Il terzo modo è quando vengono rilevati tre acknowledgment duplicati, per cui TCP effettua una ritrasmissione rapida ed entra nello stato di fast recovery. 3.5.2 Congestion avoidance TCP entra in questo stato quando il valore di cwnd è circa la metà di quello che aveva la volta precedente, in cui era stata rilevata la congestione. Al posto di raddoppiare il valore di cwnd ogni RTT, lo si incrementa di 1 MSS. Ciò si può ottenere in diversi modi: un approccio comune è l’incremento da parte del mittente TCP della propria cwnd di MSS × (MSS/cwnd) byte ogni volta che riceve un nuovo acknowledgment. Esempio. MSS vale 1460 byte e cwnd 14600 byte , allora in un RTT vengono spediti dieci segmenti. Ciascun ACK in arrivo incrementa l’ampiezza della finestra di congestione di 1/10 MSS e di conseguenza il valore della finestra aumenta di un MSS. ⇒ Quando si conclude l’incremento lineare durante la congestion avoidance? Quando avviene un timeout questo algoritmo si comporta come slow start: il valore di cwnd è posto uguale a 1 MSS e il valore di ssthresh viene impostato alla metà del valore di cwnd al momento del timeout. Tuttavia un evento di perdita può essere causato anche dalla ricezione di tre acknowledgment duplicati. In tal caso la rete continua a consegnare segmenti dal mittente al ricevente, ma TCP dimezza il valore di cwnd (aggiungendo 3 MSS per tenere conto dei duplicati ricevuti) e imposta il valore di sstresh a metà del valore di cwnd al momento del ricevimento dei tre ACK duplicati. Infine TCP entra nello stato di fast recovery. 68 CAPITOLO 3. LIVELLO DI TRASPORTO 3.5.3 Fast recovery Durante la fase di fast recovery il valore di cwnd è incrementato di 1 MSS per ogni ACK duplicato ricevuto relativamente al segmento perso (che ha causato questa fase). Infine quando arriva un ACK per il segmento perso, TCP entra nello stato di congestion avoidance dopo aver ridotto il valore di cwnd. Se si verifica un timeout avviene una transizione dallo stato di fast recovery a quello di slow start dopo aver effettuato le stesse azioni presenti sia in slow start che in congestion avoidance (cwnd = 1 MSS, sttresh = cwnd/2). Fast recovery è un componente raccomandato, ma non obbligatorio in TCP. Livello di rete (piano dei dati) A differenza del livello di trasporto, una parte del livello di rete è presente in ogni host e router della rete. 4.1 Panoramica del livello di rete Si considera la seguente rete con due host H1 e H2: • In H1 il livello di rete incapsula in un datagramma i segmenti dal livello di trasporto e lo spedisce al proprio router vicino R1. • Nell’host H2 il livello di rete riceve i datagrammi dal proprio router vicino R2. Estrae i segmenti e li consegna al livello di trasporto. 69 70 CAPITOLO 4. LIVELLO DI RETE (PIANO DEI DATI) Lo scopo del piano di dati di ciascun router intermedio è quello di inoltrare il datagramma dal link d’ingresso a link d’uscita, mentre il ruolo del piano di controllo è coordinare le azioni di inoltro locali al fine di trasferire i datagrammi in modalità end-to-end. 4.1.1 Inoltro e instradamento L’obiettivo del livello di rete è trasferire pacchetti da un host a un altro. Si identificano due funzioni: • Inoltro (forwarding): quando un router riceve un pacchetto lo deve trasferire sull’appropriato collegamento d’uscita. • Instradamento (routing): il livello di rete deve determinare il percorso che i pacchetti devono seguire tramite gli algoritmi di instradamento (vedi Sezione). Terminologia: • Con inoltro si intende l’azione locale con cui il router trasferisce i pacchetti da un’interfaccia d’ingresso a quella d’uscita. • Con instradamento si indica il processo globale di rete che determina i percorsi dei pacchetti nel loro viaggio dalla sorgente alla destinazione. Per inoltrare i pacchetti, i router estraggono da uno o più campi d’intestazione i loro valori che utilizzano come indice nella tabella di inoltro un elemento chiave di qualsiasi router . Il risultato indica a quale interfaccia d’uscita il pacchetto debba essere diretto. Approcci del piano di controllo • Approccio tradizionale: l’algoritmo di routing è implementato in ogni router, che svolge sia la funzione d’inoltro che d’instradamento internamente. • Approccio SDN: la funzionalità d’instradamento del piano di controllo è separato fisicamente dal router. Il dispositivo d’instradamento effettua solo l’inoltro, mentre il controller remoto calcola e distribuisce le tabelle d’inoltro. Tale approccio viene detto SDN (software-defined networking) perché il controller che calcola le tabelle d’inoltro e interagisce con i router è implementato in software. 4.2. PROTOCOLLO IP 4.1.2 71 Modelli di servizio Il modello di servizio della rete, che definisce le caratteristiche del trasporto end-to-end di pacchetti tra host d’origine e di destinazione, offre alcuni servici come: • Consegna garantita: assicura che il pacchetto giunga alla destinazione. • Consegna garantita con ritardo limitato: viene rispettato un limite di ritardo specificato. • Consegna ordinata: i pacchetti arrivano a destinazione nell’ordine in cui sono stati inviati. • Banda minima garantita: si emula il comportamento di un collegamento trasmissivo con bit rate specificato. Finché l’host di invio trasmette al di sotto del bit rate indicato, non si verificano perdite. • Servizi di sicurezza: tutti i datagrammi inviati vengono cifrati e verranno decifrati nell’host di destinazione. Il livello di rete Internet mette a disposizione solo un servizio chiamato best-effort. Con questo servizio non c’è garanzia che i pacchetti vengano ricevuti nell’ordine inviato, ma nemmeno sulla loro consegna, sul ritardo end-to-end e sulla banda minima. Semplicemente il livello prova a impegnarsi il massimo possibile. 4.2 4.2.1 Protocollo IP Formato dei datagrammi Ipv4 A livello di rete il pacchetto è noto come datagramma. Di seguito sono mostrati i principali campi dei datagrammi IPv4. • Numero versione: sono 4 bit che specificano la versione del protocollo IP e consentono al router la corretta interpretazione del datagramma. • Lunghezza dell’intestazione (header length): questi 4 bit indicano dove iniziano i dati del datagramma. 72 CAPITOLO 4. LIVELLO DI RETE (PIANO DEI DATI) • Tipo di servizio (TOS, type of service): questi 8 bit distinguono i diversi tipi di datagrammi. • Lunghezza del datagramma: rappresenta la lunghezza totale del datagramma IP: intestazione più dati (misurata in byte). La dimensione massima dei datagrammi IP è di 65535 byte, ma in genere si superano raramente i 1500 byte. • Identificatore, flag, offset di frammentazione: questi tre campi consentono di eseguire la frammentazione. • Tempo di vita (TTL, time-to-live): è necessario affinché i datagrammi in rete non durino per sempre. Questo campo viene decrementato di un’unità ogni volta che il datagramma è elaborato da un router e quando raggiunge 0 viene scartato. • Protocollo: questo campo è utilizzato quando il datagramma raggiunge la destinazione finale. Il valore nel campo indica lo specifico protocollo a livello di trasporto al quale vengono passati i dati del datagramma. • Checksum dell’intestazione: consente ai router di rilevare gli errori sui bit nei datagrammi ricevuti (vedi Sezione 3.2.2). • Indirizzi IP sorgente e destinazione: quando un host crea un datagramma, inserisce il proprio IP nel campo indirizzo IP dell’origine e quello della destinazione nel campo indirizzo IP di destinazione. • Opzioni: consentono di estendere l’indirizzo IP. Possono avere dimensione variabile e ciò scaturisce un problema: non è possibile determinare a priori dove comincerà il campo dati. • Dati (payload ): nella maggior parte dei casi, il campo contiene il segmento a livello di trasporto (TCP o UDP) da consegnare alla destinazione. Può trasportare anche altri tipo di dati, come i messaggi ICMP. Escludendo le opzioni (che vengono utilizzate raramente) i datagrammi IP hanno 20 byte di intestazione, mentre i datagrammi non frammentati possiedono 40 byte: 20 di intestazione IP e 20 di intestazione TCP. 4.2.2 Frammentazione dei datagrammi Ipv4 La quantità massima di dati che un frame a livello di collegamento può trasportare è detta unità massima di trasmissione (MTU, maximum trasmission unit). Tuttavia le tratte de percorso tra mittente e destinatario possono utilizzare differenti protocolli a livello di collegamento e presentare differenti MTU. La risposta al problema sta nella frammentazione: frammentare i dati del datagramma IP in due o più datagrammi IP più piccoli, detti frammenti. Ovviamente tali frammenti devono essere riassemblati prima di raggiungere il livello di trasporto della destinazione. Quando un host di destinazione riceve una serie di datagrammi della stessa origine deve: individuare i frammenti, determinare quando ha ricevuto l’ultimo e stabilire come debbano essere assemblati per formare il datagramma originario. Per effettuare questo lavoro sono presenti i campi di identificazione, flag e offset di frammentazione. Appena viene creato un datagramma, l’host lo contrassegna con un numero identificativo e con gli indirizzi di sorgente e di destinazione. Quando il router frammenta con gli indirizzi di sorgente e di destinazione e con l’identificatore numerico del datagramma originario. 4.2. PROTOCOLLO IP 73 Nel momento in cui la destinazione riceve una serie di datagrammi dallo stesso host mittente, può esaminare gli identificatori per individuare i frammenti di uno stesso datagramma. Siccome IP non offre un servizio affidabile, alcuni frammenti potrebbero non raggiungere la destinazione. Per questo motivo l’host deve essere sicuro di possedere tutti i frammenti e riassemblarli nel modo corretto: l’ultimo campo è posto a 1 per ogni frammento, eccetto l’ultimo che è a 0. Infine si utilizza il campo offset per specificare l’esatto ordine che i frammenti avevano all’origine e per determinare se un frammento è andato perso. 4.2.3 Indirizzamento Ipv4 In genere un host ha un solo collegamento con la rete, quando l’implementazione di IP vuole inviare un datagramma lo effettua su tale collegamento. Invece un router, che ha il compito di inviare e ricevere datagrammi, deve avere almeno due collegamenti. Il confine tra host/router e collegamento fisico viene detto interfaccia. L’indirizzo IP è tecnicamente associato a un’interfaccia, anziché all’host o al router che la contiene. Gli indirizzi IP sono lunghi 32 bit e quindi e quindi ci sono in totale 232 indirizzi IP. Ogni interfaccia di host o router di Internet ha un indirizzo IP globalmente univoco, ma non possono essere scelti in modo arbitrario perché una parte dell’indirizzo è determinata dalla sottorete in cui è collegata. Figura 4.1: Router con tre interfacce che connette sette host. 74 CAPITOLO 4. LIVELLO DI RETE (PIANO DEI DATI) Queste rete che interconnette tre interfacce di host e l’interfaccia di un router forma una sottorete. IP assegna a questa sottorete l’indirizzo 223.1.1.0/24, dove /24 è la maschera di sottorete (subnet mask ) e indica che i 24 bit più a sinistra dell’indirizzo definiscono l’indirizzo della sottorete. Di conseguenza la sottorete 223.1.1.0/24 consiste di tre interfacce di host (223.1.1.1, 223.1.1.2, 223.1.1.3) e una di router (223.1.1.4). Ogni altro host connesso a questa sottorete deve avere un indirizzo nella forma 223.1.1.xxx . Un altro esempio è dato da 3 router connessi da collegamenti punto a punto. Ciascuno ha tre interfacce: due per i collegamenti punto a punto e una per il collegamento broadcast che connette direttamente il router a una coppia di host. Oltre alle tre sottoreti (223.1.1.0/24, 223.1.2.0/24, 223.1.3.0/24) ne esistono altre: • 223.1.9.0/24 per le interfacce che connettono R1 e R2. • 223.1.8.0/24 per le interfacce che connettono R2 e R3. • 223.1.7.0/24 per le interfacce che connettono R3 e R1. In generale per determinare le sottoreti si sganciano le interfacce da host e router in maniera tale da creare isole di reti isolate delimitate dalle interfacce. Ognuna di queste reti isolate viene detta sottorete (subnet). L’assegnazione degli indirizzi Internet è detta classless interdomain routing . CIDR generalizza la nozione di indirizzamento di sottorete. L’indirizzo IP viene diviso in due parti e mantiene la forma decimale puntata a.b.c.d/x dove x indica il numero di bit nella prima parte dell’indirizzo. Gli x bit più a sinistra di un indirizzo costituiscono la porzione di rete dell’indirizzo IP e sono spesso detti prefisso (di rete) dell’indirizzo. I rimanenti 32-x bit dell’indirizzo possono essere usati per distinguere i dispositivi interni dell’organizzazione, che hanno tutti lo stesso prefisso di rete. Dunque sono i router della rete interna che utilizzano i restanti bit dell’indirizzo per indirizzarli al dispositivo destinatario. 4.2. PROTOCOLLO IP 75 Prima dell’adozione di CIDR, le parti di rete di un indirizzo dovevano essere lunghe 8, 16 o 24 bit. Secondo lo schema di indirizzamento classful addressing (vedi Sezione 1.4). 4.2.4 Come ottenere l’indirizzo di un host: DHCP Gli indirizzi host possono essere configurati manualmente, ma di solito questo compito è svolto utilizzando il DHCP (Dynamic Host Configuration Protocol ). Questo strumento consente a un host di ottenere un indirizzo IP in modo automatico e apprendere informazioni aggiuntive, come: la maschera di sottorete, l’indirizzo del router per uscire dalla sottorete e l’indirizzo del suo DNS server locale. L’amministratore di rete può configurare DHCP in modo che un host riceva un IP persistente oppure lasciare l’assegnazione di un indirizzo IP temporaneo, il quale sarà diverso per tutte le volte che l’host si connetterà e disconnetterà dalla rete. DHCP viene spesso chiamato protocollo plug-and-play o zero-conf per la sua capacità di automatizzare la connessione degli host alla rete. Inoltre lo si utilizza anche nelle reti residenziali di accesso a Internet e nelle LAN wireless, dove gli host entrano ed escono frequentemente dalla rete. DHCP è un protocollo client-server. Un client è un host appena connesso che desidera ottenere informazioni sulla configurazione di rete (non solo su uno specifico IP). • Caso più semplice: ogni sottorete dispone di un server DHCP. • Altrimenti: è necessario un agente di relay DHCP (implementato in un router ) che conosca l’indirizzo di un server DHCP per quella rete. Supponendo di possedere un DHCP server, per i nuovi host, il protocollo DHCP si articola in quattro punti: • Individuazione del server DHCP: l’host identifica il server DHCP con il quale interagire. Questa operazione è svolta utilizzando un messaggio DHCP discover , in cui un client invia un pacchetto UDP attraverso la porta 67. Il pacchetto UDP viene incapsulato in un datagramma IP e spedito all’indirizzo broadcast 255.255.255.255: il client DHCP non conosce ancora l’indirizzo del server DHCP; mentre l’indirizzo IP sorgente viene posto a 0.0.0.0, cioè per indicare “questo host”. Il client DHCP inoltra il datagramma IP al suo livello di collegamento, il quale invia il frame in broadcast a tutti i nodi collegati in sottorete. • Offerta del server DHCP: quando il server DHCP riceve il messaggio di identificazione, risponde a tutti i client con un messaggio DHCP offer , che viene inviato in broadcast a tutti i nodi della sottorete. Dato che in una sottorete ci possono essere diversi server DHCP, il client dovrebbe scegliere uno tra questi. Ciascun messaggio di offerta contiene l’ID di transazione del messaggio di identificazione ricevuto, l’indirizzo IP proposto al client , la maschera di sottorete e la durata della connessione (lease time) dell’indirizzo IP. • Richiesta DHCP: il client appena collegato sceglie tra le offerte dei server e risponde con un messaggio di DHCP request, che riporta i parametri di configurazione. • Conferma DHCP: il server risponde con un messaggio DHCP ACK, che conferma i parametri richiesti. Dal momento in cui il client riceve il DHCP ACK, l’interazione è completata e il client può utilizzare l’indirizzo IP fornito da DHCP per la durata della connessione. 76 CAPITOLO 4. LIVELLO DI RETE (PIANO DEI DATI) Per di più viene fornito anche un meccanismo che consente ai client di rinnovare la connessione di un indirizzo IP. Tuttavia esiste anche un difetto di questo protocollo: quando un nodo si connette a una nuova sottorete, DCHP gli rilascia un nuovo indirizzo IP. Perciò non è possibile mantenere una connessione TCP a un’applicazione remota, spostandosi il nodo mobile da una sottorete all’altra. 4.2.5 NAT Esistono moltissime reti private che utilizzano un identico spazio di indirizzamento per scambiare pacchetti fra i dispositivi, e ovviamente quelli inviati sull’Internet globale non possono utilizzare questi indirizzi come sorgente o destinazione. ⇒ Se gli indirizzi privati hanno significato solo all’interno di una data rete, come viene gestito l’indirizzamento dei pacchetti relativi all’Internet globale in cui gli indirizzi sono necessariamente univoci? I router abilitati al NAT (Network Address Translation) non appaiono come router al mondo esterno, ma si comportano come un solo dispositivo con un unico indirizzo IP. 4.2. PROTOCOLLO IP 77 Da questa Figura tutto il traffico che lascia il router domestico verso Internet ha indirizzo IP d’origine 138.76.29.7 e tutto il traffico in entrata deve avere lo stesso indirizzo come destinazione. Quindi il NAT nasconde i dettagli della rete domestica all’esterno. ⇒ Se tutti i datagrammi in arrivo al router NAT dalla rete geografica hanno lo stesso indirizzo IP di destinazione, allora come apprende il router a quale host interno dovrebbe essere inoltrato un determinato datagramma? La soluzione consiste nell’utilizzare una tabella di traduzione NAT (NAT traslation table) nel router NAT e nell’includere nelle righe di tale tabella i numeri di porta oltre che gli indirizzi IP. Esempio. Un utente in una rete domestica dietro l’host 10.0.0.1 richiede una pagina web da un server con indirizzo IP 128.119.40.186. Allora l’host assegna il numero di porta d’origine (arbitrario) 3345 e invia il datagramma nella rete locale. Il router NAT riceve il datagramma e sostituisce l’indirizzo IP sorgente con il proprio (138.76.29.7) e genera una nuova porta (5001) che rimpiazza con la precedente. La porta viene scelta tra quelle ancora disponibili nella tabella di traduzione NAT ed essendo questo campo lungo 16 bit il protocollo NAT può supportare più di 60000 connessioni simultanee con un solo indirizzo IP sul lato WAN relativo al router. Il web server riceve la richiesta HTTP e risponde con un datagramma avente l’indirizzo IP del router NAT come destinazione e porta 5001. Il router NAT a sua volta consulta la propria tabella di traduzione usando l’indirizzo IP e il numero di porta di destinazione per ottenere l’IP (10.0.0.1) e porta (3345) appropriati. Il router riscrive l’indirizzo e porta di destinazione e inoltra il datagramma nella rete domestica. Nota bene: i numeri di porta sono concepiti per indirizzare i processi, non per individuare gli host. Infatti ciò può causare problemi ai server in esecuzione su reti domestiche dato che i processi server attendono richieste in ingresso su numeri di porta prestabiliti. NAT viola il principio end-to-end : gli host dovrebbero comunicare tra loro direttamente, senza intromissione di nodi né modifica di indirizzi IP e di numeri di porta. Questi componenti, come il NAT, sono detti middlebox e operano a livello di rete, ma possiedono funzionalità differenti dai router : NAT, bilanciamento dei flussi e firewall. 78 CAPITOLO 4. LIVELLO DI RETE (PIANO DEI DATI) 4.2.6 Formato dei datagrammi Ipv6 Nei datagrammi IPv6 vengono apportate varie modifiche a livello di formato rispetto IPv4: • Indirizzamento esteso (extension header ): si rende “flessibile” il protocollo grazie al campo intestazione successiva (next header ). Questo campo possiede un codice avente un doppio significato: – Se non ci sono estensioni aggiuntive, ovvero non si presentano pezzi addizionali all’intestazione di base, allora quel campo identifica il protocollo trasportato dal payload. – Se c’è un’intestazione aggiuntiva, definita extension header , allora quel codice rappresenta il tipo di estensione estesa. Sono presenti due campi indispensabili, mentre il resto è libero: a seconda del next header si hanno formati diversi. 8 bit 8 bit Next Header Header length – Next header : è il codice, se esiste, del next header aggiuntivo, altrimenti indica il codice del protocollo trasportato. – Header length: permette di conoscere dove finisce l’estensione dell’intestazione. • Intestazione ottimizzata di 40 byte: IPv6 presenta un’intestazione a 40 byte e lunghezza fissa, questo consente una maggiore velocità d’elaborazione dei datagrammi IP. Mentre una nuova codifica delle opzioni ne consente l’elaborazione in maniera più flessibile. • Etichettatura dei flussi: IPv6 presenta una definizione elusiva di flusso (flow ). Questo consente di richiedere una gestione speciale, come una qualità di servizio diversa da quella fornita di default o un servizio in tempo reale. Nel dettaglio la struttura diventa più semplice e più efficiente: • Versione: è un campo formato da 4 bit che identifica il numero di versione IP. 4.2. PROTOCOLLO IP 79 • Classe di traffico: è un campo formato da 8 bit , simile al campo TOS di IPv4. Può essere utilizzato per attribuire priorità a determinati datagrammi all’interno di un flusso o specifiche applicazioni rispetto a quelli di altri servizi. • Etichetta di flusso: è un campo lungo 20 bit utilizzato per identificare un flusso di datagrammi. • Lunghezza del payload : è un valore a 16 bit trattato come un intero senza segno, il quale indica il numero di byte nel datagramma IPv6 che seguono l’intestazione. • Intestazione successiva: è un campo con lo scopo di identificare il protocollo a cui vengono consegnati i contenuti (il campo dati) del datagramma, per esempio TCP o UDP. • Limite di hop: questo campo viene decrementato di 1 da ciascun router che inoltra il datagramma. Quando il suo valore raggiunge 0, il datagramma viene eliminato. • Indirizzi sorgente e destinazione: sono disponibili diversi formati degli indirizzi IPv6 a 128 bit. • Dati: payload passato al protocollo specificato nel campo d’intestazione successivo quando il datagramma IPv6 raggiunge la sua destinazione. Inoltre vengono eliminati diversi campi come: • Frammentazione/riassemblaggio: IPv6 non consente frammentazione né riassemblaggio sui router intermedi. Queste operazioni possono essere effettuate solo da sorgente o destinazione. Se un router riceve un datagramma IPv6 troppo grande per essere inoltrato sul collegamento d’uscita, allora lo elimina e invia al mittente un messaggio d’errore ICMP. Il mittente può inviare nuovamente i dati con una dimensione di datagramma IP inferiore; evitare la frammentazione e riassemblaggio rende più rapido l’instradamento IP all’interno della rete. • Checksum dell’intestazione: dal momento che i protocolli Internet a livello di trasporto (come TCP e UDP) e di collegamento (come Ethernet) calcola un loro checksum, allora non risulta necessario dover ripetere tale funzionalità (che rallenta l’elaborazione). • Opzioni: questo campo non fa più parte dell’intestazione IP standard, anche se non è totalmente scomparsa: è una delle possibili intestazioni successive a cui punta l’intestazione IPv6. Ovvero come le intestazioni del protocollo TCP o UDP possono rappresentare l’intestazione successiva all’interno di un pacchetto IP, lo stesso accade anche per il campo Opzioni. 80 CAPITOLO 4. LIVELLO DI RETE (PIANO DEI DATI) Livello di rete (piano di controllo) Si possono avere due possibili approcci: • Controllo locale: l’algoritmo di instradamento viene eseguito su ogni singolo router, all’interno del quale vengono effettuate sia le funzioni di inoltro sia quelle di instradamento. Ogni router ha una componente di instradamento che comunica con le componenti d’instradamento degli altri router per calcolare la propria tabella di inoltro. • Controllo logicamente centralizzato: il controller logicamente centralizzato calcola e distribuisce le tabelle di inoltro che devono essere utilizzate dal router. 81 82 CAPITOLO 5. LIVELLO DI RETE (PIANO DI CONTROLLO) Il controller interagisce con l’agente di controllo (CA) in ogni router tramite un protocollo che configura e gestisce la tabella dei flussi del router. In genere il CA presenta le seguenti funzionalità: • Comunica con il controller. • Esegue quello che il controller gli ordina. Gli agenti di controllo non interagiscono direttamente tra loro e non partecipano attivamente all’elaborazione della tabella di inoltro. Per controllo logicamente centralizzato si intende un servizio di controllo dell’instradamento a cui si accede come se fosse un singolo punto centrale di servizio. Tuttavia il servizio può essere implementato su più server per ragioni di tolleranza alle perdite e alla scalabilità delle prestazioni. 5.1 Algoritmi di instradamento Gli algoritmi di instradamento (routing algorithm) hanno lo scopo di determinare i percorsi, tra sorgenti e destinatari, attraverso la rete di router. Inoltre le policy possono causare diverse problematiche: un router X, che appartiene all’organizzazione Y, non può inoltrare pacchetti che abbiano come sorgente la rete dell’organizzazione Z. Per i problemi di instradamento si fa uso di un grafo: i nodi rappresentano i router, mentre gli archi corrispondono a collegamenti fisici tra i router. Un grafo G = (N, E) è un insieme di N nodi e un insieme di E archi (detti edge), dove ogni arco collega una coppia di nodi di N . Figura 5.1: Modello astratto di grafo di una rete di calcolatori. A ciascun arco è associato un valore che indica il proprio costo. Questo può riflettere: • La lunghezza fisica del collegamento; • La velocità del collegamento; • Il suo prezzo. 5.1. ALGORITMI DI INSTRADAMENTO 83 Per ogni arco (x, y) tra i nodi x e y si denota con c(x, y) il suo costo. Se la coppia (x, y) non appartiene a E, allora si pone c(x, y) = +∞. Ovviamente gli archi vengono considerati bidirezionali, cioè (x, y) = (y, x) e c(x, y) = c(y, x), e un nodo y viene detto adiacente e vicino a un nodo x, se (x, y) è un arco di E. Gli algoritmi di instradamento hanno l’obiettivo di individuare i percorsi meno costosi, per cui il costo di un percorso (x1 , x2 , . . . , xp ) è la somma di tutti i costi degli archi lungo il percorso: c(x1 , x2 ) + c(x2 , x3 ) + c(xp−1 , xp ). Un percorso in un grado G = (N, E) è una sequenza di nodi (x1 , x2 , . . . , xp ) tali che ogni coppia (x1 , x2 ), (x2 , x3 ), . . . , (xp−1 , xp ), sia un arco appartenente a E. Dati due nodi x e y qualsiasi, possono esistere più percorsi validi dei quali almeno uno di questi rappresenta un percorso a costo minimo (least-cost path). Nella Figura 5.1 il percorso a costo minimo tra il nodo u d’origine e il nodo w di destinazione è (u, x, y, w), con costo 3. Per di più se tutti gli archi del grafo presentassero lo stesso costo, allora il costo minimo rappresenterebbe anche il percorso più breve (shortest path), cioè il percorso con il minor numero di collegamenti tra sorgente e destinazione. In una rete possono però essere presenti molti nodi e non si può a livello di tempistiche provare tutte le possibili combinazioni di percorso. Ecco che nel dettaglio gli algoritmi possono essere centralizzati o decentralizzati: • Algoritmo di instradamento centralizzato: calcola il percorso a costo minimo tra una sorgente e destinazione avendo già una conoscenza globale e completa della rete. Questi algoritmi sono spesso detti algoritmi link-state (LS). • Algoritmo di instradamento decentralizzato: il percorso a costo minimo viene calcolato in modo distribuito e iterativo. Nessun nodo possiede informazioni complete sul costo di tutti i collegamenti di rete. I nodi conoscono solo i costi dei collegamenti a loro incidenti. Successivamente attraverso un processo iterativo e lo scambio di informazioni con i nodi adiacenti, un nodo calcola gradualmente il percorso. Questi algoritmi sono detti distance-vector (DV): ogni nodo elabora un vettore di stima dei costi verso tutti gli altri nodi della rete. Un secondo criterio di classificazione è la staticità o dinamicità: • Algoritmo di instradamento statico: i percorsi cambiano raramente. • Algoritmo di instradamento dinamico: determinano gli instradamenti al variare del volume di traffico o della topologia della rete. Possono inoltre essere eseguiti periodicamente come conseguenza diretta di un cambiamento nella topologia o nel costo di un collegamento. Gli algoritmi dinamici rispondono meglio ai cambiamenti della rete, ma sono anche maggiormente soggetti a problemi di instradamento in loop e oscillazione dei percorsi. Infine un terzo modo per classificare gli algoritmi è quello di essere più o meno sensibili al carico della rete. • Algoritmo sensibile al carico: i costi dei collegamenti variano dinamicamente per riflettere il livello di congestione. Se a un collegamento viene associato un alto costo, allora l’algoritmo tende a evitare di usarlo. 84 CAPITOLO 5. LIVELLO DI RETE (PIANO DI CONTROLLO) • Algoritmo insensibile al carico: sono gli attuali algoritmi di instradamento di Internet (come RIP, OSPF e BGP), in cui il costo di un collegamento non riflette esplicitamente il suo attuale livello di congestione. 5.1.1 Instradamento link-state Nell’instradamento link-state la topologia di rete e tutti i costi di collegamenti sono noti, ossia disponibili in input all’algoritmo. Ogni nodo invia agli altri nodi pacchetti contenenti l’identità e i costi dei collegamenti a loro connessi. Questo di ottiene mediante un algoritmo di link-state broadcast. Così facendo tutti i nodi dispongono di una vista identica e completa della rete e ogni nodo che esegue l’algoritmo LS ottiene gli stessi risultati. L’algoritmo di calcolo dei percorsi è noto come algoritmo di Dijkstra. Quest’ultimo calcola il percorso a costo minimo da un nodo d’origine a tutti gli altri nodi della rete. È iterativo e possiede le seguenti proprietà: • Dopo la k-esima iterazione, i percorsi a costo minimo sono noti a k nodi di destinazione. • Questi k percorsi hanno i k costi più bassi. Si adotta per praticità questa notazione: • D(v): costo minimo del percorso dal nodo d’origine alla destinazione v. • p(v): immediato predecessore di v lungo il percorso a costo minimo dall’origine a v. • N ′ : sottoinsieme di nodi contenente tutti i nodi v per cui il percorso a costo minimo dall’origine a v è definitivamente noto. Applicando l’algoritmo LS alla Figura 5.1 si ottiene: 5.1.2 Instradamento distance-vector L’algoritmo distance-vector è iterativo, asincrono e distribuito. • Distribuito: ciascun nodo riceve parte dell’informazione da uno o più dei suoi vicini direttamente connessi, a cui restituisce i risultati dopo aver effettuato il calcolo. • Iterativo: questo processo si ripete fino a quando non avviene ulteriore scambio informativo tra i vicini. In pratica l’algoritmo è auto-terminante, ossia si blocca autonomamente. • Asincrono: non richiede che tutti i nodi operino al passo con gli altri. 85 5.1. ALGORITMI DI INSTRADAMENTO Esiste un’importante relazione tra costi e percorsi a costo minimo. Definizione (Formula di Bellman-Ford). Sia dx (y) il costo del percorso a costo minimo dal nodo x al nodo y. Allora i costi minimi sono correlati dalla nota formula di Bellman-Ford: dx (y) = minv {c(x, v) + dv (y)} (5.1) dove minv riguarda tutti i vicini di x. Questa relazione afferma che: dopo aver viaggiato da x a v e considerando il percorso a costo minimo da v a y, il costo del percorso risulta c(x, v) + dv (y). Dato che si viaggia verso qualche vicino v, il costo minimo da x a y è il minimo di c(x, v) + dv (y) calcolato su tutti i nodi adiacenti v. La formula di Bellman-Ford ha anche una valenza pratica in quanto fornisce le righe della tabella di inoltre nel nodo x. Prendendo v ∗ come qualsiasi nodo vicino che minimizza l’equazione 5.1, se il nodo x vuole inviare un pacchetto al nodo y lungo il percorso a costo minimo, dovrebbe per prima cosa inoltrarlo al nodo v ∗ . Pertanto la tabella di inoltro al nodo x specificherebbe il nodo v ∗ come router successivo per la destinazione finale y. Un altro aspetto importante della formula di Bellman-Ford è il suggerimento della forma di comunicazione tra vicini, che ha luogo nell’algoritmo usato da DV (detto algoritmo di BellmanFord). L’idea è che ogni nodo x inizi con Dx (y) (una stima del costo del percorso a costo minimo da sé stesso al nodo y) per tutti i nodi in N . Sia Dx = [Dx (y) : y in N ] il vettore delle distanze del nodo x, che è il vettore delle stime dei costi da x a tutti gli altri nodi y in N . Con questo algoritmo ciascun nodo x mantiene i seguenti dati di instradamento: • Per ogni vicino v, il costo c(x, v) da x al vicino v. • Il vettore delle distanze del nodo x, che è Dx = [Dx (y) : y in N ], contiene la stima presso x del costo verso tutte le destinazioni y in N . • I vettori delle distanze di tutti i suoi vicini, ossia Dv = [Dv (y) : y in N ], per ciascun vicino y di x. Quando un nodo x riceve un nuovo vettore da qualcuno dei suoi vicini v, lo salva e quindi usa la formula di Bellman-Ford per aggiornare il proprio valore come segue: Dx (y) = minv {c(x, v) + Dv (y)} per ciascun nodo y in N Se il vettore delle distanze del nodo x è cambiato per via di tale passo di aggiornamento, il nodo x manderà il proprio vettore aggiornato a tutti i suoi vicini, i quali a loro volta aggiorneranno il proprio vettore. L’algoritmo Bellman-Ford è decentralizzato e non usa informazioni globali, ma le ottiene solo dai vicini direttamente connessi al nodo. Ogni nodo attende aggiornamenti dai suoi vicini e quando ne riceve uno calcola il proprio nuovo vettore, distribuendolo poi agli altri nodi. 86 CAPITOLO 5. LIVELLO DI RETE (PIANO DI CONTROLLO) Viene mostrato il funzionamento in modo sincrono1 , in quanto tutti i nodi ricevono simultaneamente i vettori delle distanze dai propri vicini, calcola i rispettivi nuovi vettori e informano i vicini degli eventuali cambiamenti. • Colonna a sinistra: si creano le tre tabelle di instradamento iniziali (routing table) per ciascuno dei tre nodi. • Dopo l’inizializzazione ciascun nodo invia il proprio vettore ai suoi vicini che ricalcolano il vettore delle distanze. 1 L’algoritmo opera correttamente anche in modo asincrono. 5.2. INSTRADAMENTO TRA ISP: BGP 87 Per esempio il nodo x calcola: Dx (x) = 0 Dx (y) = min{c(x, y) + Dy (y), c(x, z) + Dz (y)} = min{2 + 0, 7 + 1} = 2 Dx (z) = min{c(x, y) + Dy (z), c(x, z) + Dz (z)} = min{2 + 1, 7 + 0} = 3 • Colonna centrale: mostra per ogni nodo il nuovo vettore delle distanze del nodo e i vettori delle distanze appena ricevuti dai suoi vicini. • I nodi rinviano la versione aggiornata del proprio vettore ai vicini, che effettuano nuovamente i calcoli. • Colonna a destra: sono presenti le tabelle finali minimizzate, quindi non serve andare avanti a effettuare altri passaggi e l’algoritmo si blocca. In un esempio a più nodi, inizialmente se due nodi non sono collegati direttamente, la loro distanza è considerata ∞. Solo successivamente con l’avvento degli scambi di vettore si ricaverà la reale distanza. 5.2 Instradamento tra ISP: BGP Per determinare i percorsi per le coppie sorgente-destinazione che interessano più sistemi autonomi (AS autonomous system) è necessario un protocollo di instradamento inter-AS che coordini più AS. Il border gateway protocol , detto BGP, rappresenta l’attuale standard dei protocolli di instradamento tra i sistemi autonomi in Internet. BGP è considerato la “colla” che tiene insieme le migliaia di ISP (Internet Service Provider ) che formano Internet, inoltre è un protocollo di tipo distance-vector decentralizzato e asincrono. 5.2.1 Ruolo di BGP Si consideri un AS e un suo qualsiasi router. Le occorrenze della tabella di inoltro corrispondenti a destinazioni interne all’AS vengono determinate dal protocollo di instradamento intra-AS. Si ricorda che ogni router ha una tabella di inoltro, fondamentale per il processo di inoltro dei pacchetti. ⇒ Chi determina le destinazioni esterne dell’AS? Vengono determinate da BGP. Infatti in questo protocollo i pacchetti non vengono instradati verso uno specifico indirizzo, ma piuttosto verso prefissi CIDR che rappresentano una sottorete o una collezione di sottoreti. Nel mondo di BGP, una destinazione potrebbe avere la forma 138.16.68/22, che include 1024 indirizzi IP. Dunque le occorrenze delle tabelle di inoltro hanno forma (x, I) dove x è un prefisso di rete e I è un numero di interfaccia del router. BGP mette a disposizione di ciascun router un modo per: 1. Ottenere informazioni sulla raggiungibilità dei prefissi di sottorete da parte dei sistemi confinanti. In particolare BGP consente a ogni sottorete di comunicare la propria esistenza al resto di Internet. Se non fosse per BGP ogni sottorete sarebbe isolata e irraggiungibile dal resto di Internet. 88 CAPITOLO 5. LIVELLO DI RETE (PIANO DI CONTROLLO) 2. Determinare i percorsi ottimi verso le sottoreti. Un router può conoscere più cammini verso un prefisso, ma per determinare il migliore deve eseguire BGP localmente, sulla base delle informazioni di raggiungibilità e delle politiche del sistema. 5.2.2 Distribuzione delle informazioni dei cammini in BGP Si consideri la seguente rete con tre AS: AS1, AS2 e AS3 (quest’ultimo con una sottorete di prefisso X). Ogni router in ogni AS funge sia da router gateway 2 sia da router interno, ovvero connesso solo a host e router interni all’AS. Esempio. In AS1 il router 1c è un router gateway, mentre 1a, 1b e 1d sono solo router interni. BGP distribuisce le informazioni di raggiungibilità del prefisso X a tutti i router : • Innanzitutto AS3 invia un messaggio BGP ad AS2, con l’annuncio dell’esistenza di X in AS3. • Successivamente AS2 invia un messaggio BGP ad AS1 con l’annuncio che X esiste ed è raggiungibile passando prima da AS2 per poi arrivare ad AS3. In questo modo ogni AS viene a conoscenza di X e del percorso per raggiungerlo. Per di più si ricorda che sono i router a inviare gli annunci e non gli AS. Con BGP le coppie di router si scambiano informazioni di instradamento TCP semi-permanenti usando la porta 179. Ogni connessione TCP, con tutti i messaggi BGP che vengono inviati, è detta sessione BGP. Nel caso in cui questa coinvolga due sistemi autonomi viene detta sessione BGP esterna 2 Corrisponde a un router di bordo direttamente connesso a uno o più router in altri AS 5.2. INSTRADAMENTO TRA ISP: BGP 89 (sessione eBGP), mentre quella tra router dello stesso sistema autonomo è chiamata sessione BGP interna (sessione iBGP). Secondo l’ultimo schema con AS1, AS2 e AS3, con connessioni iBGP ed eBGP, il router gateway 3a invia un messaggio eBGP al router gateway 2c che a sua volta lo invia su una sessione iBGP a tutti i router di AS2 compreso il gateway 2a. Quest’ultimo invia un messaggio eBGP al router gateway 1c, il quale utilizza poi iBGP per inviare un messaggio a tutti i router di AS1. Una volta completato tale processo, ogni router di AS1 e AS2 è a conoscenza dell’esistenza di X e del percorso per raggiungerlo. 5.2.3 Selezione delle rotte migliori Quando un router annuncia un prefisso per una sessione BGP, include anche un certo numero di attributi BGP. In gergo un prefisso assieme ai suoi attributi è detto rotta (route). • Con l’attributo AS-PATH ci si riferisce all’elenco di sistemi autonomi attraverso il quale è passato l’annuncio del prefisso. Quando un prefisso attraversa un sistema autonomo, questo aggiunge il proprio ANS all’attributo AS-PATH. Nello specifico i router utilizzano questo attributo per rilevare ed evitare gli annunci reiterati: se un router vede che il proprio AS è contenuto nella lista di percorsi, allora rifiuta l’annuncio. • Nell’attributo NEXT-HOP è riportata l’interfaccia del router che inizia l’AS-PATH. Ogni rotta è quindi scritta come una lista di tre elementi: NEXT-HOP, AS-PATH e il prefisso X. Inoltre si avvisa che NEXT-HOP è l’indirizzo IP di un router che non appartiene a un certo AS, ma a una sottorete collegata direttamente a quell’AS. Instradamento hot potato Si considera la seguente rete: Il router 1b impara due possibili percorsi BGP verso il prefisso X. Nell’instradamento a patata bollente (hot potato routing), il percorso scelto è quello con il minor costo per il router NEXT-HOP che lo inizia. In questo caso 1b consulta le sue informazioni di routing intra-AS per trovare il percorso intra-AS a costo minimo verso il router NEXT-HOP 2a e il percorso a costo minimo verso il router NEXT-HOP 3d, e tra questi seleziona quello a costo minimo. L’idea alla base è che il router 1b butti fuori i pacchetti dal suo AS il prima possibile senza preoccuparsi del costo delle restanti tratte del percorso al di fuori del suo AS. È poi possibile che due router nello stesso AS selezionino diversi percorsi per lo stesso prefisso. 90 5.3 CAPITOLO 5. LIVELLO DI RETE (PIANO DI CONTROLLO) Protocollo ICMP Host e router utilizzano il protocollo ICMP (Internet Control Message Protocol ) per scambiarsi informazioni a livello di rete: utilizzato specialmente per la notifica degli errori. Per esempio durante l’esecuzione di una sessione HTTP si potrebbe visualizzare il messaggio “Rete di destinazione irraggiungibile”, che è originato da ICMP. ICMP è considerato parte di IP, ma dal punto di vista dell’architettura si trova sopra IP, dato che i suoi messaggi vengono trasportati nei datagrammi IP: sono trasportati come payload di IP. Se un host riceve un datagramma IP, che specifica ICMP come protocollo di livello superiore, allora effettua il demultiplexing dei contenuti del datagramma a ICMP. I messaggi ICMP possiedono: un campo tipo, un campo codice, contengono l’intestazione e i primi 8 byte del datagramma IP che ha provocato la generazione del messaggio. In tal modo il mittente può determinare il datagramma che ha causato l’errore. Livello di collegamento I datagrammi attraversano una serie di collegamenti (cablati e wireless) che iniziano dall’host sorgente, passano attraverso una serie di router e switch (commutatori) e raggiungono la destinazione. 6.1 Introduzione al livello di collegamento Terminologia: • Si indica con il termine nodo un qualunque dispositivo che opera a livello di collegamento (livello 2). • Si indicano con collegamenti (link ) i canali di comunicazione, che collegano i nodi adiacenti lungo il cammino. I datagrammi che devono essere trasferiti da un host sorgente a uno di destinazione, devono essere trasportati lungo ciascun collegamento nel percorso da un estremo all’altro (vedi Figura 6.1). Si suppone di voler inviare un datagramma da un host wireless a uno dei server. Il datagramma deve attraversare sei collegamenti: 1. Un collegamento WiFi tra l’host sorgente e l’access point WiFi; 2. Un collegamento Ethernet dall’access point allo switch a livello di collegamento; 3. Un collegamento tra lo switch a livello di collegamento e il router ; 4. Un collegamento tra i due router ; 5. Un collegamento Ethernet tra il router e lo switch a livello di collegamento; 6. Un collegamento Ethernet tra lo switch e il server. Su ogni collegamento, un nodo trasmittente incapsula il datagramma in cui un frame del livello di collegamento (link-layer frame e lo trasmette lungo il collegamento stesso. 91 92 CAPITOLO 6. LIVELLO DI COLLEGAMENTO Figura 6.1: Sei passaggi a livello di collegamento tra host wireless e server. 6.1.1 Servizi offerti dal livello di collegamento Sebbene il servizio base del livello di collegamento sia il trasporto di datagrammi da un nodo a quello adiacente lungo un singolo canale di comunicazione, i dettagli dei servizi forniti possono variare da un protocollo all’altro. • Framing : quasi tutti i protocolli incapsulano i datagrammi del livello di rete all’interno di un frame a livello di collegamento. I frame sono costituiti da: – Un campo dati, nel quale è inserito il datagramma. – Da vari campi di intestazione. Infine la struttura del frame è specificata dal protocollo. • Accesso al collegamento: il protocollo MAC (Medium Access Control ) controlla l’accesso al mezzo trasmissivo specificando le regole con cui immettere i frame nel collegamento. Nei collegamenti punto a punto, con protocollo MAC semplice o assente, il mittente può inviare il frame quando il canale risulta libero. Nel caso in cui i vari nodi condividano un singolo canale broadcast, il protocollo MAC aiuta a coordinare la trasmissione dei frame da parte dei nodi. 6.1. INTRODUZIONE AL LIVELLO DI COLLEGAMENTO 93 • Consegna affidabile: i protocolli a livello di collegamento che forniscono un servizio di consegna affidabile garantiscono il trasporto senza errori di ciascun datagramma. Analogamente a TCP il servizio di consegna affidabile è spesso usato per i collegamenti soggetti a elevati tassi d’errore, allo scopo di correggere localmente l’errore piuttosto che costringere i protocolli di trasporto o applicazione a procedere con la ritrasmissione dei dati. Tuttavia la consegna affidabile del livello di collegamento può essere considerata non necessaria nei collegamenti che presentano un basso numero di errori sui bit. • Rilevazione e correzione degli errori: molti protocolli del livello di collegamento forniscono un meccanismo per rilevare la presenza d’errori sui bit. Ciò è possibile grazie all’inserimento, da parte del nodo trasmittente, di un bit di controllo di errore all’interno del frame e all’esecuzione di un controllo da parte del nodo ricevente. La rilevazione degli errori a livello di collegamento è implementato nell’hardware. La correzione dell’errore è simile alla rilevazione degli errori, ma il nodo ricevente determina il punto preciso del frame in cui si è verificato l’errore per poi correggerlo. 6.1.2 Implementazione del livello di collegamento Figura 6.2: Tipica architettura di un host. Dato un collegamento, il protocollo di collegamento è realizzato da un adattatore di rete (network adpter ), noto come scheda di rete (NIC, Network Interface Card ). Il cuore della scheda di rete è il controller a livello di collegamento (link layer controller ), che è un chip dedicato, il quale implementa molti dei servizi a livello di collegamento. La maggior parte delle funzionalità del controller sono implementate in hardware. In lato mittente il controller, prende un datagramma creato e memorizzato nella memoria dell’host dai livelli più alti della pila di controlli. Lo incapsula in un frame a livello di collegamento riempiendone i vari campi dell’intestazione e lo trasmette sul canale di comunicazione, seguendo il protocollo d’accesso al canale. 94 CAPITOLO 6. LIVELLO DI COLLEGAMENTO In lato destinatario un controller riceve l’intero frame, estrae il datagramma e lo consegna al livello di rete. Se il protocollo del livello di collegamento fornisce il servizio di rilevazione degli errori, allora è il controller trasmittente a impostare i bit di rilevazione degli errori ed è quello ricevente a eseguire il controllo. La Figura 6.2 mostra due aspetti: • Una scheda di rete collegata al bus dell’host, dove viene considerato dagli altri componenti dell’host come un qualsiasi altro dispositivo di I/O. • Mentre la maggior parte del livello di collegamento è implementato in hardware sulla scheda di rete, una parte è invece realizzata in software e viene eseguita dalla CPU dell’host. Le componenti software del livello di collegamento implementano funzionalità del livello più alto, come l’assemblaggio delle informazioni di indirizzamento e l’attivazione dell’hardware del controller. In lato ricevente, il software del livello di collegamento risponde agli interrupt del controller, effettua la gestione di condizioni dell’errore e il passaggio del datagramma fino al livello di rete. Il livello di collegamento è una combinazione di hardware e software. 6.2 Tecniche di rilevazione e correzione degli errori Dunque il rilevamento e correzione degli errori sui bit sono due servizi forniti a livello di collegamento e a volte anche da quello di trasporto. Questa Figura mostra lo scenario di riferimento: al nodo trasmittente ai dati D che devono essere protetti da errori vengono aggiunti dei bit detti EDC (error detection and correction). In genere vengono protetti sia i datagrammi, trasferiti verso il basso dal livello di rete, sia le informazioni relative agli indirizzi di collegamento: i numeri di sequenza e altri campi nell’intestazione del frame. I dati D insieme ai bit EDC sono inviati in un frame al nodo ricevente, il quale legge una sequenza di bit D′ e EDC ′ che può risultare diversa da quella originale. 6.2. TECNICHE DI RILEVAZIONE E CORREZIONE DEGLI ERRORI 95 Il nodo ricevente deve terminare se D′ coincide con D, avendo a disposizione solo D′ e EDC ′ . Tuttavia le attuali tecniche non consentono sempre di rilevare gli errori nei bit, anche nonostante l’utilizzo dei bit di rilevazione degli errori è possibile che ci siano errori non rilevati. Il nodo ricevente potrebbe consegnare datagrammi errati o ignorare che il contenuto dei campi nell’intestazione dei frame sia alterato. Perciò sono necessari schemi che riducano la probabilità di tali eventi. 6.2.1 Controllo di parità Viene impiegato un unico bit di parità (parity bit) e si suppone che le informazioni da inviare D siano costituite da d bit. Figura 6.3: Schema di parità pari a un bit. • In uno schema di parità pari, il mittente include un bit addizionale e sceglie il suo valore in modo da rendere pari il numero di bit 1 nei d + 1 bit trasmessi. • In uno schema di parità dispari, il valore del bit di parità è scelto in modo che ci sia un numero dispari di bit 1. Con un solo bit di parità il nodo ricevente ha il compito di contare il numero di bit a 1 tra quelli ricevuti: se trova un numero dispari di bit 1, allora sa che si è verificato almeno un errore nei bit. ⇒ Cosa accade se si verifica un numero pari di errori nei bit? In questo caso si avrebbe un errore non rilevato. Se la probabilità di errori nei bit è bassa e sono indipendenti, allora l’eventualità di errori multipli in un pacchetto è estremamente ridotta e un solo bit di parità può essere sufficiente. Tuttavia si è analizzato che statisticamente gli errori tendono a verificarsi a raffiche piuttosto che in modo indipendente. La probabilità che gli errori non vengano rilevati in un frame protetto da un solo bit di parità è quasi del 50%. Di conseguenza occorre utilizzare migliori strategie. Lo schema di parità generalizzato a livello bidimensionale (vedi Figura 6.4) suddivide i d bit del dato D in i righe e j colonne per ognuna delle quali è stato calcolato un valore di parità. I risultanti i + j + 1 bit di parità contengono bit per la rilevazione dell’errore nei frame a livello di collegamento. 96 CAPITOLO 6. LIVELLO DI COLLEGAMENTO Figura 6.4: Generalizzazione schema di parità bidimensionale. Supponendo che si verifichi un solo errore nei d bit originali, con questo schema di parità bidimensionale, i bit di parità della colonna e della riga contenenti il bit errato individueranno l’errore. Il ricevente può, oltre a rilevare l’errore, utilizzare gli indici di colonna e di riga per identificare il bit alterato e correggerlo. La capacità del ricevente sia di rilevare che correggere gli errori è conosciuta come forward error correction (FEC). 6.2.2 Checksum Riprendendo la Figura 6.3 i d bit sono trattati come una sequenza di numeri interi da k bit. Il checksum di Internet si bassa su questo approccio: i dati sono considerati come interi di 16 bit e sommati: il complemento a 1 di questa somma costituisce il checksum di Internet che viene trasposto nell’intestazione dei segmenti. Nei protocolli TCP e UDP (vedi Capitolo 3) il checksum è calcolato per tutti i campi (intestazione e dati), mentre in IP il checksum è calcolato sull’intestazione. I metodi di checksum richiedono informazioni addizionali nel pacchetto relativamente piccole, ma forniscono una prevenzione dagli errori piuttosto limitata. Essendo però che il livello di trasporto viene eseguito dal software del sistema operativo dell’host, allora risulta fondamentale disporre di semplici e veloci schemi di rilevazione degli errori. 6.3. COLLEGAMENTI BROADCAST E PROTOCOLLI DI ACCESSO MULTIPLO 6.3 97 Collegamenti broadcast e protocolli di accesso multiplo Esistono due tipologie di collegamento di rete: • Collegamento punto a punto: costituito da un trasmittente a un’estremità del collegamento e da un unico ricevente all’altra. • Collegamento broadcast: può avere più nodi trasmittenti e riceventi connessi allo stesso canale broadcast 1 condiviso. Alcuni esempi di tecnologie con collegamenti broadcast sono Ethernet e Wireless LAN. Un primo problema, chiamato problema dell’accesso multiplo, è la coordinazione dell’accesso di più nodi trasmittenti e riceventi in un canale broadcast condiviso. I nodi su un canale broadcast di una rete di calcolatori possono sia ricevere che trasmettere. Pertanto vengono utilizzati i protocolli di accesso multiplo per fissare le modalità con cui i nodi regolano le loro trasmissioni sul canale condiviso. Dato che tutti i nodi sono in grado di trasmettere frame, è possibile che due o più lo facciano nello stesso istante, per cui tutti i nodi ricevono contemporaneamente più frame. Tra questi si genera una collisione a motivo della quale nessuno dei nodi riceventi riesce a interpretare i frame. Ecco che se una situazione del genere dovesse ripetersi molto frequentemente, allora gran parte della banda del canale verrebbe sprecata. Per riuscire a utilizzare il canale broadcast in modo efficiente, serve coordinare le trasmissioni dei nodi attivi. Questo ruolo spetta ai protocolli d’accesso multiplo, i quali sono categorizzabili nelle seguenti categorie: • Protocolli a suddivisione del canale; • Protocolli ad accesso casuale; • Protocolli a rotazione. Idealmente un protocollo di accesso multiplo per un canale broadcast con velocità di R bps dovrebbe presentare queste caratteristiche: 1. Quando un solo nodo deve inviare dati, allora dispone di un throughput pari a R bps. 2. Quando M nodi devono inviare dati, allora dispongono di un throughput in media pari a R/M bps. 3. Il protocollo è decentralizzato: non ci sono altri nodi principali che nel caso non funzionassero potrebbero rendere inattivo l’intero sistema. 4. Il protocollo è semplice, in quanto risulta economico da implementare. 6.3.1 Protocolli ad accesso casuale Quando si verifica una collisione, i nodi coinvolti ritrasmettono ripetutamente i loro frame fino a quando non raggiungono la destinazione senza collisioni. La ritrasmissione dei frame non è immediata, ma il nodo attende per un periodo di tempo casuale (detto random delay) indipendente da quello degli altri nodi. Ciò consente ai frame di attraversare il canale senza ulteriori collisioni. 1 Per broadcast si intende un canale che diffonde un frame e tutti gli altri nodi ne ricevono una copia. 98 CAPITOLO 6. LIVELLO DI COLLEGAMENTO Slotted ALOHA Si assume che: • Tutti i frame consistano esattamente di L bit; • Il tempo sia suddiviso in slot di L/R secondi; • I nodi comincino la trasmissione dei frame all’inizio degli slot; • I nodi siano sincronizzati in modo che tutti sappiano quando iniziano gli slot; • Qualora in uno slot due o più frame collidano, allora tutti i nodi della rete rileverebbero l’evento prima del termine dello slot. Si indica con p una probabilità (tra 0 e 1) e le operazioni dei nodi slotted ALOHA sono: • Quando un nodo ha un nuovo frame da spedire, attende fino all’inizio dello slot successivo e poi trasmette l’intero frame. • Se non si verifica una collisione, allora l’operazione ha successo, dunque non occorre effettuare una ritrasmissione e il nodo può predisporre l’invio di un nuovo frame. • Se si verifica una collisione, allora il nodo la rileva prima del termine dello slot e ritrasmette con probabilità p il suo frame durante gli slot successivi, fino a quando l’operazione non ha successo. Il protocollo slotted ALOHA possiede i seguenti vantaggi: 1. Consente a un singolo nodo di trasmettere continuamente pacchetti alla massima velocità del canale, quando è il solo nodo attivo. 2. È fortemente decentralizzato, poiché ciascun nodo rileva le collisioni e decide indipendentemente quando ritrasmettere, anche se è comunque necessario che gli slot siano sincronizzati ai nodi. ⇒ Slotted ALOHA funziona altrettanto bene in presenza di molti nodi attivi? Esistono in questo caso due possibili problemi: 1. Nell’esempio proposto una certa frazione degli slot presenta collisioni e di conseguenza viene “sprecata”. 6.3. COLLEGAMENTI BROADCAST E PROTOCOLLI DI ACCESSO MULTIPLO 99 2. Una grande frazione degli slot risulta vuota, perché tutti i nodi attivi terminano la trasmissione in conseguenza della politica di trasmissione probabilistica. I soli slot non sprecati sono esattamente quelli utilizzati da un solo nodo per trasmettere; lo slot in cui trasmette un solo nodo è chiamato slot riuscito. L’efficienza di un protocollo di accesso multiplo che fa uso di slot temporali è definita come la frazione di slot riusciti in presenza di un elevato numero di nodi attivi che hanno sempre un elevato numero di pacchetti da spedire. Se non venisse utilizzata alcuna forma di controllo dell’accesso e se ciascun nodo ritrasmettesse subito dopo che si è effettuata la collisione, l’efficienza sarebbe nulla. ⇒ Di quanto slotted ALOHA si comporta meglio? Si assume che tutti i nodi tentino di trasmettere sempre un frame in uno slot con probabilità p o che abbiano già subito una collisione. Ipotizzando di avere N nodi, in questo caso la probabilità che un dato slot sia vincente è data dalla probabilità che un solo nodo trasmetta (p), mentre i rimanenti N − 1 rimangono inattivi ((1 − p)N −1 ). Quindi la probabilità di successo di un dato nodo è p(1 − p)N −1 , mentre la probabilità che un nodo arbitrario abbia successo è N p(1 − p)N −1 . Di conseguenza con N nodi attivi, l’efficienza dello slotted ALOHA è N p(1 − p)N −1 . Per calcolare la massima efficienza con N nodi attivi si deve trovare p∗ che massimizza la precedente espressione. Quindi: 1 lim N p∗ (1 − p)N −1 = ≈ 0.37 N →+∞ e Ciò significa che quando un gran numero di nodi ha molti pacchetti da trasmettere, allora nel miglior caso solo il 37% circa degli slot compie lavoro utile. Pertanto l’effettiva velocità di trasmissione non è R bps, bensì 0.37R bps, di cui un 37% degli slot viaggia vuoto e il 26% subisce collisioni. ALOHA Il primo protocollo ALOHA era privo di slot, completamente decentralizzato. Nell’ALOHA puro nel momento in cui arriva un frame, il nodo lo trasmette immediatamente e integralmente nel canale broadcast. • Se un frame va in collisione, allora il nodo lo ritrasmette subito con probabilità p. • Se non va in collisione, allora attende il tempo di trasmissione del frame. Dopo questo tempo il nodo ritrasmette il frame con probabilità p o aspetta restando inattivo per un certo periodo con probabilità 1 − p. Per determinare l’efficienza si analizza un singolo nodo con le stesse assunzioni dello slotted ALOHA e prendendo come unità di tempo il tempo di trasmissione di un frame. A ogni istante la probabilità che un nodo stia trasmettendo è p. Supponendo che la trasmissione di un frame inizi al tempo t0 , come mostrato in Figura 6.3.1, affinché sia trasmesso con esito positivo nessun altro nodo può cominciare la propria trasmissione nell’intervallo di tempo (t0 − 1, t0 ]. Poiché si sovrapporrebbe con l’inizio della trasmissione del frame del nodo i. Le probabilità che tutti gli altri nodi non diano inizio a una trasmissione in questo intervallo è (1 − p)N −1 . Analogamente nessun altro nodo può iniziare la trasmissione mentre il nodo i sta trasmettendo, in quanto si sovrapporrebbe all’ultima parte della trasmissione di quel frame. La probabilità che tutti gli altri nodi non inizino a trasmettere in questo intervallo è (1 − p)N −1 . 100 CAPITOLO 6. LIVELLO DI COLLEGAMENTO Ecco che la probabilità che un certo nodo abbia successo nella trasmissione è p(1 − p)2(N −1) . Calcolando come per slotted ALOHA il limite di quest’espressione si ottiene che l’efficienza 1 ≈ 0.184, ossia la metà. Questo è dovuto alla completa decentralizzazione del massima risulta 2e protocollo. CSMA Le regole alla base dei protocolli CSMA (Carrier Sense Multiple Access) e CSMA/CD (CSMA with Collision Detection) sono: • Un nodo “ascolta” il canale prima di trasmettere, operazione definita rilevamento della portante. Se il canale sta già trasmettendo un frame, allora il nodo aspetta finché rileva che il canale è libero per un intervallo di tempo e quindi inizia la trasmissione. • Il nodo che sta trasmettendo rimane contemporaneamente in ascolto nel canale, operazione detta rilevamento della collisione. Se un altro nodo trasmette un frame e interferendo con un altro, allora quest’ultimo arresta la propria trasmissione e aspetta un intervallo di tempo casuale al fine di ripetere la trasmissione. ⇒ Perché se tutti i nodi effettuano il rilevamento della portante si verificano collisioni? • All’istante t0 il nodo B rileva che il canale è inattivo (nessun nodo sta trasmettendo), in questo modo inizia la trasmissione e i suoi bit si propagano in entrambe le direzioni lungo il mezzo trasmissivo. La propagazione verso valle dei bit di B, al crescere del tempo, indica che è necessario un intervallo di tempo non nullo per l’effettiva propagazione dei bit B lungo il canale. • Al tempo t1 > t0 il nodo D ha un frame da spedire. Sebbene al tempo t1 stia trasmettendo B e i suoi bit non abbiano ancora raggiunto D, quest’ultimo comincia a trasmettere ritenendo il canale libero. Dopo un breve periodo i frame di B e D interferiscono tra loro e risulta evidente che il ritardo di propagazione da un estremo all’altro di un canale broadcast abbia un ruolo importante nel determinare le sua prestazioni: maggiore è questo ritardo e maggiore diventa la possibilità che il nodo non si accorga che è già cominciata la trasmissione da parte di un altro nodo, nonostante la rilevazione della portante. 6.3. COLLEGAMENTI BROADCAST E PROTOCOLLI DI ACCESSO MULTIPLO 101 CSMA/CD Nell’esempio analizzato per CSMA i nodi non eseguono il rilevamento delle collisioni: B e D continuano a trasmettere i loro pacchetti anche se si è verificata una collisione. Questo scenario parte con gli stessi presupposti di quello precedente, ma ora i due nodi terminano la loro trasmissione poco dopo aver rilevato la collisione. Tale possibilità di rilevare le collisioni migliora le prestazioni, evitando inutili trasmissioni di interi frame danneggiati da altri frame. La scheda di rete collegata a un canale broadcast opera nei seguenti modi: 102 CAPITOLO 6. LIVELLO DI COLLEGAMENTO 1. La scheda ottiene direttamente un datagramma dal livello di rete, prepara un frame a livello di collegamento e lo sistema in un suo buffer. 2. Quando riscontra che il canale è libero, allora inizia la trasmissione del frame. Se il canale risulta occupato, resta in attesa fino al momento in cui non rileva più il segnale e inizia l’invio del frame. 3. Durante la trasmissione verifica la presenza di eventuali segnali provenienti da altre schede di rete sul canale broadcast. 4. La scheda di rete conclude il suo lavoro se trasmette l’intero frame senza rivelare altre trasmissioni. Altrimenti è costretta a interrompere la trasmissione del frame. 5. Dopo aver annullato la trasmissione, la scheda di rete aspetta per un tempo casuale e poi ritorna al punto 2. La necessità di attendere per un intervallo di tempo casuale è dovuta al fatto che: se l’intervallo fosse uguale per entrambi i nodi, allora continuerebbero a entrare in collisione per sempre. ⇒ Qual è l’intervallo di tempo opportuno da scegliere per il tempo di attesa casuale (detto tempo di backoff )? • Se l’intervallo è grande e il numero di nodi che collidono è piccolo, i nodi probabilmente aspettano per un lungo intervallo di tempo prima di ripetere il ciclo. • Se l’intervallo è piccolo e il numero di nodi che collidono è grande, allora è più probabile che i valori scelti casualmente siano simili e che dunque i nodi trasmettenti tornino a collidere. La soluzione sarebbe un intervallo di tempo piccolo, quando il numero di nodi in collisione è piccolo, mentre uno grande quando il numero di nodi è grande. L’algoritmo di binary exponential backoff risolve questo problema. In dettaglio quando il trasmettitore riscontra l’n-esima collisione durante la trasmissione di un dato frame, stabilisce casualmente un valore K nell’insieme {0, 1, 2, . . . , 2n −1}. Quindi più alto è il numero di collisioni e maggiore è l’intervallo da cui K viene estratto. ⇒ Qual è l’efficienza di CSMA/CD? Quando un solo nodo ha un frame da inviare può trasmettere alla massima velocità del canale. Se invece i nodi che vogliono trasmettere sono numerosi, l’effettiva velocità di trasmissione sul canale risulta inferiore. Si definisce efficienza di CSMA/CD la frazione di tempo media durante la quale i frame sono trasferiti sul canale senza collisioni in presenza di un alto numero di nodi attivi, con un’elevata quantità di frame da inviare. Per rappresentare un’approssimazione in forma chiusa dell’efficienza di Ethernet, si indica con dprop il tempo massimo che occorre al segnale per propagarsi fra una coppia di schede di rete. Dato dtrasm come il tempo necessario per trasmettere un frame della maggior dimensione possibile, si ricava la semplice approssimazione: Efficienza = 1 1 + 5 · (dprop /dtrasm ) • Quando dprop tende a 0, l’efficienza tende a 1. Infatti se il ritardo di propagazione è nullo, i nodi in cui si verifica una collisione interrompono immediatamente la trasmissione senza sprecare la capacità del canale. 6.4. RETI LOCALMENTE COMMUTATE 103 • Al crescere di dtrasm , l’efficienza tende a 1. Infatti nel momento in cui un frame si appropria del canale può trattenerlo per un periodo di tempo estremamente lungo. Di conseguenza il canale svolge lavoro produttivo per la maggior parte del tempo. 6.4 Reti localmente commutate Questo scenario mostra una rete locale commutata che connette tre dipartimenti, due server e un router con 4 switch. Questi ultimi operando a livello di collegamento commutano frame piuttosto che datagrammi a livello di rete, per cui non riconoscono gli indirizzi a livello di rete e non usano algoritmi di instradamento (RIP e OSPF) per determinare i percorsi attraverso la rete degli switch di livello 2. 6.4.1 Indirizzi MAC Gli adattatori dei nodi, quali host e router, ossia le schede di rete, possiedono indirizzi a livello di collegamento. Un host o un router con più interfacce di rete ha più indirizzi a livello di collegamento associati a esse. Inoltre gli switch a livello di collegamento non hanno indirizzi associati alle loro interfacce che connettono host e router, perché il loro compito è trasportare i datagrammi tra host e router in modo trasparente, ovvero che non serva porre l’indirizzo nei frame per lo switch. Gli indirizzi a livello di collegamento sono indicati con varie terminologie: indirizzo fisico, indirizzo LAN o indirizzo MAC. Per molte LAN (come Ethernet e 802.11), l’indirizzo MAC 104 CAPITOLO 6. LIVELLO DI COLLEGAMENTO è lungo 6 byte, che consentono di avere 248 possibili indirizzi; generalmente gli indirizzi sono espressi in notazione esadecimale, scrivendo due cifre esadecimali per ogni byte. Non possono esistere due schede di rete con lo stesso indirizzo MAC, poiché la IEEE gestisce questo aspetto in tal modo: quando una società vuole costruire schede di rete compra un blocco di spazio di indirizzi, costituito da 224 indirizzi, e la IEEE fissa i primi 24 bit dell’indirizzo lasciando poi alla società il compito di assegnare a ciascuna scheda una specifica combinazione dei 24 bit rimanenti. L’indirizzo MAC ha na struttura piatta senza gerarchie e non cambia mai: un calcolatore con una scheda Ethernet, o interfaccia wireless 802.11, possiede sempre lo stesso indirizzo MAC indipendentemente dal luogo in cui viene utilizzato. Al contrario gli indirizzi IP hanno una struttura gerarchica e cambiano quando l’host si sposta, cioè nel momento in cui cambia la rete alla quale è collegato. Quando una scheda di rete vuole spedire un frame, inserisce l’indirizzo MAC di destinazione e lo immette nella LAN. Facendo un esempio si suppone che uno switch faccia broadcast di un frame in ingresso su tutte le sue interfacce in uscita, di conseguenza ogni scheda controlla se l’indirizzo MAC di destinazione corrisponde al suo. • In caso affermativo: la scheda di rete estrae il datagramma dal frame e lo passa verso l’alto nella pila dei protocolli del nodo cui appartiene. • In caso negativo: la scheda di rete non fa altro che scartare il frame. È possibile che una scheda di rete voglia che tutte le schede di rete ricevano e processino i frame che sta inviando. In questo caso la scheda di rete inserisce uno speciale indirizzo MAC broadcast nel campo dell’indirzzo di destinazione del frame. Per le LAN che utilizzano indirizzi a 6 byte, l’indirizzo broadcast è una stringa di 48 bit posti a 1, cioè FF-FF-FF-FF-FF-FF (in notazione esadecimale). 6.4.2 Protocollo ARP Poiché esistono sia indirizzi a livello di rete (indirizzi IP) sia indirizzi del livello di collegamento (indirizzi MAC), si presenta la necessità della loro conversione. Tale compito è affidato al protocollo di risoluzione degli indirizzi (ARP, Address Resolution Protocol ). Questo esempio mostra che ciascun nodo ha un indirizzo IP e la scheda di ciascun nodo ha un indirizzo MAC; si assume ancora che lo switch invii in broadcast tutti i frame. 6.4. RETI LOCALMENTE COMMUTATE 105 Si suppone che il nodo con indirizzo IP 222.222.222.220 voglia inviare un datagramma IP al nodo 222.222.222.222. Per trasmettere un datagramma, il nodo trasmettente deve fornire alla sua scheda di rete non solo il datagramma IP, ma anche l’indirizzo MAC del nodo destinatario 222.222.222.222. Quando gli vengono passati il datagramma IP e l’indirizzo MAC, la scheda del nodo trasmittente deve costruire un frame contenente l’indirizzo MAC del nodo di destinazione e immetterlo nella LAN. Per riuscire a determinare l’indirizzo MAC è necessario un modulo ARP, il quale nel nodo sorgente riceve in input un indirizzo IP della stessa LAN e restituisce l’indirizzo MAC corrispondente. Per molti aspetti il modulo ARP è simile al DNS, con la differenza che il DNS esegue l’operazione per host localizzati in qualunque punto di Internet, mentre ARP risolve soltanto gli indirizzi IP per i nodi nella sua stessa sottorete. Funzionamento di ARP Nella RAM dei nodi è presente una tabella ARP che contiene la corrispondenza tra indirizzi IP e MAC. In più possiede anche un valore relativo al TTL2 , che indica quando bisogna eliminare una data voce dalla tabella. Questa tabella non contiene necessariamente una voce per ciascun nodo della sottorete. Alcuni nodi possono essere stati cancellati perché scaduto il loro TTL, altri possono non essere mai stati inseriti. ⇒ Cosa accade se la tabella non possiede la voce necessaria in un dato momento? Il nodo trasmittente costruisce un pacchetto speciale chiamato pacchetto ARP, che possiede molti campi, compresi quelli per gli indirizzi IP e MAC di chi spedisce e chi riceve; i pacchetti ARP di richiesta e di risposta hanno lo stesso formato. Lo scopo di un pacchetto ARP di richiesta è interrogare tutti gli altri nodi della sottorete riguardo l’indirizzo MAC corrispondente all’indirizzo IP da risolvere. Quindi la scheda di rete incapsula il pacchetto ARP in un frame, utilizza l’indirizzo broadcast per la destinazione del frame e lo trasmette nella sottorete. Il frame contenente la richiesta ARP è ricevuto da tutte le altre schede di rete sulla sottorete e ciascuna di queste trasferisce il pacchetto al proprio nodo che controlla la corrispondenza dell’indirizzo IP. L’unico nodo (se esiste) che possiede l’indirizzo corrispondente invia al nodo richiedente un frame di risposta ARP con la corrispondenza desiderata. Il nodo richiedente aggiorna la sua tabella ARP e invia il datagramma IP incapsulato in un frame, il cui MAC di destinazione è quello del nodo che ha risposto alla richiesta. Il protocollo ARP è plug-and-play, perché la tabella ARP di un nodo si costruisce automaticamente e non deve essere configurata. Inoltre se un nodo viene scollegato dalla sottorete, prima o poi il suo indirizzo verrà eliminato dalla tabella dei nodi della sottorete. L’ultima considerazione è che il pacchetto ARP contenendo sia indirizzi del livello di collegamento sia indirizzi del livello di rete, viene considerato al confine tra questi due livelli. 6.4.3 Struttura dei frame Ethernet Si considera l’invio di un datagramma IP da un host a un altro sulla stessa LAN Ethernet. Sebbene il payload del frame Ethernet sia un datagramma IP, si nota che Ethernet può anche trasportare altri tipi di pacchetti a livello di rete. 2 In genere corrisponde a 20 minuti dal momento in cui la voce viene inserita nella tabella ARP. 106 CAPITOLO 6. LIVELLO DI COLLEGAMENTO Per esempio la scheda di rete trasmittente A ha l’indirizzo MAC AA-AA-AA-AA-AA-AA e il ricevente B ha l’indirizzo MAC BB-BB-BB-BB-BB-BB. La scheda di rete A incapsula il datagramma IP in un frame Ethernet e lo passa al livello fisico. B ottiene il frame dal livello fisico, estrae il datagramma IP e lo passa al livello di rete. Il pacchetto Ethernet presenta 6 campi: • Campo dati [da 46 a 1500 byte]: contiene il datagramma IP. Dato che l’unità massima di trasmissione (MTU, Maximum Transfer Unit) per Ethernet è 1500 byte, se il datagramma IP supera questo valore, allora l’host deve frammentare il datagramma. Al contrario se la dimensione è minore di 46 byte, allora il campo deve essere riempito (stuffed ) fino a raggiungere quel dato valore. Successivamente questi byte verranno rimossi utilizzando il campo lunghezza dell’intestazione del datagramma IP. • Indirizzo di destinazione [6 byte]: contiene l’indirizzo MAC della scheda di rete di destinazione. Quando una scheda di rete riceve un pacchetto Ethernet con quell’indirizzo, o con l’indirizzo MAC di broadcast, allora trasferisce il contenuto del campo dati del pacchetto al livello di rete. Invece i pacchetti con altri indirizzi MAC vengono scartati. • Indirizzo sorgente [6 byte]: include l’indirizzo MAC della scheda di rete che trasmette il pacchetto. • Tipo [2 byte]: consente a Ethernet di supportare vari protocolli di rete. • Controllo a ridondanza ciclica [4 byte]: consente alla scheda di rete ricevente di rilevare la presenza di un errore nei bit del frame. • Preambolo [8 byte]: i frame Ethernet iniziano con un campo di 8 byte: 7 hanno i bit 10101010, mentre l’ultimo è 10101011. I primi 7 byte del preambolo servono a sincronizzare i clock delle schede dei riceventi. Diversamente gli ultimi 2 bit degli 8 byte avvisano la scheda di rete ricevente che stanno per arrivare i dati. 6.4.4 LAN estese Le LAN estese consistono in apparati di livello 2 che sostituiscono il cavo di rete. Prendendo in esempio un grande edificio: non è possibile cablare ogni stanza con un unico cavo, perciò è bene appoggiarsi a degli apparati che “spezzino” tale architettura. N piani . . . 107 6.4. RETI LOCALMENTE COMMUTATE Da ogni apparato possono partire le connessioni per l’intero piano e anche verso gli altri apparati. Così facendo se ci dovesse essere un guasto solo il pezzo di rete coinvolto sarebbe escluso, mentre gli altri continuerebbero a funzionare. Lo switch fa partire i cavi da sé (tramite le sue porte) verso gli utenti e poi coi un altro cavo gli switch si connettono tra loro. Switch Switch Switch Router di bordo Switch A livello di stack protocollare, lo switch dispone solamente dei primi due livelli: livello di collegamento e livello fisico. Nota bene: lo switch non è un router, perché quest’ultimo ha una visione globale dell’intera rete Internet, mentre lo switch soltanto della sua sottorete. Lo switch a 2 porte è detto bridge All’interno lo switch possiede N porte d’ingresso e d’uscita con ognuna il proprio buffer per gestire i pacchetti. Per indirizzare questi pacchetti è presente una matrice di commutazione che trasferisce le trame da un ingresso verso un’uscita. Inoltre viene utilizzata una tabella la cui segna una specifica porta d’uscita per ogni indirizzo MAC. Matrice di commutazione Porte d'ingresso . . . . . . Porte d'uscita Tabella MAC Porta MAC A 1 MAC B 5 MAC C 5 Terminologia: • Il dominio di broadcast è quella porzione di rete raggiunta da un messaggio inviato in broadcast a livello 2. I router rappresentano sempre un confine del dominio di broadcast a livello 2. • Il dominio di collisione è la porzione di rete dove se due stazioni trasmettono contemporaneamente si verifica una collisione. In questo caso è lo switch a essere il confine dei domini di collisione. 108 CAPITOLO 6. LIVELLO DI COLLEGAMENTO 6.5 6.5.1 Reti wireless Wireless LAN Per reti 802.11 si intendono le wireless LAN e nel dettaglio si dividono in due architetture: • Infrastruttura (maggiormente utilizzata): La parte wireless è supportata da un’infrastruttura di rete. Si dispone di un access point il quale risulta l’interfaccia tra il mondo wireless e il mondo cablato. La parte gestita dall’access point è chiamata basic service set (BSS). Successivamente l’access point è collegato a uno switch che a sua volta è collegato a un router che provvede alla connettività verso Internet. Internet BSS Switch Router di bordo Access Point BSS • Ad hoc (relegata ad ambiti specifici). Lo standard 802.11 è una famiglia di standard, ovvero composto da più specifiche dove ognuna ha una lettera diversa, per esempio: • 802.11a: definisce le frequenze utilizzate e quale sia il formato della parte trasmissiva data una determinata velocità di trasmissione. • 802.11g: è analogo al 802.11a, ma con un insieme diverso di frequenze e velocità. ⇒ Quale protocollo si deve utilizzare per l’accesso al mezzo condiviso? Per le reti cablate va bene il protocollo CSMA-CD, tuttavia questo non limita le collisioni. Si suppone il caso in cui ci sono tre stazioni che devono trasmettere delle trame: inizialmente la prima stazione non ha problemi a utilizzare il canale poiché le altre due attendono la conclusione, ma successivamente queste due inizierebbero a trasmettere contemporaneamente creando una collisione. La soluzione per le reti wireless consiste in una variante del CSMA chiamato CSMA/CA (CSMA Collision Avoidance). 6.5.2 Algoritmo CSMA/CA Lo scopo del CSMA/CA è quello di evitare la situazione espressa nella Sezione 6.5.1, ossia cercare di anticipare il più possibile potenziali collisioni e prevenirle (ovviamente non lo si può fare del tutto). Per definire questo algoritmo è necessario il concetto di time-slot. 109 6.5. RETI WIRELESS Nelle WLAN il tempo è diviso in time-slot, la cui durata è definita dall’access point. La dimensione del time-slot è proporzionale (circa) al ritardo di propagazione, in genere più piccolo del ritardo di propagazione: τ << Ttrama . Esempio. Nel 802.11b (uno dei primi standard supportato da tutti avente velocità 11 Mb/s) la durata di un time-slot è circa 10 µs: τ = 10 µs. Questo time-slot viene chiamato anche inter frame space (IFS). In particolare il time-slot più piccolo è definito short IFS (SIFS), invece l’intervallo di tempo SIFS + 2 time-slot = DIFS. SIFS DIFS Tornando all’algoritmo CSMA/CA, quando una stazione ha una trama da trasmettere: • Per prima cosa ascolta il canale: 1. Se il canale è libero, allora continua ad ascoltare il canale per un intervallo pari a DIFS. Se dopo questo tempo il canale è ancora libero, allora viene trasmessa la trama. 2. Se il canale è occupato fin da subito o durante il DIFS, allora continua ad ascoltare il canale fino a quando si libera. 3. Quando il canale è libero, lo si ascolta per un intervallo pari a DIFS. Se il canale torna occupato si torna al punto 2. 4. Se il canale rimane libero per un DIFS, allora la stazione estrae un numero casuale uniformemente distribuito tra (0, cw − 1) (contention window ). Questo numero casuale viene indicato con S = # slot che si deve attendere prima di poter trasmettere. • Fintanto che il canale rimane libero, la stazione decrementa S: se arriva a 0 allora la stazione trasmette la trama. Al contrario se il canale torna occupato si salva il valore di S e si torna al punto 2, ma una volta arrivati al punto 4 si utilizza il valore precedentemente salvato di S. • Se dopotutto si dovesse presentare una collisione, allora si interromperebbe la trasmissione, si estrarrebbe un tempo casuale e tornerebbe al punto 1 (raddoppiando cw). SA = 6 A T1 AP DIFS B SB = 10 SB = 3 110 CAPITOLO 6. LIVELLO DI COLLEGAMENTO Trame con riscontro (di livello 2) Siccome che il mezzo wireless dal punto di vista trasmissivo è molto delicato, allora si può implementare a livello 2 un riscontro delle singole trame3 . ACK A A AP B DIFS • La trasmissione dell’access point è diretta solo verso A, ma percepita da entrambe le stazioni (A e B). • Dopo che viene percepito l’ultimo bit, il riscontro viene inviato immediatamente dopo SIFS. Questo riscontro è una piccola trama che avvisa l’access point che la trama spedita è stata ricevuta correttamente. • Dal punto di vista di B il canale dopo l’access point si libera, pertanto deve aspettare un DIFS prima di trasmettere, ma il canale si rioccupa dal riscontro di A. 6.5.3 Problema del terminale nascosto Il problema del terminale nascosto è specifico solo delle wireless LAN, perché nelle reti cablate tale fenomeno non avviene. Il motivo di questo problema è dovuto alla propagazione del segnale: quando due stazioni comunicano tra di loro, la forma d’onda della stazione che sta trasmettendo all’inizio possiede una determinata ampiezza, ma man mano che si propaga nello spazio questa ampiezza diminuisce. Ciò è dovuto dal ricevitore dell’altra stazione che è in grado di raccogliere, rispetto l’intera superficie, solo una piccola frazione del fronte d’onda. A B Ampiezza Spazio 3 Ciò non ha nulla a che fare con il riscontro TCP. 111 6.5. RETI WIRELESS Siccome il ricevitore della stazione B è in grado di cogliere solo una piccola frazione, allora la potenza che è in grado di rilevare diminuisce con il tempo. Oltre una certa distanza non si recepisce più il segnale ed è come se la stazione A non stesse trasmettendo. Range di A Range di B AP B A Range di trasmissione dell'access point • Il range di trasmissione è lo spazio entro il quale il segnale riesce ad arrivare. • Il range di trasmissione dell’access point riesce a coprire entrambe le stazioni A e B. • I range di trasmissione delle stazioni A e B riescono a includere l’access point, ma non l’altra stazione. • Se l’access point vuole comunicare con A e B questi riescono a rispondere senza problemi. ⇒ Dato questo scenario, cosa succede con CSMA/CA nel caso in cui A stia trasmettendo e B generi una trama? B ascolta il canale e lo percepisce libero. Pertanto aspetta un DIFS e nonostante la trasmissione di A sia in corso, proprio perché il segnale non arriva, il canale risulta ancora libero. Trascorso questo tempo B inizia a trasmettere sovrapponendosi a quella in corso di A, così facendo l’access point percepisce due trasmissioni e si crea una collisione (non percepita da A e B). Le soluzioni a questo problema sono: 1. Limitare lo spazio di responsabilità di un’access point, ossia installare tali dispositivi a una distanza limite inferiore a quella del loro range di trasmissione. Così facendo ogni stazione copre almeno due access point e comunica con quello più vicino a esso. 2. Applicare una variante del protocollo introducendo due messaggi: • RTS (Request To Send ): è un piccolo messaggio che contiene l’identificativo della stazione e la dimensione della trama che vuole trasmettere. • CTS (Clear To Send ): è un messaggio inviato in broadcast dove avvisa tutti i nodi che è stato assegnato il diritto a una certa stazione di poter trasmettere. In questo modo si inibiscono le trasmissioni delle altre stazioni per un tempo pari a quello indicato nel messaggio di CTS. 112 CAPITOLO 6. LIVELLO DI COLLEGAMENTO Tuttavia questa soluzione non è immune da errori: se entrambe le stazioni dovessero inviare contemporaneamente il messaggio di RTS, allora entrambe le trame andrebbero a collidere e l’access point non potrebbe rispondere con il CTS. In tal caso non vedendo alcun CTS entrambe le stazioni attendono un tempo casuale, dopo il quale riprovano a spedire il messaggio di RTS. Nota bene: è l’access point a calcolare quanto tempo ci vuole per completare la trasmissione della stazione e inserisce questa informazione nel CTS. L’inibizione della trasmissione permette di risparmiare energia: i dispositivi mobili, non essendo collegati alla rete elettrica, eseguono processi che consumano la batteria, di conseguenza se possono essere “congelati” si riesce a risparmiare quell’energia. ⇒ Se non ci dovesse essere RTS/CTS, sarebbe possibile risparmiare energia? La risposta è sì, tramite l’ascolto del canale e l’analisi delle trame. Facendo un passo indietro, in generale, una stazione sta sempre in ascolto (ed è ciò che consuma la maggior parte dell’energia), mentre la trasmissione risulta incostante nel tempo (consuma meno). Dunque ogni header contiene la dimensione della trama di trasmissione: se l’indirizzo di destinazione della trama è diverso dall’indirizzo della stazione X, allora questa stazione spegne il circuito di ricezione per il tempo necessario alla trasmissione in corso. Questo meccanismo è definito Network Allocation Vector (NAV). Nel dettaglio è un vettore che contiene gli intervalli di tempo nei quali è inibito l’ascolto del canale, quindi che è occupato dalla trasmissione di una stazione. 6.5.4 Framing I problemi da risolvere del livello di collegamento (data link ) sono: • Gestione del mezzo condiviso attraverso i vari algoritmi di accesso (vedi Sezione 6.3). • Delimitazione delle trame, chiamato anche come framing . Le difficoltà nascono dal momento in cui il livello fisico lavora solamente con i bit, mentre il livello di collegamento gestisce le trame (frame), ossia bit raggruppati logicamente tra di loro. Quindi se ci sono due stazioni che comunicano tra di loro, il livello 2 manda al livello 1 i frame da trasmettere in bit all’altra stazione. ⇒ Però se viene recepita una serie di bit, come si fa distinguere quali appartengono a una determinata trama anziché un’altra? Ci sono varie possibili soluzioni: 1. Introdurre intervalli temporali tra una trama e quella successiva. Tuttavia in questo modo il segnale trasmesso si distorce: se si hanno due onde, trasmesse a distanza di un piccolo intervallo temporale, possono espandersi andando a sovrapporsi: si rischia di rendere vano l’intervallo di tempo scelto per distinguerle. 2. Character Count: si introduce nell’header un campo che indica il numero di byte. Anche in questo caso è presente un problema, cioè se si verifica un errore nel campo del numero di byte si propaga a cascata. 3. Introdurre un byte di flag abbinato alla tecnica del bit stuffing. Ovvero si aggiunge un byte specifico (per esempio 01111110) all’inizio e alla fine della trama, così si segnala quando 6.5. RETI WIRELESS 113 iniziare e concludere l’interpretazione dei bit. Il problema di questa soluzione è che se si verifica almeno un bit errato nei byte specifici, allora l’interpretazione continua fino a quando non trova correttamente la sequenza specifica. ⇒ Cosa succede se all’interno della sequenza è presente il byte di flag? Si utilizza la seconda parte di questa tecnica, ovvero il bit stuffing: in trasmissione ogni volta che si incontra la sequenza 011111 (tendendo in considerazione la sequenza d’esempio fatta in precedenza), indipendentemente da quello che segue, si aggiunge uno 0; in ricezione ogni volta che si incontra la sequenza 0111110, indipendentemente da quello che segue, si rimuove il precedente 0 tornando quindi 011111. 6.5.5 VPN Esempio. Quando si prova a effettuare l’accesso al server della rete universitaria univr, stando all’interno della rete di univr, il server permette l’accesso. Se si prova a replicare il medesimo accesso da una rete domestica, il server di univr non permetterà di accedere. Usando la VPN (Virtual Private Network ) dalla propria rete domestica, si esegue una richiesta GET al VPN server della rete di univr. Il pacchetto verrà modificato dal server VPN che modifica l’IP sorgente così da sembrare una richiesta proveniente dalla rete univr. A questo punto il server a cui è stata fatta la richiesta risponde inviando la risposta al VPN server, che successivamente spedisce la risposta al PC della rete domestica che ha mandato la richiesta originaria. 114 CAPITOLO 6. LIVELLO DI COLLEGAMENTO Parte II Esercizi 115 Traduzione IP 7.1 Esercizio 1 Testo esercizio. Si deve tradurre in decimale il seguente indirizzo IP: 11100111.11011011.10001011.01101111. ⇒ Svolgimento: Ogni campo da 8 bit viene convertito in decimale. • 17 + 16 + 15 + 04 + 03 + 12 + 11 + 10 = 128 + 64 + 32 + 0 + 0 + 4 + 2 + 1 = 231. 2 2 2 2 2 2 2 2 • 17 + 16 + 05 + 14 + 13 + 02 + 11 + 10 = 128 + 64 + 0 + 16 + 8 + 0 + 2 + 1 = 219. 2 2 2 2 2 2 2 2 • 17 + 06 + 05 + 04 + 13 + 02 + 11 + 10 = 128 + 0 + 0 + 0 + 8 + 0 + 2 + 1 = 139. 2 2 2 2 2 2 2 2 • 07 + 16 + 15 + 04 + 13 + 12 + 11 + 10 = 0 + 64 + 32 + 0 + 8 + 4 + 2 + 1 = 111. 2 2 2 2 2 2 2 2 In conclusione: 11100111.11011011.10001011.01101111 ↓ 231.219.139.111 7.2 Esercizio 2 Testo esercizio. Si deve tradurre in binario il seguente indirizzo IP: 221.34.255.82. ⇒ Svolgimento: Si può procedere secondo due metodi: 1. Sottrazioni successive: • 221 → 221 - 1·(27 ) = 93 - 1·(26 ) = 29 - 0·(25 ) = 29 - 1·(24 ) = 13 - 1·(23 ) = = 5 - 1·(22 ) = 1 - 0·(21 ) = 1 - 1·(20 ) = 0. • 34 → 34 - 0·(27 ) = 34 - 0·(26 ) = 34 - 1·(25 ) = 2 - 0·(24 ) = 2 - 0·(23 ) = = 2 - 0·(22 ) = 2 - 1·(21 ) = 0 - 0·(20 ) = 0. • 255 → 255 - 1·(27 ) = 127 - 1·(26 ) = 63 - 1·(25 ) = 31 - 1·(24 ) = 15 - 1·(23 ) = = 7 - 1·(22 ) = 3 - 1·(21 ) = 1 - 1·(20 ) = 0. 117 118 CAPITOLO 7. TRADUZIONE IP • 82 → 82 - 0·(27 ) = 82 - 1·(26 ) = 18 - 0·(25 ) = 18 - 1·(24 ) = 2 - 0·(23 ) = = 2 - 0·(22 ) = 2 - 0·(21 ) = 0 - 0·(20 ) = 0. In conclusione: 231.219.139.111 ↓ 11011101.0010010.11111111.01010000 2. Divisione e resto: 221 110 55 27 13 6 3 1 2 2 2 2 2 2 2 1 0 1 1 1 0 1 1 34 17 8 4 2 1 2 2 2 2 2 255 127 63 31 15 7 3 1 0 1 0 0 0 1 0 0 2 2 2 2 2 2 1 1 1 1 1 1 1 1 82 41 20 10 5 2 1 2 2 2 2 2 2 0 1 0 0 1 0 1 0 In conclusione: 231.219.139.111 ↓ 11011101.0010010.11111111.01010000 Questi due metodi si equivalgono, pertanto non ci sono particolari preferenze per la conversione da decimale a binario. Indirizzamento Testo esercizio. Qual è l’indirizzo di rete se si ha il seguente indirizzo IP: 140.120.84.20/20. ⇒ Svolgimento: 1. Tradurre l’indirizzo da notazione decimale puntata a binario puntata e identificare i bit del prefisso. 140 70 35 17 8 4 2 1 2 2 2 2 2 2 2 0 0 1 1 0 0 0 1 120 60 30 15 7 3 1 2 2 2 2 2 2 84 42 21 10 5 2 1 0 0 0 1 1 1 1 2 2 2 2 2 2 0 0 1 0 1 0 1 20 10 5 2 1 2 2 2 2 0 0 1 0 1 L’indirizzo tradotto risulta: 10001100.01111000.01010100.00010100. Il /20 specifica che i primi 20 bit sono di prefisso: 10001100.01111000.0101 {z }0100.00010100. | prefisso 2. Il secondo passo è quello di azzerare i bit appartenenti al suffisso: 10001100.01111000.0101 0100.00010100 | {z } suffisso ↓ 10001100.01111000.01010000.00000000 3. Si effettua la traduzione da binario a decimale (vedi metodo di traduzione a 1.3.2): 10001100.01111000.01010000.00000000 ↓ 140.120.80.0/20 119 120 CAPITOLO 8. INDIRIZZAMENTO Creazione di sottoreti 9.1 Esercizio 1 9.1.1 Parte 1 Testo esercizio. Si dispone di tre LAN collegate nel modo rappresentato in figura. All’insieme di queste tre reti è stato assegnato un blocco: 165.5.1.0/24. Viene richiesto di creare tre sotto reti, in maniera tale che abbiano tutte lo stesso numero di host. LAN 1 LAN 2 LAN 3 ⇒ Svolgimento: 1. Si effettua la traduzione da decimale a binario. 165 82 41 20 10 5 2 1 2 2 2 2 2 2 2 0 0 1 0 0 1 0 1 5 2 1 2 2 0 0 1 1 1 0 0 L’indirizzo tradotto risulta: 10100101.00000101.00000001.00000000. Il /24 specifica che i primi 24 bit sono di prefisso: 10100101.00000101.00000001 | {z }.00000000. prefisso 2. Dato che si devono formare tre sotto reti di uguali dimensioni, la soluzione consiste nel prendere due bit del suffisso e creare le combinazioni disponibili con 22 , mentre gli ultimi 121 122 CAPITOLO 9. CREAZIONE DI SOTTORETI bit rimanenti vengono messi tutti a 0: 10100101.00000101.00000001.00000000 ↓ 10100101.00000101.00000001.00000000 10100101.00000101.00000001.01000000 10100101.00000101.00000001.10000000 10100101.00000101.00000001.11000000 In questo modo il prefisso passa da /24 (256 indirizzi) a /26 (64 indirizzi) bit e si formano quattro sotto reti: 165.5.1.0/26 165.5.1.64/26 165.5.1.128/26 165.5.1.192/26 Affinché si possa disporre un qualsiasi numero di sotto reti (non coincidente alla potenza del 2) è necessario che non tutte abbiano la stessa grandezza. Per questo esempio delle tre LAN si dovrebbe dividere la rete a metà prelevando un solo bit dal suffisso, per poi ridividere a metà una delle due sotto reti appena create. 9.1.2 Parte 2 Testo esercizio. Considerando i dati del precedente esercizio, la LAN 1 ha un numero d’indirizzi doppio rispetto a LAN 2 e LAN 3. ⇒ Svolgimento: 10100101.00000101.00000001.00000000 {z } | LAN 1 Da un blocco /24 (256 indirizzi) si passa a due blocchi da /25 (128 indirizzi): LAN 1 }| { z 10100101.00000101.00000001.00000000 10100101.00000101.00000001.10000000 | {z } LAN 2 Dalla LAN 2 si ricava la LAN 3, quindi da un blocco /25 (128 indirizzi) si passa a due blocchi /26 (64 indirizzi): LAN 2 }| { z 10100101.00000101.00000001.10000000 10100101.00000101.00000001.11000000 | {z } LAN 3 123 9.2. ESERCIZIO 2 9.2 Esercizio 2 Testo esercizio. Si considera la seguente rete formata da 5 sottoreti: LAN 3 LAN 5 LAN 1 LAN 2 LAN 4 Ci sono due indirizzi già assegnati alla rete: • 101.75.79.255 • 101.75.80.0 Domande: 1. Qual è il blocco rete CIDR più piccolo (con il minor numero di indirizzi) che contiene tali indirizzi? 2. Dato il blocco CIDR del punto precedente, si creano 5 sottoreti con i seguenti vincoli: • LAN 1: deve essere una sottorete /21. • LAN 2: deve ospitare fino a 1000 host. • LAN 3: deve essere una sottorete /23. • LAN 4: deve ospitare fino a 400 host. • LAN 5: deve ospitare metà host rispetto al blocco iniziale. ⇒ Svolgimento punto 1: Si traduce in binario i due indirizzi forniti: 101.75.79.25510 = 01100101.01001011.01001111.111111112 101.75.80.010 = 01100101.01001011.01010000.000000002 Si considerano i bit in comune che rappresentano la rete: 01100101.01001011.01000000.00000000 Il blocco CIDR più piccolo è: 101.75.64.0/19. 124 CAPITOLO 9. CREAZIONE DI SOTTORETI ⇒ Svolgimento punto 2: Conoscendo il blocco CIDR, si ricavano le seguenti informazioni: • Il numero degli host iniziale è: 232−19 = 213 . • Il numero di bit per gli host della LAN 2 è: 210 = 1024 > 1000, 32 − 10 = /22. • Il numero di bit per gli host della LAN 4 è: 29 = 512 > 400, 32 − 9 = /23. • Il numero di indirizzi della LAN 5 è: 213 /2 = 212 , 32 − 12 = /20. Ecco che si ricavano tutte le cinque LAN: LAN 5 LAN 2 101.75.64.0 / 20 101.75.88.0 / 22 LAN 3 101.75.92.0 / 23 101.75.92.0 / 22 LAN 4 101.75.94.0 / 23 101.75.64.0 / 19 101.75.88.0 / 21 101.75.80.0 / 20 9.3 LAN 1 101.75.80.0 / 21 Esercizio 3 Testo esercizio. Viene fornita la seguente situazione: LAN 1 LAN 2 INTERNET LAN 3 In cui: • LAN 1 possiede fino 300 host. • LAN 2 possiede fino 40 host. • LAN 3 possiede fino 90 host. • L’indirizzo di broadcast della LAN 3 è 148.12.79.255. 125 9.4. ESERCIZIO 4 Domande: 1. Qual è blocco CIDR più piccolo da assegnare all’intera rete? 2. Quali sono gli indirizzi di rete e di broadcast delle tre LAN partendo dal blocco trovato nel punto precedente? ⇒ Svolgimento punto 1: si calcolano gli indirizzi delle LAN: • LAN 1 → 300 host < 512 = 29 , 232−9 = 223 . • LAN 2 → 40 host < 64 = 26 , 232−6 = 226 . • LAN 3 → 90 host < 128 = 27 , 232−7 = 225 . 512 < 512 + 64 + 128 < 1024 = 210 Quindi il blocco CIDR più piccolo corrisponde a 232−10 = 222 e si prende come riferimento l’indirizzo broadcast: 148.12.79.255 10010100.00001100.01001111.11111111 ↓ 10010100.00001100.01001100.00000000 148.12.76.0/22 ⇒ Svolgimento punto 2: si ricavano gli indirizzi di rete e di broadcast delle LAN: • LAN 1: 10010100.00001100.0100110 | 0.00000000 → 23 • LAN 2: 10010100.00001100.01001110. | 00000000 → 24 • LAN 3: 10010100.00001100.01001111. | 00000000 → 24 9.4 Esercizio 4 Testo esercizio. Sono presenti 4 LAN: • LAN 1 → 130 host (contiene l’indirizzo 46.144.141.41); • LAN 2 → 270 host; • LAN 3 → 65 host; • LAN 4 → 35 host; 148.12.76.0/23 148.12.76.255 148.12.78.0/24 148.12.78.255 148.12.79.0/24 148.12.79.255 126 CAPITOLO 9. CREAZIONE DI SOTTORETI Domande: 1. Qual è il blocco CIDR totale? 2. Quali sono gli indirizzi di rete e broadcast delle 4 LAN? ⇒ Svolgimento punto 1: Si trovano le corrispondenze di ogni LAN al numero massimo di host: • LAN 1: 130 → 256; • LAN 2: 270 → 512; • LAN 3: 65 → 128; • LAN 4: 35 → 64; 256 + 512 + 128 + 64 = 960 → 1024 = 210 Il blocco CIDR totale corrisponde a: 32 − 10 = 22 → 46.144.140.0/22 ⇒ Svolgimento punto 2: Si traduce l’indirizzo in binario: 46.144.140.0/22 → 00101110.10010000.10001100.00000000 Si ricavano gli indirizzi di rete e broadcast: • LAN 2: 00101110.10010000.1000111|0.00000000 → 46.144.142.0/23 46.144.143.255 (broadcast) • LAN 1: 00101110.10010000.10001101|.00000000 → 46.144.141.0/24 46.144.141.255 (broadcast) • LAN 3: 00101110.10010000.10001100.0|0000000 → 46.144.140.0/25 46.144.140.127 (broadcast) • LAN 4: 00101110.10010000.10001100.11|000000 → 46.144.140.128/26 46.144.140.191 (broadcast) È necessario fornire prima gli indirizzi a LAN 2 e LAN 1 per una questione di host minimi che devono contenere (valori espressi nel testo dell’esercizio). 9.5 Esercizio 5 Testo esercizio. Sono presenti 3 LAN: • LAN 1 → 400 host (contiene l’indirizzo 178.242.85.168); • LAN 2 → 300 host; 127 9.5. ESERCIZIO 5 • LAN 3 → 1200 host; Domande: 1. Qual è il blocco CIDR più piccolo da assegnare all’intera rete? 2. Quali sono gli indirizzi di rete delle 3 LAN? ⇒ Svolgimento punto 1: Si trovano le corrispondenze di ogni LAN al numero massimo di host: • LAN 1: 400 → 512; • LAN 2: 300 → 512; • LAN 3: 1200 → 2048; 512 + 512 + 2048 = 3072 < 4096 = 212 Il blocco CIDR totale corrisponde a: 32 − 12 = 20 → 178.242.80.0/20 quindi vengono considerati solo i primi 20 bit dell’indirizzo dato 178.242.85.168. ⇒ Svolgimento punto 2: Si traduce l’indirizzo CIDR in binario: 178.242.80.0/20 → 10110010.11110010.01010000.00000000/20 Si ricavano gli indirizzi di rete: • LAN 3: 10110010.11110010.01011|000.00000000 → 178.242.88.0/21 • LAN 1: 10110010.11110010.0101010|0.00000000 → 178.242.84.0./23 • LAN 2: 10110010.11110010.0101011|0.00000000 → 178.242.86.0/23 128 CAPITOLO 9. CREAZIONE DI SOTTORETI TCP 10.1 Esercizio 1 Testo esercizio. Un’applicazione A deve trasferire verso un’applicazione B 96000 byte. Si suppone che la connessione sia già stata instradata. • MSS = 1000 byte; • RCVWND = 32000 byte (costante); i; • SSTHRESHi = RCVWND 2 • RTT = 0.5 secondi (costante); • RTO = 2 · RTT (raddoppia in caso di perdite sequenziali); 3 → 3.5 ; 7 → 7.5 • La rete va fuori uso negli intervalli aperti ⇒ Soluzione: • Il numero di segmenti da trasmettere è: 96000/1000 = 96 segmenti. • RCVWND corrisponde a: 32000/1000 = 32 segmenti. • SSTHRESHi corrisponde a: 16 segmenti. 18 CWND 16 17 SSTHRESH 16 Bisogna 12 8 SSTHRESH 9 8 1 9 11 trasmetterne solo 2 8 4 4 10 4 5 5 2 2 2 1 1 2 3 3.5 6 6.33333 (finale) 4 1 4 5 RTO 6 7 7.5 RTO 129 8 9 10 t 130 CAPITOLO 10. TCP + 1 + 2 + 4 + 8 + 9 + 10 + I segmenti trasmessi sono: 1 + 2 + 4 + 8 + 16 + 17 + 18 (48) (82) + 1 + 2 + 4 + 5 + 2 11 (96) A B 16 t=2 t = 2.5 17 t=3 RTO x 18 DOWN DI RETE t = 3.5 t=9 4 t = 9.5 5 t = 10 CWNDfinale = CWNDvecchio + =6+ 10.2 2 #ack CWNDvecchio tfinale = 10.5 19 2 = = 6.3 6 3 Esercizio 2 Testo esercizio. Si devono trasmettere 31 segmenti, conoscendo: • RCVWNDi = 16 segmenti; • SSTHRESHi = 8 segmenti; ⇒ Soluzione: CWND 16 RCVWND 12 SSTHRESH 8 8 4 4 1 2 1 1 1.5 2 RTO 1 3 3.5 4 2 RTO 2 3 4 5 6 4 3 4.75 (finale) 2 1 5 6 7 7.5 8 9 10 t RTO I segmenti trasmessi sono: 1 + 2 + 4 + 8 +1 + 2 + 3 + 4 + 5 +8 + 1 + 2 + 3 + 34 = 31. 131 10.3. ESERCIZIO 3 10.3 Esercizio 3 Testo esercizio. Un’applicazione A deve trasferire verso un’applicazione B 104000 byte. Si suppone che la connessione sia già stata instradata. • MSS = 1200 byte; • RCVWNDi = 2400 byte; • SSTHRESHi = RCVWNDi ; • RTT = 0.5 secondi (costanti); • RTO = 2RTT, raddoppia per ritrasmissione; • La rete va fuori uso negli intervalli aperti 3.5 → 4 6.5 → 10.5 ⇒ Soluzione: CWND 20 20 20 20 RCVWND SSTHRESH 16 16 10 8 8 8 4 4 2 1 1 1 2 3 4 CWND = 2 2 1 5 6 7 8 9 10 11 12 13 14 t + 1 + 2 + 4 + 8 + 1 Si trasmettono: 1 + 2 + 4 + 8 + 16 + 20 + 20 + 16 + 1 + 1 + 1 (71) 20 (86)10 Pacchetti da trasmettere 10.4 = 104000 = 87 1200 CWNDi = 24000 = 20 1200 Esercizio 4 Testo esercizio. Un’applicazione A deve trasferire 104400 byte verso B (87 segmenti). • MSS = 1200 byte; • RCVWNDi = 9600 byte; • A partire dal tempo tA > 4.0 la destinazione annuncia RCVWND = 14400 byte (12 segmenti); • A partire dal tempo tB > 9.0 la destinazione annuncia RCVWND = 7200 byte (6 segmenti); • SSTHRESHi = RCVWNDi ; 132 CAPITOLO 10. TCP • CWNDt=0 = 1; • RTT = 1 secondo (costante); • La rete va fuori uso nell’intervallo aperto 11.5 → 12.5; ⇒ Soluzione: CWND 12 12 10 10 9 8 RCVWND 8 12 11 8 SSTHRESH 6 6 6 4 4 CWND = 3.3333 2 2 2 1 3 1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 t Si trasmettono: 1 + 2 + 4 + 8 + 8 + 9 + 10 + 11 + 12 + 12 + 6 + 4 6 + 1 + 2 + 1 3 (83) A B 8 t=3 t=4 8 RCVWND = 12 ACK t=5 t=8 12 t=9 12 t = 10 6 t = 11 4 t = 11.5 DOWN DELLA RETE t = 12.5 t = 13 RCVWND = 6 133 10.5. ESERCIZIO 5 10.5 Esercizio 5 Testo esercizio. Un’applicazione A deve trasferire 73200 byte verso B (61 segmenti). • MSS = 1200 byte; t=0 • RCVWND t > 5 t > 10 19200byte 24000byte 19200byte 16 segmenti 20 segmenti 16 segmenti • SSTHRESHi = RCVWNDi ; • RTT = 1 secondo; • La rete va fuori uso negli intervalli 5.5 → 8 e 18.5 → 19.5; ⇒ Soluzione: CWND 20 18 16 16 RCVWND 16 SSTHRESH 14 12 10 8 8 8 7 6 6 5 4 4 4 3 2 2 3 CWND = 3 2 2 1 1 1 2 3 4 5 6 7 8 9 10 1 11 12 13 14 15 16 17 18 19 20 21 22 t + 1 + 1 + 2 + 3 + 4 + 6 + 7 + 8 + 1 + 1 Si trasmettono: 1 + 2 + 4 + 8 + 16 + 16 (59) A B t=4 RCVWND = 20 t=5 t = 5.5 t=6 DOWN DELLA RETE t=7 RTO = 4 t=8 RCVWND = 10 t = 11 t = 12 (61) 134 CAPITOLO 10. TCP 10.6 Esercizio 6 Testo esercizio. Un’applicazione A deve trasferire 77500 byte verso B. • MSS = 1250 byte; t = 0 10000byte • RCVWND t > 4 17500byte t > 8 12600byte • SSTHRESHi = RCVWNDi ; • RTT = 1 secondo; • La rete va fuori uso negli intervalli 8 → 10 e 13.5 → 14.5; ⇒ Soluzione: CWND 14 12 12 11 10 10 9 8 RCVWND 8 8 SSTHRESH 6 6 4 4 4 3 CWND = 3 2 2 2 2 1 1 1 2 3 4 5 6 7 8 9 1 10 11 12 13 14 15 16 17 18 Si trasmettono: 1 + 2 + 4 + 8 + 8 + 9 + 10 + 11 + 1 + 2 + 4 + 8 + 1 + 1 (53) A B t=7 t=8 RCVWND = 10 RTO = 2 DOWN DELLA RETE t = 10 t = 11 RCVWND = 10 t = 12 t = 13 t = 13.5 DOWN DELLA RETE t = 15 t Collegamento 11.1 Esercizio 1 Testo esercizio. Sono presenti 3 stazioni: A, B e C. • Protocollo: ALOHA; • Velocità di trasmissione: 2.5 Mb/s; • Lunghezza delle trame trasmesse: 3750 byte; • Tempo di trama: L V = 3750·8 2.5·106 · 1000 = 12 ms; • Tempi delle stazioni: – tA : 410 ms; – tB : 418 ms; – tC : 454 ms; ⇒ Soluzione: 410 A 422 451 A 418 B 439 A 430 455 B 467 B 454 C 507 B 466 C 491 503 C Ricalcolo: • ZA = (4 + 1 + 0) · 1 + 12 = 17 ms → 422 + 17 = 439 ms; • ZB = (4 + 1 + 8) · 1 + 12 = 25 ms → 430 + 25 = 455 ms; • ZC = (4 + 5 + 4) · 1 + 12 = 25 ms → 466 + 25 = 491 ms; • ZB = (4 + 5 + 5) · 1 + 12 = 40 ms → 467 + 40 = 507 ms; 135 519 136 CAPITOLO 11. COLLEGAMENTO 11.2 Esercizio 2 Testo esercizio. Sono presenti 2 stazioni: A e B. • Protocollo: CSMA persistent; • Velocità di trasmissione: 2.5 Mb/s; • Lunghezza delle trame trasmesse: 3750 byte; • Ritardo di propagazione: τ = 2 ms; • Tempo di trama: L V = 3750·8 2.5·106 · 1000 = 12 ms; • Tempi delle stazioni: – tA : 225 ms, 240 ms; – tB : 228 ms; ⇒ Soluzione: 225 A 237 240 A1 228 B 252 A2 239 253 251 270 282 A2 286 228 296 B1 227 298 B 239 254 272 284 Ricalcolo: • ZA = (2 + 4 + 0) · 1 + 12 = 18 ms → 252 + 18 = 270 ms; • ZB = (2 + 3 + 9) · 1 + 12 = 26 ms → 251 + 26 = 277 ms; 11.3 Esercizio 3 Testo esercizio. Sono presenti 3 stazioni: A, B e C; con bridge. A BRIDGE Segmento 1 • Protocollo: ALOHA; • Velocità di trasmissione: 1.6 Mb/s; • Lunghezza delle trame trasmesse: 800 byte; • Tempo di trama: L V = 800·8 1.6·106 · 1000 = 4 ms; B Segmento 2 C 137 11.4. ESERCIZIO 4 • Tempi delle stazioni: – tA : 216 ms, 256 ms (tutte dirette a B); – tB : 233 ms (diretta ad A); – tC : 219 ms (diretta ad A); ⇒ Soluzione: 216 A 220 256 A1 C1 243 BRIDGE 224 232 A1 277 236 233 B1 257 254 271 258 237 249 223 253 243 C1 Ricalcolo: • ZBr2 = (2 + 2 + 0) · 1 + 4 = 8 ms → 224 + 8 = 232 ms; • ZC = (2 + 1 + 9) · 1 + 4 = 16 ms → 223 + 16 = 239 ms; • ZBr2 = (2 + 3 + 2) · 2 + 4 = 18 ms → 236 + 18 = 254 ms; • ZB = (2 + 3 + 3) · 1 + 4 = 12 ms → 237 + 12 = 249 ms; • ZBr1 = (2 + 5 + 3) · 1 + 4 = 14 ms → 257 + 14 = 271 ms; • ZA = (2 + 5 + 6) · 1 + 4 = 17 ms → 260 + 17 = 277 ms; 11.4 Esercizio 4 Testo esercizio. Sono presenti 2 stazioni: A e B; con bridge. A BRIDGE Segmento 1 • Protocollo: CSMA persistent; • Velocità di trasmissione: 1.5 Mb/s; B Segmento 2 285 A2 B1 239 C1 275 281 A1 B1 219 253 281 A2 B1 247 A1 B C 260 A2 138 CAPITOLO 11. COLLEGAMENTO • Lunghezza delle trame trasmesse: 1500 byte; • Ritardo di propagazione: τ1 = 1 ms, τ2 = 2 ms; • Tempo di trama: L V 1500·8 1.5·106 = · 1000 = 8 ms; • Tempi delle stazioni: – tA : 713 ms, 715 ms (tutte dirette a B); – tB : 719 ms, 730 ms (tutte diretta ad A); ⇒ Soluzione: 715 713 721 A1 A 729 A2 731 739 768 775 738 714 BRIDGE 722 774 B1 730 B2 763 721 729 737 740 758 766 A1 774 A1 782 A1 732 B B1 719 B2 727 730 B2 738 739 756 764 Ricalcolo: • ZBr2 = (7 + 2 + 9) · 1 + 8 = 26 ms → 737 + 26 = 763 ms; • ZB = (7 + 3 + 0) · 1 + 8 = 18 ms → 738 + 18 = 756 ms; 768 776 784