Lo strato applicativo di Internet

Trasmissione Internet

Nel seguito sono esposti i meccanismi alla base della comunicazione a pacchetto e del loro instradamento su rete Internet, e di come la stratificazione funzionale dei protocolli si sostanzi in una architettura software realizzata interfacciando strati via via più prossimi al mezzo di comunicazione. Nel prossimo capitolo sarà descritto come un programma (applicazione) in esecuzione su di un computer ospite (host) possa comunicare con un altro, posto ad una diversa estremità della rete Internet.

Internet, la rete delle reti

Il modello di comunicazione Internet prevede che i servizi a cui si accede siano localizzati ai bordi della rete, mentre quest'ultima svolge esclusivamente la funzione di recapitare le informazioni da un estremo all'altro: ciò è in netta contrapposizione rispetto alle tradizionali reti telefoniche, in cui invece si è praticamente vincolati ad usare i servizi offerti dall'operatore che ci consente l'accesso alla rete. Per questo, il modello Internet si traduce in

Lo studio delle applicazioni Internet, pertanto, potrebbe essere svolto in modo quasi del tutto indipendente dalla comprensione del funzionamento della rete Internet; d'altra parte, una percezione di ciò che avviene dietro le quinte (e come vedremo, anche all'interno del nostro computer di casa) è senz'altro di grande aiuto nelle fasi progettuali e di utilizzo.

Lo origini di Internet sono legate all'esigenza del Dipartimento della Difesa (DoD) degli USA di far comunicare tra loro computer di diversa fabbricazione. Alla base del funzionamento di Internet, troviamo le caratteristiche di

In questo capitolo ci occupiamo appunto di descrivere i meccanismi di funzionamento interno della rete Internet. Ma prima di tutto, vanno definiti alcuni concetti di base.

Commutazione di circuito, instradamento, multiplazione

Descriviamo innanzitutto cosa non è Internet, illustrando brevissimamente i principi di funzionamento di una rete telefonica pubblica (PSTN), basata sulla commutazione di circuito, e sulla multiplazione a divisione di tempo.

Agli albori della telefonia, ossia nell'epoca dei telefoni a manovella, con la cornetta appesa al muro, la comunicazione si basava sulla creazione di un vero proprio circuito elettrico, grazie all'operato di un centralinista umano, che collegava fisicamente tra loro le terminazioni dei diversi utenti. Nel caso in cui intervengano più centralinisti in cascata, la chiamata risulta instradata attraverso più centralini. Da allora, il termine commutazione di circuito individua il caso in cui

Le cose non sono cambiate di molto (da un punto di vista concettuale) con l'avvento della telefonia numerica: in tal caso, più segnali vocali sono campionati e quantizzati in modo sincrono, ed il risultato (numerico) è multiplato in una trama PCM, in cui viene riservato un intervallo temporale per ognuno dei flussi tributari.


Il processo di multiplazione è tale per cui il flusso binario risultante da N tributari uguali, deve essere trasmesso ad una velocità binaria pari ad N volte quella del singolo tributario. Ad esempio nel caso del PCM, in cui si estraggono per ogni sorgente 8000 campioni a secondo, e ognuno di questi è quantizzato con 8 bit, si ottiene (per ogni tributario) un contributo di

8 bit/campione * 8.000 campioni/secondo = 64.000 bit/secondo.

La trama PCM si ottiene multiplando assieme 32 tributari, e quindi la velocità complessiva risulta essere di 64.000 * 32 = 2.048.000 bit/secondo, comunemente indicato come flusso a 2 Megabit, ovvero, in accordo alla nomenclatura ITU-T, come circuito E1. In realtà, due dei 32 intervalli temporali possono essere riservati ad informazioni di segnalazione, ma questo... potrà essere oggetto di altri corsi.

Per ciò che ci riguarda, possiamo concludere questa brevissima digressione, specificando che nell'attraversamento di nodi di commutazione, più flussi PCM possono essere ulteriormente raggruppati, producendo quella che viene indicata come gerarchia digitale plesiocrona (PDH), attualmente sostituita dalla gerarchia digitale sincrona (SDH).

Commutazione di pacchetto

Tornando alla modalità di trasmissione Internet, una grande differenza tra il caso della trasmissione di segnale vocale (sia pur digitalizzato) e quello della trasmissione dati, è che nel secondo caso non è necessario impegnare il mezzo trasmissivo in modo esclusivo, ma la trasmissione può avvenire in modalità sporadica, ed i dati inviati ad intervalli irregolari. Questo motivo, assieme alla dimensione variabile dei diversi messaggi, porta a suddividere la comunicazione in unità informative autonome, indicate come pacchetto dati.

La trasmissione dei pacchetti avviene multiplandoli (ovvero, condividendo lo stesso mezzo trasmissivo tra le diverse comunicazioni) in modo statistico, ovvero senza riservare con esattezza risorse a questo o quel tributario. Infatti, in questo caso il multiplatore si limita ad inserire i pacchetti ricevuti in apposite code, da cui li preleva per poterli trasmettere in sequenza. La presenza di code comporta

a meno di non adottare tecniche di prioritizzazione atte a garantire la Qualità del Servizio (QoS).

Per contro, se ogni pacchetto reca con sé le informazioni necessarie al suo recapito, la rete di trasmissione non necessita di una apposita fase di setup dell'instradamento: nel caso della commutazione di pacchetto, ogni unità informativa fa caso a sè.

Modello Internet

Ora che abbiamo discusso le differenze più evidenti tra reti a circuito e reti a pacchetto, e prima di descrivere le modalità di sviluppo di una applicazione Internet, ovvero di un servizio che operi tramite questa rete, affrontiamo l'analisi dei meccanismi alla base del funzionamento effettivo di Internet, assieme alle tecnologie di collegamento e di trasmissione più comunemente adottate in quest'ambito. L'insieme di questi aspetti porta alla definizione di un modello concettuale che si basa sulla stratificazione funzionale, sulla pacchettizzazione, e sull'incapsulamento dei dati.

Stratificazione funzionale

Nel 1978 l'International Organization for Standardization emise uno standard denominato Open Systems Interconnection (poi indicato come ISO/OSI), che definisce una nomenclatura di riferimento per la descrizione di come dei Sistemi Aperti possano comunicare tra loro, allo scopo di favorire l'interoperabilità tra costruttori diversi.

Nella figura (tratta da MMC) viene evidenziato come si possa stabilire una relazione gerarchica tra le diverse funzioni, individuando un pila (stack) di strati (layer). Le entità di pari livello N sono da ritenersi virtualmente in colloquio tra loro (tra pari, o peer), mediante lo scambio logico di Protocol Data Unit (PDU), mentre in effetti queste si avvalgono dei servizi offerti dallo strato inferiore N-1, che a sua volta, offre dei servizi allo strato superiore N+1.

Incapsulamento

In base a questo formalismo, le PDU di livello N (o N PDU) sono costruite a partire dalle (N+1) PDU, aggiungendo a queste delle intestazioni (Protocol Control Information, PCI) che permettono il dialogo vituale tra entità di livello N. Il meccanismo si ripete con lo strato immediatamente soggiacente, e così via finchè le unità informative non raggiungono lo strato più inferiore, a diretto contatto con il mezzo trasmissivo, che permette lo scambio fisico tra entità.

L'aggiunta delle PCI alle PDU provenienti dallo strato superiore prende il nome di
incapsulamento, dato che ricorda molto da vicino il processo di racchiudere un plico ricevuto, in una nuova busta esterna. A volte, la PDU proveniente dallo strato superiore, viene indicata (dal punto di vista dello strato che la riceve) come Service Data Unit o SDU; le stesse SDU inoltre vengono anche indicate come payload, o carico utile.

Il modello ISO/OSI individua sette livelli funzionali, di cui i più rilevanti per ciò che riguarda le applicazioni Internet, sono quelli cosiddetti di trasporto e di rete, indicati rispettivamente come TCP (o UDP) e IP, mentre i tre livelli ISO-OSI superiori vengono raggruppati in un unico strato applicativo, per cui di fatto Internet è basata su di un modello a cinque livelli.

Lo stack dei protocolli, dall'applicazione alla trasmissione

La figura seguente mostra le relazioni che intercorrono tra i diversi strati funzionali presenti in un computer connesso ad Internet.


In particolare, è mostrato come i processi applicativi (AP) affidino i dati generati/richiesti, ad uno strato inferiore (di trasporto, TCP o UDP). L'AP all'altro estremo della comunicazione, non si avvede neanche dell'esistenza di uno strato di trasporto, e la trasmissione delle Application Protocol Data Unit (APDU) sembra avvenire direttamente tra i due AP Client e Server.

Ma come fare per distinguere i diversi processi contemporaneamente in esecuzione al computer ricevente? Ciò è possibile in base alle informazioni presenti nell'intestazione (header) aggiunta dallo strato di trasporto alla APDU, che infatti contiene un numero di porta (altrimenti detto
SAP, o Service Access Point) che identifica l'AP a cui è diretta.

Il processo si ripete, invocando i servizi offerti dallo strato di rete (IP), che ha il compito di recapitare i singoli pacchetti tramite i nodi di commutazione, o router, di Internet. Viene quindi aggiunto un nuovo header (IP), che contiene un protocol field in grado di specificare quale entità dello strato di trasporto  (TCP, UDP) o servizio di rete (ICMP, IGMP) viene incapsulata. Infine, viene aggiunto un header ulteriore (di link), in cui un type field identifica il protocollo di rete (nel nostro caso, IP) trasportato. La trama (frame) così composta può essere effettivamente trasmessa sul mezzo che interconnette i nodi della LAN, e recapitata a quello con l'indirizzo di collegamento specificato nel Frame Header.

Non tutte le PDU dei diversi livelli sono indicate cone lo stesso nome di pacchetti: nello stack Internet questo termine è riservato alle PDU prodotte dallo strato di rete (a volte indicate anche datagrammi), mentre quelle di livello applicativo sono demoninate segmenti, e quelle di livello di collegamento trame. In questo modo si evita di fare confusione usando lo stesso termine per oggetti differenti.

Nella figura sottostante, ovvero in quest'altra, viene posto in evidenza come i router (ossia i dispositivi che interconnettono le diverse reti di cui è composta Internet) si limitino a dialogare solo fino allo strato di rete (IP) delle entità a cui sono collegate, senza cioè leggere nulla più interno della intestazione IP.

Indirizzi Internet

Internet può essere definita come la rete delle reti, in quanto ha lo scopo di interconnettere reti diverse ed eterogenee, e coinvolge la coesistenza di indirizzi di diversa natura, ognuno legato ad uno strato funzionale:

Strato
Indirizzo
Applicazione
protocollo://nodo.dominio.tld
Trasporto
socket TCP o porta
Rete
Indirizzo IP x.y.w.z
Collegamento
indirizzo Ethernet a:b:c:d:e:f

Per ognuno dei quattro tipi di indirizzo, è previsto un meccanismo di traduzione nell'indirizzo necessario allo strato inferiore, in accordo al seguente schema

Indirizzo
Formato e Traduzione
per lo strato applicativo l'indirizzo prende il nome di

URI
con la forma
proto://fqdn/risorsa

oppure

proto:user@fqdn
  • ogni protocollo proto (es HTTP, FTP) è associato di default ad un indirizzo di trasporto (ad es porte TCP 80, 21), in accordo alle corrispondenze registrate presso IANA, indicate anche come porte ben note. Viceversa, il numero di porta può anche essere indicato in modo esplicito, con una sintassi del tipo fqdn:port
  • il Fully Qualified Domain Name fqdn si traduce, mediante interrogazione al DNS, nell'indirizzo IP necessario allo strato di rete per consegnare i pacchetti alla LAN dove risiede l'host di destinazione
  • risorsa, e user, costituiscono un sotto-indirizzamento la cui semantica è definita nel contesto dell'applicazione che gestisce proto. Ad es, se proto è mailto, allora user è il destinatario; se invece proto è http, risorsa è una pagina web.
per lo strato di rete, si ha un indirizzo
IP
  • i 4 bytes x.y.w.z dell'indirizzo IP sono utilizzati, all'interno della rete locale, dal protocollo ARP per conoscere l'indirizzo Ethernet dell'host di destinazione
lo strato di collegamento spesso è una LAN Ethernet, e gli indirizzi sono detti
MAC

ovvero Media Access Control
  • i 6 byte dell'indirizzo Ethernet vengono usati dallo strato di collegamento per individuare un computer fisicamente connesso alla stessa Local Area network (rete LAN)

Ogni diversa classe di indirizzi ha un significato di localizzazione, relativa al proprio strato funzionale, come ad esempio un indirizzo postale del tipo Persona/via e numero civico/Città/Nazione è la concatenazione di 4 diversi indirizzi. Quindi, mentre un indirizzo MAC (Media Access Control) individua un computer dentro una LAN, un indirizzo IP individua un computer su Internet, ed un indirizzo di trasporto, una applicazione in esecuzione su quel computer.

IP: lo strato di rete

IP significa Internet Protocol, ed in effetti rappresenta la quintessenza della filosofia su cui è basata Internet: ogni comunicazione è suddivisa in pacchetti, ognuno dei quali presenta nella intestazione IP, gli indirizzi a 4 byte che identificano il computer di partenza e di destinazione.

Intestazione IP

Si compone di un minimo di 20 byte, in 5 file da 4. Il campo VER indica quale versione si sta utilizzando, quella tuttora in uso è IPv4. HLEN e TLEN indicano rispettivamente la lunghezza dell'header e di tutto il pacchetto, mentre TOS codifica un Type of Service (poi ri-definito per DiffServ e ECN) che può essere usato per differenziare il tipo di traffico. Nel caso in cui il pacchetto IP abbia una dimensione maggiore di una trama Ethernet, questo viene suddiviso in frammenti, e l'identificazione riporta lo stesso valore per tutti i frammenti di uno stesso datagramma, mentre l'Offset di frammento indica la posizione del frammento nel pacchetto, espresso come multiplo di 8 byte.

Solo 2 dei tre bit di Flag sono usati, DF (Don't Fragment) per richiedere alla rete di non frammentare il datagramma, e MF (More Fragments) per indicare che seguiranno altri frammenti. Il TTL (Time To Live) determina la massima permanenza del pacchetto nella rete, in quanto ogni router attraversato ne decrementa di uno il valore, finché questo non si azzera, ed il pacchetto è scartato. Protocollo indica il tipo di pacchetto incapsulato, ovvero a quale tipo di trasporto consegnare il datagramma all'arrivo (ad es. TCP o UDP), in accordo ai codici registrati presso IANA, ed infine Checksum serve per verificare l'assenza di errori nell'header.

Gli Indirizzi IP di sorgente e destinazione individuano i computer all'interno di Internet, e servono allo strato di rete per recapitare il messaggio e la risposta associata, mentre il campo Opzioni ha una lunghezza variabile, può essere omesso, e consente ad esempio di richiedere il tracciamento della serie di router attraversati.

Dimensione dei pacchetti

I pacchetti IP non sono di dimensione fissa, ma possono variare tra un minimo ed un massimo:

Spesso la dimensione dei pacchetti IP viene posta pari a 1480 byte, ossia la dimensione del payload Ethernet di 1500 byte, meno i 20 di intestazione IP. La massima dimensione permessa senza dover subire frammentazione da parte di qualche collegamento di transito può essere scoperta adattando tecniche indicate come path MTU discovery. Alcune interfacce di rete e dorsali di collegamento permettono pacchetti di 9000 bytes detti jumbo frame, che possiamo trovare ad es. in questocapture ottenuto durante un test di velocità svolto con Iperf.

Instradamento

Ogni computer connesso ad Internet è identificato globalmente mediante un indirizzo di rete (associato appunto allo strato di rete, ossia l'indirizzo IP) di 4 byte (es 151.100.122.171).

Se due computer sono connessi alla medesima rete locale (LAN o Local Area Network), come nel caso dei computer ospitati in uno stesso edificio, questi comunicano in modo diretto, come nel caso (#1) tra LH2 e LH3 della figura seguente, mediante l'indirizzo Ethernet (o MAC) di sei byte scoperto mediante
risoluzione ARP, e che identifica le rispettive schede di rete. Il pacchetto passa inalterato attraverso un dispositivo chiamato switch, che si limita a prendere in considerazione la sola intestazione di strato di collegamento.

Quando l'indirizzo IP di destinazione è esterno alla LAN di partenza, come nel caso (#3), allora il datagramma è inviato a destinazione in modo indiretto, per il tramite di un particolare router presente nella LAN, il Default Gateway (R1 nella figura), che interconnette la LAN al resto di Internet. Di li in poi, il pacchetto IP viene rilanciato di router in router, esaminando ogni volta l'indirizzo di destinazione, ed inoltrando il pacchetto sulla interfaccia nella direzione corretta, via via fino a quello che ha accesso alla LAN di destinazione.

La direzione giusta viene stabilita in base all'esame di apposite tabelle di routing, che possono modificarsi nel tempo, così come i collegamenti, possono andare a volte fuori servizio. Per questi motivi, nulla vieta ai pacchetti di una stessa comunicazione di seguire instradamenti alternativi, ed anzi è proprio questo ciò che accade:

Pertanto,

i pacchetti IP possono giungere a destinazione in un ordine diverso da quello di partenza.

Gli strati superiori (Trasporto ed Applicativo) in esecuzione presso gli host di destinazione, svolgeranno quindi il compito di ristabilire l'ordine corretto.

Maschera di sottorete

Ma come fa un computer, a capire che il destinatario è nella sua stessa LAN??

Innanzitutto, va detto che i computer che risiedono fisicamente sulla stessa LAN devono essere stati configurati con degli indirizzi IP tra loro simili, che abbiano in comune lo stesso prefisso, un pò come i telefoni fissi di una stessa città o quartiere hanno la stessa parte iniziale del numero. Dei trentadue bit di indirizzo IP, la parte che costituisce il prefisso, e che è la stessa per tutti i computer della LAN, ha una lunghezza ben determinata, ed è individuata in base alla conoscenza della cosidetta
maschera di sottorete o Network Mask, ovvero una sequenza di 4 byte i cui bit sono posti (a partire dal più significativo) tutti ad 1, finché da un certo punto in poi, sono tutti posti a zero. Il numero di bit pari ad uno, indicato come lunghezza della maschera o mask length, rappresenta appunto di quanti bit (a partire da sinistra) è composto il prefisso che identifica la LAN, ed eseguendo l'AND binario tra la maschera ed un indirizzo IP, si ottiene la sua parte prefisso, detta anche indirizzo di sottorete, in quanto si riferisce collettivamente a TUTTI i computer della LAN. Ad esempio, una network mask pari a 255.255.252.0, lunga 22 bit, una volta applicata ad un indirizzo del tipo 192.168.121.10, fornisce un indirizzo di sottorete pari a 192.168.120.0/22, in quanto:

Indirizzo IP/maschera 192.168.121.10/22 solo i primi 22 bit identificano la LAN
IP in binario 11000000.10101000.01111001.00001010 tutti e 32 i bit sono l'indirizzo completo
parte sottorete 11000000.10101000.01111000.00000000 costituita dai primi 22 bit
indirizzo di sottorete 192.168.120.0/22 i bit oltre il prefisso sono posti a zero

L'indirizzo di sottorete così ottenuto identifica un sottoinsieme di indirizzi IP contigui, che nell'esempio sono tutti gli indirizzi tali che, ponendo a zero gli ultimi 32-22=10 bit, equivalgono all'indirizzo 192.168.120.0. Questo insieme può essere partizionato in ulteriori sotto-reti, adottando una maschera più lunga. Ad esempio, i computer con indirizzo IP 192.168.120.X, appartengono alla sottorete 192.168.120.0/24, contenuta dentro a quella con maschera /22. In particolare, la sottorete con maschera di ventidue bit (/22), contiene al suo interno le quattro LAN con maschera a 24 bit, ed indirizzo di sottorete 192.168.120.0/24, 192.168.121.0/24, 192.168.122.0/24, 192.168.123.0/24.

Domanda: Si, ma come fa il mittente a capire che il destinatario è nella sua stessa sottorete ?

Risposta: Mette in AND l'indirizzo IP di destinazione con la Network Mask, e confronta il risultato con l'AND del proprio indirizzo, per la stessa maschera. Se i risultati coincidono, gli indirizzi appartengono alla stessa LAN

Esempio: 192.168.121.32 e 192.168.122.45, messi in AND ad una maschera di lunghezza 22 bit, forniscono lo stesso risultato, ovvero 192.168.120.0. Morale, tutti i computer della stessa LAN, devono utilizzare la stessa Network Mask!! Altrimenti, pur potendo comunicare tra loro in modo diretto, necessiterebbero della presenza di un router.

Classi di indirizzi IP

Fino al 1993 la maschera di sottorete poteva avere una lunghezza solamente pari a 8, 16 o 24 bit, individuando le cosiddette sottoreti in classe A, B e C corrispondenti ai lotti di indirizzi che vengono assegnati dai RIR agli ISP. Questa suddivisione rigida determinò notevoli inefficienze nell'utilizzo effettivo delle assegnazioni, ma l'evoluzione delle capacità di calcolo dei router permisero di adottare le maschere di sottorete di dimensione qualsiasi prima definite, e note con il nome di CIDR (Classless Interdomain Routing).

Router e tabelle di routing

La funzione di instradamento IP espletata da un router si basa sull'analisi di apposite tabelle, per ogni linea delle quali è indicata l'interfaccia da usare per raggiungere una determinata sottorete. Un router ha almeno due interfacce di rete, appartenenti a due LAN (o sottoreti) diverse, ed opera sui pacchetti scapsulandoli fino al livello di rete, ed esaminando l'indirizzo IP di destinazione. Quindi, per ogni linea contenuta nella tabella di instradamento, l'IP di destinazione viene messo in AND con la relativa maschera di sottorete, e verificato se appartiene o meno alla sottorete associata. Al termine di questo processo, nel caso si sia verificato più di un successo, viene applicata la regola del longest prefix match, selezionando tra i successi quello relativo alla riga con il prefisso più lungo, e quindi più specifico, ed il pacchetto è inviato sull'interfaccia associata a tale riga. Nel caso invece in cui non si verifichi nessuna corrispondenza, il pacchetto viene scartato, ed il router genera un pacchetto ICMP Network Unreachable, diretto verso l'IP mittente del pacchetto scartato. Alternativamente, il router può essere impostato per inviare i pacchetti diretti a sottoreti assenti dalle tabelle di instradamento verso un Default Gateway.

Ad esempio, nel caso (#2), l'host mittente LH4 si avvede che il destinatario LS1 ha un IP che appartiene ad una diversa sottorete, e spedisce il pacchetto usando l'indirizzo MAC del proprio Default Gateway R2. Questo, anzichè reindirizzare il pacchetto verso R1 e di lì verso Internet, lo inoltra correttamente sull'interfaccia che collega LS1.

Qui sotto, è mostrato un esempio di come potrebbero apparire le tabelle di instradamento IP, per i router che interconnettono quattro diverse LAN. Per i diversi indirizzi di sottorete, è indicato il router da utilizzare per raggiungerla.

Le tabelle di instradamento dei router sono popolate a seguito di continue comunicazioni con gli altri router di Internet. Nel caso di esempio della figura soprastante, R1 annuncia ad R2, R3 e R4 la raggiungibilità della rete 11.0.0.0/8, provocando in questi l'inserimento dell'informazione che per raggiunere quella rete, occorre consegnare il pacchetto a R1. Quando R4 annuncia la sua raggiungibilità per la rete 14.0.0.0/8, questo annuncio viene ri-propagato da R1, in modo che la rete 14 risulti raggiungibuile per il suo tramite. Quindi, in termini semplificati, ogni router annuncia a quelli a lui collegati, quali sottoreti può raggiungere, che così diventano raggiungibili anche da questi secondi router, che a loro volta, propagano l'annuncio, assumendosi l'incarico dell'inoltro.

Il compito dei protocolli di routing è quello di coordinare questo processo, rendendolo efficiente, convergente, e pronto a recepire i cambiamenti di configurazione.

Nel caso in cui un router si accorga di conoscere gli istradamenti per tutte le sottoreti contenute sotto una stessa network mask più corta, può legittimamente aggregare gli instradamenti, ed annunciare la raggiungibilità dell'unica sottorete più grande. Ad esempio, un router che avesse accesso alle reti 192.168.120.0/24, 192.168.121.0/24, 192.168.122.0/24, 192.168.123.0/24, annuncerà la raggiungibilità per la sola rete 192.168.120.0/22, che le racchiude tutte e quattro. In tal modo, si ottiene il risultato di semplificare le tabelle di instradameno per i router più interni di Internet.

Sistemi autonomi

Un Sistema Autonomo (AS) è un insieme di LAN, interconnesse da router, che intendono apparire al resto di Internet come una unica entità, come ad esempio è il caso di un ISP, o di una azienda. Per questo, un sistema autonomo si interconnette con gli altri solo mediante alcuni dei suoi router, che annunciano all'esterno la raggiungibilità delle LAN interne. I protocolli di routing eseguiti all'interno ed all'esterno sono diversi, e prendono rispettivamente il nome di Interior ed Exterior routing protocols; in pratica, il protocollo di comunicazione ufficiale tra router di diversi AS, è il Border Gateway Protocol (BGP).

Interconnessione tra AS

I router che eseguono il BGP mantengono aperta una connessione TCP con gli omologhi degli AS adiacenti, detti peer (o pari), su cui scambiarsi le informazioni di raggiungibilità. La figura a lato permette di classificare gli AS in base al ruolo che svolgono nei confronti dei propri pari, ovvero in base all'insieme dei prefissi di rete che l'uno dichiara raggiungibili all'altro.

Un customer (cliente) che ha una sola fonte di connettività viene detto single homed, e quando ciò è vero per un sistema autonomo (ad es. AS6) questo è detto stub. Un AS con più connessioni è detto multihomed, e può limitarsi ad usarle per scambiare solo il traffico che ha origine e termina nei due AS adiacenti, ed in quel caso la relazione è di puro peering, come ad esempio tra AS5 ed AS3, o AS2. Oppure, uno dei due AS può scegliere di annunciare all'altro anche i prefissi IP che sono stati ricevuti da parte di un AS terzo, che in tal caso usufruisce di un servizio di transito. Mentre nel peering è molto raro che una parte paghi qualcosa all'altra, il servizio di transito è invece spesso tariffato, ed in questo modo è anche possibile acquistare la connettività verso il resto di Internet, offerta da una delle cosiddette reti Tier-1, ossia da quei AS che possono raggiungere tutti gli altri senza acquistare servizi di transito.

Peering

Sebbene siamo possibili collegamenti dedicati tra coppie di peer, è consuetudine molto comune appoggiarsi a strutture note come Internet eXchange Point (o IPX), presso cui i diversi AS realizzano un collegamento, e stabilire una relazione di scambio con gli altri AS li connessi.

RIP

Acronimo di Routing Information Protocol e normato dalla RFC 2453, è usato prevalentemente come protocollo interno, ed anche se gravato di una lenta convergenza, viene ancora usato nelle reti di piccole dimensioni, ed è largamente diffuso. Realizza un versione distribuita dell'algoritmo di Bellman-Ford per trovare i percorsi di minimo costo all'interno di un grafo valutato, mediante la trasmissione periodica da parte di ciascun router, verso i suoi vicini, di una lista di vettori di distanza relativi a tutte le destinazioni di cui conosce la raggiungibilità. Il vettore di distanza è composto dalla terna (destinazione, costo, tramite) in cui destinazione è un prefisso di sottorete, tramite è l'indirizzo IP del computer che annuncia il vettore di distanza, e costo rappresenta il numero di router da attraversare (detti anche hop, o salti) per raggiungere destinazione a partire da tramite. Ad esempio, una sottorete connessa direttamente viene annunciata come raggiungibile con costo nullo, ed un router appena acceso conosce (e dirama) solo queste informazioni; man mano che la sua tabella di routing si popola di nuove informazioni di raggiungibilità, anche queste vengono ritrasmesse ai suoi vicini.

Quando un router riceve una tabella di vettori di distanza, aggiorna la propria tabella di routing in accordo allo schema

per ogni destinazione presente nella tabella ricevuta
  incrementa di uno il valore del costo dell'instradamento
  se la propria tabella di routing non conosce come raggiungere la destinazione
    aggiungi una linea nella tabella di routing con il costo ed il tramite
  altrimenti (la destinazione è già raggiungibile)
    se la tabella di routing usa lo stesso tramite per quella destinazione
      sostituisci il costo dell'instradamento con il nuovo valore ricevuto
    altrimenti (la dest è raggiungibile ma il tramite è diverso)
      se il costo è inferiore a quello noto
        sostituisci sia il costo che il tramite per quella destinazione

il cui esito è esemplificato dalla figura seguente:

Si può dimostrare che in tal modo, dopo un certo numero di iterazioni, il risultato è equivalente a quello ottenibile applicando l'algoritmo di Bellman-Ford ad un grafo  con costi non negativi, algoritmo che possiamo descrivere come

BELLMAN-FORD(G, w, s)         ; Given a graph G, a weight function w, and a source node s
                              ; G provides a set of vertex V[G] and a set of edges (u,v) in E[G]
for each vertex v in V[G]     ; for every node v in G
  d[v] := inf                 ; set distance to v to a large number
  p[v] := nil                 ; set parent of v to nil
d[s] := 0                     ; set the source's distance to itself to 0
for each vertex v in V[G]              ; for every node v in G
  for each edge (u,v) in the set E[G]  ; for all the edges toward v
    if d[v] > d[u] + w(u, v)  ; if the distance to a node can be updated
      d[v] := d[u] + w(u, v)  ; update the v's distance
      p[v] := u               ; update the v's parent

In cui p[v] è usato iterativamente per ricostruire il percorso di minimo costo da s a v, e d[v] memorizza tale costo minimo.

Split orizon

La necessità per i router di annunciare ciclicamente le proprie tabelle di vettori di distanza causa sia un lieve aumento del traffico di rete, sia una lentezza di convergenza; e tanti più router partecipano al protocollo, più questo problema si può aggravare. Per questo motivo, si è scelto di porre pari a 16 il costo associato ad infinito, assegnato a destinazioni non più raggiungibili, limitando così a 15 router intermedi il diametro massimo dello stesso dominio di RIP. Consideriamo ora il caso mostrato in figura, in cui RouterA perde la connettività con la Rete1: assegnando all'instradamento relativo un costo di 16, dovrebbe riuscire a convincere gli altri a rinunciare ad inoltrare a lui i pacchetti per la stessa. Ma prima che faccia in tempo ad annunciare il nuovo vettore di distanza, RouterB lo precede dichiarando di poter raggiungere Rete1 con due salti. RouterA a questo punto non può sapere che RouterB confida proprio in lui, e felicemente rimpiazza il costo per Rete1 ponendolo pari a 3. Ma... dato che chi la fa l'aspetti, al passo successivo sarà RouterA ad avvelenare le informazioni di instradamento, convincendo RouterB che Rete1 si trova a distanza... 4 salti. Dopo un pò (quanto? beh basta contare fino ad infinito!), il costo di Rete1 sarà giunto a 16 per tutti, e finalmente più nessuno tenterà di raggiungerla.

Una soluzione piuttosto semplice al problema esposto è detta split orizon, che prescrive per ciascun router di omettere di comunicare ad ogni specifico vicino gli instradamenti appresi proprio da quel vicino, evitando così di trarre in inganno chi è meglio informato. Per accellerare la convergenza, a spese di un maggior traffico di rete, la variante poison reverse prescrive di annunciare l'instradamento anche al router da cui lo si è appreso, ma con costo 16.

Notiamo ora che il metodo descritto è in grado di impedire il conto fino ad infinito per coppie di router, mentre non rompe il loop che potrebbe crearsi tra tre o più router, almeno finché appunto il costo dell'instradamento non raggiunga il valore di 16 per tutti. Allo scopo di accellerare il processo, la tecnica dei triggered update prevede di inviare delle notifiche non appena le informazione di raggiungibilità cambiano.

Infine, il protocollo RIP prevede l'uso di timers sia per definire l'intervallo dei messaggi emessi (30 sec), sia per rimuovere gli istradamenti per i quali non si sono più ricevuti aggiornamenti per più di 3 minuti.

Indirizzi privati e NAT

Ad un certo punto dello sviluppo di Internet, sembrava quasi che gli indirizzi IP stessero per esaurirsi di lì a poco. Vennero prese una serie di contromisure, e si iniziò a fare un uso molto diffuso delle classi di indirizzi privati. Si tratta di sottoreti che i router di Internet rifiutano di inoltrare, e che quindi ognuno può usare nel suo privato, per creare una LAN irraggiungibile da Internet.

Le classi di indirizzi privati sono descritte dagli indirizzi di sottorete 10.0.0.0/8, 172.16.0.0/12, e 192.168.0.0/16. Tutti gli altri indirizzi (con le dovute eccezioni), sono per contro detti pubblici.
 
D'altra parte, anche se i computer dotati di un IP privato possono comunque inviare pacchetti diretti verso indirizzi di destinazione pubblici, ed in questo senso uscire su Internet, per poter ricevere pacchetti di risposta, occorre che adottino un indirizzo IP mittente anch'esso pubblico: questo è appunto il ruolo svolto dal NAT (Network Address Translator), che altro non è che un router R potenziato, che si affaccia sia sulla Internet pubblica (dove è raggiungibile con un IP pubblico), sia sulla LAN privata, per la quale svolge il ruolo di Default Gateway. La sua particolarità è che, oltre ad instradare i pacchetti, ne modifica gli indirizzi.

Ad esempio nel caso del Source NAT, l'IP privato di un computer sorgente A viene sostituito con quello (pubblico) del NAT, ed al posto dell'indirizzo di trasporto originario, ossia della porta presso la quale A desidera ricevere risposta, se ne inserisce un altro scelto sempre dal NAT. A questo punto, il destinatario con IP pubblico B crede di stare parlando con il router R, anzichè con il computer A dotato di IP privato. Quando torna un pacchetto di risposta, il NAT si avvede che la porta di trasporto di destinazione è una di quelle scelte da lui, e ne usa il valore (che ha memorizzato) per ritrovare l'indirizzo IP e la porta originariamente usate dal computer A con IP privato, sostituisce questi valori a quelli presenti nel pacchetto di risposta, e finalmente lo consegna al mittente originario.

Il principale svantaggio di un NAT, è che i computer con IP privato possono assumere solamente il ruolo di Client, ma non di Server, dato che non possono ospitare servizi raggiungibili dall'esterno, ovvero per i quali i pacchetti devono entrare prima di uscire. A meno di non configurare il NAT in modo da redirigere i pacchetti entranti ed indirizzati all'IP pubblico del NAT, verso un computer ben preciso della rete privata, come nel caso di una DMZ casalinga. Altrimenti, è possibile inviare il traffico entrante verso IP privati differenti, scelti in base all'indirizzo di trasporto verso cui sono indirizzati, realizzando così un Port Forwarding.

In un capitolo successivo, è riportata una classificazione più approfondita sui diversi tipi di NAT.

Altri indirizzi particolari

Oltre alle classi di IP privati, sono state definite ulteriori convenzioni per scopi particolari. Alcuni indirizzi speciali hanno un significato nell'ambito di uno specifico computer, o della LAN di cui fa parte:

Indirizzo Utilizzo
127.0.0.0/8 Tutti gli indirizzi che ricadono in questo prefisso sono chiamati localhost, corrispondono al computer stesso, e sono associati all'interfaccia lo. Se usato come indirizzo di destinazione, il pacchetto non abbandona il computer, ed il kernel lo pone in ingresso alla interfaccia lo. Un programma che si pone in ascolto su uno di questi indirizzi, riceve i pacchetti inviati da un diverso programma in esecuzione sullo stesso computer.
0.0.0.0/0 Come il precedente, identifica il proprio computer, ma viene usato da una applicazione eseguita su di un computer connesso a più LAN, e che non voglia fare distinzioni su come i pacchetti siano arrivati. Infatti, una maschera di sottorete di lunghezza nulla determina la corrispondenza per qualsiasi indirizzo IP. Per questo, non può essere usato nelle tabelle di routing, se non per selezionare il default gateway.
prefisso di sottorete usato come indirizzo singolo
  • Se ad esempio la LAN di cui il computer fa parte è rappresentata come 192.168.120.0/22, allora il singolo indirizzo 192.168.120.0 ottenuto concatenando al prefisso (nell'esempio di 22 bit) tutti zeri (nell'esempio 10 zeri) rappresenta ciascun computer della LAN, nel senso che per ognuno di essi indica sé stesso nella sottorete indicata; pertanto, non può essere usato come indirizzo di destinazione;
  • Se invece l'estensione del prefisso è realizzata usando tutti uni, ovvero ad es. fornendo la stringa binaria 11000000.10101000.01111011.11111111, corrispondente a 192.168.123.255, l'indirizzo ottenuto può essere usato come destinazione per raggiungere collettivamente tutti i computer della stessa LAN, realizzando il cosiddetto indirizzamento broadcast
255.255.255.255 Anche in questo caso si tratta di un indirizzo broadcast, che a differenza del precedente non tiene conto della LAN in cui ci si trova, ma per il quale tutti i computer vi si riconoscono comunque. D'altra parte, i pacchetti con questo IP come destinazione non sono inoltrati dai router, e dunque restano confinati alla LAN da cui hanno origine.
169.254.0.0/16 Indirizzi locali alla LAN usati per l'autoconfigurazione dinamica
224.0.0.0/4 Tutti gli indirizzi che iniziano (in binario) con 1110 corrispondono ad indirizzi multicast. Quando usati come indirizzi di destinazione, (in teoria) tutti i router di Internet inoltrano i pacchetti verso tutte le destinazioni presso le quali qualche programma ha aperto un socket utilizzando lo stesso indirizzo multicast.

Al prossimo capitolo sono forniti alcuni esempi di utilizzo.

ICMP

Esponiamo ora la funzione di un protocollo (ICMP) già comparso nella figura sul TCP/IP, dove è evidenziato come, sebbene le sue PDU siano incapsulate dentro IP, queste non vengano consegnate allo strato di trasporto, ma siano invece elaborate all'interno dello strato di rete. L'ICMP (Internet Control Message Protocol) ha lo scopo di veicolare informazioni relative al corretto funzionamento della rete, e può seguire sia un protocollo di richiesta-risposta, sia avere una semplice funzione di indicazione non sollecitata, qualora debba segnalare problemi relativi ad un pacchetto IP in transito. In quel caso, l'applicazione che ha generato il pacchetto IP originario, può essere notificata dell'evento.

Come mostrato in figura, l'intestazione minima di ICMP si compone di una sola parola di 32 bit, di cui i primi 8 contengono un codice (type) che qualifica la funzione del pacchetto, ed i secondi otto (code) possono contenere un sotto-tipo. A seconda del tipo, possono poi essere presenti altre parole di intestazione. Ecco alcuni dei tipi pù frequenti:

Echo

Come esempi applicativi, il caso più noto è quello associato all'uso del comando ping (vedi anche le esercitazioni), impiegato per verificare la connettività con un altro computer, inviando un pacchetto ICMP di tipo Echo request. Il computer di destinazione, se operativo ed effettivamente raggiunto, risponde con un pacchetto ICMP di tipo Echo reply, al che il comando ping in esecuzione sul primo computer, scrive a video il tempo intercorso tra andata e ritorno, o Round Trip Time (RTT). Il ciclo si ripete all'infinito, e viene interrotto premendo control-c, al che il ping stampa delle statistiche sui tempi rilevati, e termina.

Nel caso in cui il computer di destinazione (od una applicazione che dovrebbe essere in ascolto su di una porta di trasporto) non possa essere raggiunto (dal paccheto ICMP di tipo Echo request, o da qualunque altro pacchetto IP), i router di transito, od il computer di destinazione, possono generare un pacchetto ICMP di tipo 3 - Destinazione irraggiungibile, il cui campo code contiene un valore che indica il possibile motivo della irraggiungibiità, come ad esempio

Code Description
0 Network unreachable error.
1 Host unreachable error.
3 Port unreachable error (the designated protocol is unable to inform the host of the incoming message).
4 The datagram is too big. Packet fragmentation is required but the 'don't fragment' (DF) flag is on.
13 Communication administratively prohibited (administrative filtering prevents packet from being forwarded).

in cui i codici Network e Host unreachable sono generati dal router che dovrebbe consegnare il pacchetto, Port unreachable è prodotto dall'host di destinazione, quando sul numero di porta di destinazione non è in ascolto nessun processo, mentre i codici Fragmentation Required e Communication administratively prohibited, sono generati dai router di transito, nei casi in cui rispettivamente sarebbe richiesta la frammentazione del pacchetto, ma è settato il bit "don't fragment", oppure sia presente un firewall che impedisce il transito di un pacchetto per quella destinazione.

In tutti i casi, il pacchetto ICMP di ritorno viene assemblato a partire da quello (IP) di andata, come mostrato in figura. In particolare, l'intestazione IP ricevuta, ed i primi 8 byte di ciò che segue (es TCP), viene prefissa dalla intestazione ICMP, che è poi ulteriormente prefissa dalla intestazione IP che serve a recapitare il pacchetto all'indietro. In questo modo, il mittente originario ha tutti gli estremi per ri-associare il messaggio ICMP alla connessione uscente che ha prodotto il pacchetto IP originario.

Traceroute

Il tipo Time Exceeded è sfruttato dalla utility traceroute (vedi esercitazione), che invia verso la destinazione un pacchetto con un valore di TTL IP particolarmente basso. Quando questo si azzera, il router lo scarta, ed invia all'indietro, appunto, un pacchetto ICMP Time Exceeded. Quindi, traceroute incrementa il TTL, allo scopo di scoprire il prossimo router che scarterà il pacchetto, finché questo non arriva a destinazione. Per una descrizione approfondita, vedere [NG4].

Path MTU discovery

Infine, il tipo Destinazione irraggiungibile, codice Fragmentation Required, viene usato nell'ambito di una procedura chiamata path MTU discovery, volta a determinare qual'è la dimensione massima di pacchetto che può essere inviata, senza che questo debba essere frammentato. In questo caso, prima di iniziare il collegamento, il computer sorgente invia verso la destinazione dei pacchetti IP grandi con il bit don't fragment settato, e se il pacchetto arriva a destinazione, tutto è filato liscio. Viceversa, se il pacchetto incontra sezioni della rete che devono causare frammentazione, viene generato appunto il messaggio ICMP Destination unreachable, fragmentation required, ed il mittente capisce che deve ridurre la dimensione di pacchetto; ripete quindi la procedura con il pacchetto ridotto, finchè non va.

Frammentazione di pacchetto e riassemblaggio

Sviluppiamo ora un esempio pratico relativo a ciò che accade nel caso di frammentazione IP. L'host source ha pronto un pacchetto IP di 7000 Bytes, completo delle intestazioni di trasporto. Per arrivare all'host destinazione, il pacchetto dovrà attraversare due reti eterogenee, una con architettura Token Ring, ed una seconda Ethernet. Queste due reti, impongono una dimensione massima (Maximum Transfer Unit MTU) alle trame di strato fisico, rispettivamente di 4000 e di 1500 Bytes.
Considerando che lo strato IP, di suo, aggiunge una intestazione di 20 Byte, si ottiene una dimensione massima dei frammenti pari a 4000 - 20 = 3980 per la prima tratta, e 1500 - 20 = 1480 per la seconda. Però, come precedentemente illustrato, il campo "fragment offset" presente nella intestazione IP individua la posizione di ogni frammento in modo per così dire quantizzato come multiplo di 8 Byte, e pertanto, la dimensione dei frammenti (eccetto l'ultimo) è vincolata ad essere divisibile per 8. Fortunatamente, 1480 è proprio multiplo di 8 (8 * 185 = 1480), mentre per la sezione Token Ring, occorre ridurre la dimensione del frammento rispetto alla massima, a 3976 (= 496 * 8).

E così, i 7000 bytes originari, si suddividono in due pacchetti di 3976 e 3024 byte. Quando questi giungono alla sezione Ethernet, vengono frammentati ulteriormente, ed in particolare, il primo (da 3976) ne genera 3 (2 da 1480 ed uno da 1016 bytes), ed il secondo (da 3024) altri tre (2 da 1480 ed uno da 64 bytes). Nelle tabelle (b) e (c), si evidenziano i contenuti più rilevanti delle intestazioni IP per la prima e la seconda tratta, mostrando come il campo identificazione sia lo stesso per tutti, così come la lunghezza totale, in modo che il ricevente sia in grado di riassemblare il pacchetto. Inoltre, il bit more fragments è sempre settato, tranne che per l'ultimo. Infine, notiamo come il fragment offset (da moltiplicare per 8 per avere la reale posizione) del (iv) pacchetto della tratta Ethernet, sia esattamente uguale a quello del (ii) pacchetto della sezione Token Ring.

Svolgiamo ora la considerazione che, in caso di mancata consegna anche di uno solo dei frammenti a destinazione, il pacchetto non può essere riassemblato per intero, ed allo scadere di un timeout, lo strato di trasporto dell'host sorgente sarà obbligato alla ritrasmissione dell'intero pacchetto originario da 7000 bytes. Pertanto, si preferisce evitare l'insorgenza di frammentazione di pacchetto, affidarsi a tecniche come la Path MTU discovery prima illustrata, o forzare il non superamento di una MTU massima presso il computer mittente.

Rete locale: strato di collegamento

Soffermiamoci ora su ciò che accade al di quà del Default Gateway.

Intestazione Ethernet

Quando l'indirizzo IP di destinazione ricade nella stessa sottorete (LAN) del mittente (o del router che lo inoltra), i due computer (oppure computer e Default Gateway) possono comunicare direttamente, purché chi vuol trasmettere, riesca a conoscere l'indirizzo fisico (o Ethernet, o MAC) del destinatario. In tal caso, lo strato MAC Ethernet definito dall'IEEE 802.3, incapsula la PDU proveniente dal Logical Link Control (LLC) definito dall'IEEE 802.2 (che a sua volta contiene il pacchetto IP) in accordo ad un formato di trama Ethernet II (detto anche DIX) mostrato appresso.

Nel campo Type è presente un codice a 16 bit che indica il protocollo incapsulato (ad es. 0x0800 per IPv4), mentre nei campi indirizzo sorgente e destinazione, trovano posto gli indirizzi Ethernet (di 6 bytes ognuno) delle interfacce di rete agli estremi del collegamento. La parte disegnata in rosa, rappresenta il preambolo necessario al ricevitore per acquisire i sincronismi di trasmissione, seguito da un codice Start Frame Delimiter che segnala l'inizio della intestazione Ethernet. Infine, il Frame Check Sequence (FCS) è un ulteriore checksum che permette di verificare l'integrità della trama.

Quando un computer della LAN osserva transitare sull'interfaccia di rete un pacchetto che riporta il suo indirizzo Ethernet nel campo destinazione, lo "tira su", e lo passa agli strati superiori.

Domanda: Come fa il mittente a conoscere l'indirizzo Ethernet del destinatario, di cui conosce l'indirizzo IP??
Risposta: per mezzo dell'Address Resolution Protocol (ARP)

Risoluzione ARP, broadcast

I pacchetti ARP sono anch'essi incapsulati nelle trame ethernet, in cui ora il campo type ha il valore 0x0806. La figura seguente mostra l'ordine temporale con cui opera l'ARP, nel caso in cui Host A voglia comunicare con Host B, trovandosi entrambi nella stessa LAN.

Ogni computer mantiene una cache (1) delle risoluzioni (gli indirizzi MAC associati agli IP) già ottenute di recente, in modo da evitare il ricorso ad ARP ogni volta. Le corrispondenze della cache sono mantenute per un periodo breve, (es 10 minuti), e possono essere visualizzate con il comando
arp -a.

La richiesta ARP (2) è inviata in broadcast, un pò come se qualcuno si affacciasse in corridoio, e gridasse: chi ha questo IP ? Ciò si ottiene indirizzando la richiesta ARP verso un indirizzo Ethernet di destinazione, pari ad una sequenza di uni. Le interfacce di rete di tutti i computer della LAN, quando osservano transitare un pacchetto Broadcast, sono obbligate a riceverlo, e passarlo allo strato superiore, che valuta le eventuali azioni da intraprendere. Host B quindi, dopo aver verificato che il proprio IP è proprio quello richiesto, invia la sua risposta ARP (4) in unicast, ossia usando l'indirizzo Ethernet di Host A come destinazione, comunicando così il proprio indirizzo MAC, usato come mittente.

Possiamo osservare ciò che si verifica effettivamente, analizzando il risultato di questo capture prodotto con il comando ping www.libero.it, eseguito sul computer 192.168.120.40, avendo impostato il Default Gateway verso 192.168.120.1, che ospita anche il DNS locale.

No Time   Source            Destination    Protocol Info
------------------------------------------------------------------------------------------------
 1 0.0000 Intel_54:3b:a5    Broadcast         ARP   Who has 192.168.120.1? Tell 192.168.120.40
 2 0.0011 Asiarock_5d:78:5d Intel_54:3b:a5    ARP   192.168.120.1 is at 00:13:8f:5d:78:5d
 3 0.0012 192.168.120.40    192.168.120.1     DNS   Standard query A www.libero.it
 4 0.1048 192.168.120.1     192.168.120.40    DNS   response CNAME vs-fe.iol.it A 195.210.91.83
 5 0.1052 192.168.120.40    195.210.91.83     ICMP  Echo (ping) request
 6 0.1316 195.210.91.83     192.168.120.40    ICMP  Echo (ping) reply
 7 0.1362 192.168.120.40    192.168.120.1     DNS   query PTR 83.91.210.195.in-addr.arpa
 8 0.3933 192.168.120.1     192.168.120.40    DNS   Standard query response PTR vs-fe.iol.it
 9 1.1042 192.168.120.40    195.210.91.83     ICMP  Echo (ping) request
10 1.1300 195.210.91.83     192.168.120.40    ICMP  Echo (ping) reply
11 1.1302 192.168.120.40    192.168.120.1     DNS   query PTR 83.91.210.195.in-addr.arpa
12 1.1313 192.168.120.1     192.168.120.40    DNS   Standard query response PTR vs-fe.iol.it
13 5.1036 Asiarock_5d:78:5d Intel_54:3b:a5    ARP   Who has 192.168.120.40? Tell 192.168.120.1
14 5.1036 Intel_54:3b:a5    Asiarock_5d:78:5d ARP   192.168.120.40 is at 00:16:6f:54:3b:a5

Innanzitutto, osserviamo (p 1-2) la richiesta-risposta ARP necessaria a determinare l'indirizzo Ethernet del DNS, in modo da poter inoltrare verso lo stesso, la richiesta (p 3-4) necessaria a risolvere il nome di dominio www.libero.it in un indirizzo IP. Poi (p 5-6) osserviamo la richiesta-risposta ICMP echo (notiamo come il DNS introduca una latenza di 100 msec, ed il ping solo di 30 msec), fatta passare attraverso il Default Gateway, seguita a sua volta (p. 7-8) da una richiesta di risoluzione inversa al DNS, eseguita allo scopo di poter scrivere a schermo il nome di dominio di chi ha risposto al ping; notiamo che stavolta, la latenza del DNS è di 200 msec. Dopo la seconda richiesta ICMP, osserviamo (p 11-12) una seconda richiesta di risoluzione inversa indirizzata al DNS, che stavolta viene servita in modo praticamente immediato, essendo la risposta già presente nella cache del DNS locale. Per finire, osserviamo (p. 13-14) una richiesta di risoluzione ARP, diretta stavolta dal Default Gateway verso il computer su cui stiamo operando, ed originata probabilmente dallo scadere della cache ARP del router.

Possiamo verificare come i pacchetti ARP siano privi di intestazione IP, essendo la loro circolazione esclusivamente interna alla rete locale. Notiamo infine, che l'assenza di un componente di autenticazione delle informazioni contenute nelle risposte ARP, costituisce una vulnerabilità per una rete LAN Switchata, che prende il nome di ARP poisoning.

Riassumendo

La figura seguente, illustra le fasi della risoluzione da URI a IP a MAC.

Bridge, Hub e switch

Il protocollo Ethernet originario prevedeva la trasmissione a 10 Mbit/sec mediante un cavo coassiale su cui si affacciavano tutti i computer; lo stesso mezzo trasmissivo veniva quindi usato "a turno" dai diversi computer, mediante ad una tecnica di accesso condiviso denominata Carrier Sense Multiple Access, Collision Detect (CSMA/CD), attuata dallo strato MAC 802.3, su cui non ci soffermiamo.

Per interconnettere tra loro due segmenti di LAN in modo che tutto il traffico presente su di un segmento sia replicato sull'altro, si utilizza un dispositivo detto Bridge, che nel caso in cui i segmenti da interconnettere sono più di due, prende il nome di Hub. D'altra parte, nel caso in cui non si desideri inoltrare inutilmente trame su segmenti presso i quali non è presente la destinazione, si preferisce eseguire l'interconnessione usando uno Switch.

Attualmente, oltre a prevedere velocità di trasmissione di 100 Mbit/sec, 1 Gbit/sec e 10 Gbit/sec, adottando due coppie ritorte, o la fibra ottica, i computer di una stessa LAN vengono sempre più spesso interconnessi secondo una topologia a stella, o ad albero, i cui nodi di transito sono denominati switch, ed i computer sono interconnessi su collegamenti full-duplex (es. 100BASE-TX), che cioè adottano due copie di conduttori, una per trasmettere ed una per ricevere.

Gli switch sono dotati di più porte, ognuna delle quali gestisce le comunicazioni con un diverso computer (oppure con un altro switch, od un router). A differenza di un Hub, lo Switch non ritrasmette su tutte le porte il traffico osservato su ciascuna di esse, ma opera un instradamento inoltrando le trame solo in direzione della destinazione indicata dall'indirizzo MAC. In questo modo, più computer di una stessa LAN possono trasmettere simultaneamente, senza interferenze reciproche, in quanto i domini di collisione restano separati per ognuna delle porte.

   

Apprendimento degli indirizzi

Lo switch non usa un proprio indirizzo Ethernet, ma instrada sulle porte in uscita le stesse identiche trame che riceve sulle porte in ingresso. Quando un computer connesso allo switch trasmette verso una destinazione per la quale lo switch non ha mai osservato traffico, le trame sono ritrasmesse su tutte le porte; d'altra parte, ogni switch attraversato prende nota dell'indirizzo Ethernet del mittente, e popola una propria tabella di instradamento, mettendo così in corrispondenza l'indirizzo con la porta di provenienza.

Da quel momento in poi, ogni volta che lo switch riceverà un pacchetto destinato ad un computer di cui conosce la porta di connessione, ritrasmetterà il pacchetto solo su quella porta, evitando di disturbare gli altri.

Allo scopo di accellerare il processo di apprendimento da parte dello switch, è possibile che all'accensione i computer inviino dei pacchetti ARP di annuncio, detti gratuitous ARP, in cui affermano l'indirizzo MAC di se stessi. In tal modo, comunicano allo switch il proprio indirizzo Ethernet; nel caso il computer abbia cambiato la porta di connessione, lo switch provvede anche ad aggiornare la tabella di instradamento.

Uno strumento per stimolare l'emissione di richieste ARP, è l'uso del comando ping, che invia un pacchetto ICMP (Internet Control message Protocol) di tipo Echo Request che, per raggiungere la destinazione, suscita appunto una richiesta ARP. Nel caso in cui questa non sia effettuata, è probabile che la risoluzione sia già stata acquista dal proprio computer, e salvata nella cache: questo può essere investigato, invocando il comando arp -a.

Router, NAT e Firewall

Come uno switch non modifica i contenuti delle trame che inoltra, così un router non modifica il contenuto dei pacchetti IP, mentre invece modifica l'intestazione di collegamento della trama che li incapsula, a seguito della risoluzione ARP, in modo da far comparire il nuovo indirizzo ethernet di destinazione. Alcuni router invece non si limitano a questo, ma prima leggono anche le informazioni presenti nella intestazione di trasporto, e quindi intraprendono delle decisioni in base alle regole con cui sono stati programmati. Nel caso dei NAT, come già discusso, sono modificati gli indirizzi di rete e di trasporto. Nel caso di un firewall, i pacchetti provenienti o destinati a determinati indirizzi (di rete e/o di trasporto) possono essere scartati, in modo da attuare un politica di controllo del traffico.

TCP e UDP: strato di trasporto

Come già specificato, lo strato di trasporto esiste solo nei terminali posti ai bordi della rete, sorgente e destinazione delle unità informative generate dai processi applicativi (AP). Il paradigma Internet prevede due modalità di trasporto, indicate come UDP e TCP, che si differenziano essenzialmente in quanto

Per meglio illustrare la semantica dei termini datagramma e circuito virtuale, e comprendere come lo strato di trasporto possa arricchire la modalità di trasferimento delle informazioni offerta dallo strato di rete, facciamo di nuovo un passo indietro.

Servizio con o senza connessione

Quando abbiamo definito la multiplazione statistica per un collegamento dati condiviso tra più comunicazioni, l'esempio mostrava solo un collegamento tra due nodi. Se invece mittente e destinatario sono collegati per il tramite di una rete, la trasmissione viene detta a commutazione di pacchetto, e sono definite due possibili diverse modalità di instradamento dei pacchetti da uno nodo di rete all'altro.

Datagramma

E' la modalità di instradamento già discussa a proposito della rete IP, in cui ogni pacchetto

In questo caso la trasmissione è detta senza connessione, a rimarcare il fatto che non esiste una fase iniziale, in cui si individua un unico instradamento, e si riservano delle risorse.

UDP

Lo User Datagram Protocol (UDP) non aggiunge nulla a questa impostazione, limitandosi in pratica a specificare le porte sorgente e destinazione: il risultato è che il servizio di trasporto offerto è detto anch'esso a datagramma, o senza connessione. Di lato è riportato uno schema della intestazione UDP, di soli 8 bytes.
bits 0 - 15 16 - 31
0 Source Port Destination Port
32 Length Checksum
64 Data

Canale virtuale e circuito virtuale

Un approccio del tutto diverso, è quello delle reti a commutazione di pacchetto a circuito virtuale, come la rete X.25, una architettura ormai praticamente abbandonata, con origini precedenti ad Internet; lo stesso concetto, è poi stato nuovamente applicato nell'ambito delle reti ATM ed MPLS. In questo caso, l'instradamento viene determinato una volta per tutte all'inizio della trasmissione, durante una fase di richiesta di connessione, la cui esistenza determina appunto la denominazione di servizio con connessione. Dopodiché, i pacchetti di uno stesso messaggio seguono tutti lo stesso percorso.
La commutazione di pacchetto a circuito virtuale si basa su di una intestazione di pacchetto che, anziché presentare l'indirizzo di rete del nodo di destinazione, contiene invece un identificativo di connessione, che individua un canale virtuale (CV) tra coppie di nodi di rete, determinandone l'appartenenza ad una delle diverse trasmissioni contemporaneamente in transito tra i due nodi. L'identificativo del CV presente nel pacchetto, funge da chiave di accesso alle tabelle di routing presenti nei nodi, tabelle che sono ora generate nella fase di richiesta di connessione iniziale, durante la quale vengono inviati dei pacchetti di controllo che contengono l'indirizzo di rete del nodo di destinazione, e che causano nei nodi attraversati la memorizzazioine della porta di uscita, che sarà la stessa per tutti i successivi pacchetti dati appartenenti ad uno stesso messaggio.

Facciamo un esempio: una sorgente, a seguito della fase di instradamento, invia i pacchetti con identificativo CV = 1 al nodo di commutazione a cui è collegato. Consultando la propria tabella, il nodo trova che il canale virtuale 1 sulla porta di ingresso (P.I.) A si connette al CV 3 sulla porta di uscita (P.U.) C. Ora i pacchetti escono da C con CV = 3, ed una volta giunti al nodo seguente sulla P.I. A, escono dalla P.U. B con CV = 2, e giungono finalmente a destinazione.

Nel collegamento tra due nodi, numeri di CV diversi identificano le diverse comunicazioni in transito, ed uno stesso numero di canale virtuale, può essere riutilizzato su porte differenti dello stesso nodo anche nel contesto di comunicazioni diverse. La concatenazione dei canali virtuali attraversati viene infine indicata con il termine Circuito Virtuale, per similitudine con il caso di commutazione di circuito: tale similitudine trae origine dal fatto che, essendo l'instradamento lo stesso per tutti i pacchetti, questi viaggiano per così dire in fila indiana, e sono consegnati nello stesso ordine con cui sono partiti, un pò come se si fosse tracciato un vero e proprio Circuito.

Arricchimento del servizio di rete

Anche se il TCP, essendo un protocollo di trasporto, non ha nulla a che fare con l'instradamento, il fatto che garantisca al ricevitore la consegna dei pacchetti nello stesso ordine con cui sono partiti, e che par fare questo, preveda una fase di setup precedente alla trasmissione vera e propria, gli vale il merito di estendere anche a questo caso il termine di protocollo con connessione, risolvendo così a livello di trasporto, il problema del corretto sequenziamento dei pacchetti instradati attraverso una rete (IP) a datagramma.

Controllo di sequenza, di errore, di flusso, e di congestione

Una serie di problemi legati alla inaffidabilità di una rete a datagramma, basata sulla multiplazione statistica, sulle code, e sulla variabilità dell'instradamento per i pacchetti di una stessa comunicazione, riguardano

Un elemento comune alla soluzione di questi problemi, è costituito dalla numerazione progressiva dei pacchetti spediti (il numero di sequenza), e da una serie di pacchetti di ritorno, chiamati riscontri (o ACKnoledgment), mediante i quali il ricevitore conferma la corretta ricezione. Questi elementi sono utilizzati nell'ambito dei protocolli riscontrati, detti anche protocolli Automatic Repeat reQuest (ARQ), basati sull'uso di una finestra scorrevole, e sviluppatisi per gestire la comunicazione diretta, a livello di collegamento, tra due entità, e poi ri-utilizzati anche da un estremo all'altro della rete, a livello di trasporto, come avviene per il TCP, oppure anche a livello applicativo, come devono essere pronte a fare le applicazioni che si avvalgono del trasporto UDP.

Osserviamo esplicitamente che il TCP non invia riscontri negativi, ma solo positivi. Infatti, nel caso di ricezione di un pacchetto corrotto, il comportamento del ricevitore è lo stesso che per un pacchetto perso, per il quale non viene inviato nessun riscontro. Al contrario, per ogni pacchetto (che nel contesto del trasporto TCP è chiamato segmento) ricevuto correttamente viene inviato un riscontro (ACK) positivo, in mancanza del quale, una volta scaduto un timeout, il mittente provvede a ritrasmettere il segmento.

Intestazione TCP

L'intestazione TCP ha anch'essa dimensioni minime di 20 byte, in cui troviamo, tra le altre cose


La dimensione minima della intestazione è di 5 gruppi di 4 bytes, ossia 20 bytes, a cui possono seguire delle opzioni, nel qual caso il campo Data Offset è usato per indicare la dimensione totale della intestazione come numero totale di gruppi di 4 byte. L'uso di alcune delle opzioni possibili sono commentate a proposito dell'esempio a fine capitolo.

Entità TCP

Nella figura che segue viene evidenziato come i processi applicativi che risiedono nello user space, accedano al servizio di trasporto offerto dagli strati inferiori che risiedono all'interno del kernel, per mezzo di primitive dette socket. Al suo interno, l'implementazione della entità di trasporto (in questo caso, il TCP) immagazzina i dati in transito da/verso lo strato applicativo nei send e receive buffer (SB e RB), le cui dimensioni dipendono dal sistema operativo, e dalla sua disponibilità di memoria.

L'entità trasmittente, per dialogare con lo strato IP (che gli permette di usufruire del servizio di rete), preleva i dati dal SB in unità chiamate segmenti, per depositarli in ulteriori memorie da cui vengono inoltrati alla strato IP, ma anche conservati in modo da poter ri-trasmettere gli eventuali pacchetti persi; l'entità ricevente invece, utilizza memorie simili per conservare i segmenti ricevuti dallo strato IP, in modo da poter sequenziare correttamente quelli ricevuti fuori sequenza, e quando ne completa una serie ordinata, li deposita nel RB, consentendo alla applicazione di prelevarli.

La dimensione dei segmenti che vengono passati allo strato IP, e che in figura sono rappresentati dalle linee impilate nelle memorie in basso, è detta Maximum Segment Size (MSS). Nel caso in cui lo strato fisico si interfacci con una LAN Ethernet, la massima dimensione del Payload della trama (ossia il pacchetto IP) è di 1500 bytes; pertanto in tal caso, tolti i 20 bytes della intestazione IP, ed i 20 bytes della intestazione TCP, restano 1500 - 40 = 1460 bytes per l'MSS. Adottare un MSS più grande, obbligherà lo strato di rete ad operare una frammentazione, con conseguente scadimento prestazionale; considerando poi che la presenza di opzioni negli header IP e TCP, ne può aumentare le dimensioni, può essere opportuno adottare un MMS inferiore a 1460 bytes.


Apertura connessione

Analizziamo più in dettaglio il comportamento del TCP in corrispondenza della fase di attivazione della connessione.

Come illustrato nella figura a fianco, il lato server (applicativo B) a seguito della
sequenza di system call socket(), bind(), listen(), accept(), effettua una cosiddetta apertura passiva, ed attende una richiesta di connessione. Il lato client (applicativo A), con la connect(), invia un primo segmento di sincronizzazione, con il flag SYN attivo, in cui comunica che intende iniziare a contare i byte trasmessi a partire da x (Numero di Sequenza NS=x). Il server risponde inviando il riscontro (flag ACK pari ad 1) del primo segmento ricevuto, in cui dichiara di essere in attesa di ricevere il byte x+1 (Numero di Riscontro NR=x+1); nello stesso segmento, sincronizza anche (NS=y) il numero di sequenza con cui conterà i dati inviati nelle risposte. A questo punto sembrerebbe tutto terminato, ma resta invece da riscontrare al server la ricezione del suo SYN, e questo avviene ad opera del terzo segmento. Questa modalità di sincronizzazione, prende il nome di stretta di mano a tre vie (three way handshake).

Protocollo a finestra

Illustriamo ora come i numeri di sequenza NS e di riscontro NR permettano la gestione dei buffer di uscita del TCP in accordo ad una procedura detta a finestra, che consente di svolgere le funzioni di controllo di errore, di flusso e di congestione.

La dimensione massima di Finestra è comunicata con il SYN inviato dal lato server, e determina la quantità di memoria riservata dal lato client per il buffer di uscita dedicato alla connessione; dato che il TCP è bidirezionale, la dimensione di finestra annunciata con il SYN del client, determina a sua volta la dimensione del buffer del server.

I buffer di uscita sono quindi gestiti come memorie a scorrimento, o finestra scorrevole, ed usati per memorizzare i segmenti già trasmessi, ed in attesa di riscontro. Man mano che altri segmenti vengono trasmessi, il limite superiore della finestra viene spostato a destra, finché questa non raggiunge la sua ampiezza massima, dopodichè la trasmissione si arresta. La ricezione di riscontri con NR maggiore del limite inferiore, causa lo spostamento di quest'ultimo a destra, riducendo di nuovo l'apertura della finestra,  permettendo così la trasmissione di nuovi pacchetti.

L'ampiezza massima della finestra di trasmissione è determinata come il minimo tra tre diversi criteri:

Una finestra simile è adottata anche dal lato ricevente del TCP, per ricostituire l'ordine originario dei pacchetti, che possono essere consegnati disordinatamente dallo strato IP di rete. Non appena il ricevente acquisisce un segmento contiguo al limite inferiore, lo trasferisce nel Receive Buffer, sposta il limite inferiore in avanti, di tanti byte quanti ne ha ricevuti in modo contiguo, ed invia un riscontro, con NR pari al più basso numero di byte che ancora non è pervenuto. Ma se il Receive Buffer non è stato ancora svuotato dallo strato applicativo, l'entità ricevente non può liberare la coda dei segmenti provenienti dallo strato di rete, e deve chiedere al trasmittente di azzerare l'ampiezza della sua finestra di trasmissione.

Controllo di errore

Trascorso un certo tempo (detto Re-transmission TimeOut o RTO) nell'attesa di un riscontro, il trasmittente ritiene che il segmento (o il suo riscontro) sia andato perso (e non semplicemente ritardato), e lo re-invia. Il valore del timeout viene impostato dinamicamente dal TCP in base alle sue misure di round-trip time RTT, stimato come media del ritardo R con cui tornano gli ACK, ed a cui viene aggiunto un margine pari a quattro volte la stima della deviazione dei ritardi rispetto all'RTT, in modo che l'RTO è posto pari a

RTO = RTT + 4D in cui RTT = a*RTT + (1-a)*R e D = a*D + (1-a)*|RTT - R|

dove a = 0.9 rappresenta il coefficente del filtro passa-basso IIR di primo ordine, che esegue lo smoothing delle sequenze di osservazione. Così, il TCP si adatta alle condizioni di carico della rete, ed evita di ri-spedire segmenti troppo presto, o di attendere più del necessario. In particolare, nel caso di rete congestionata, sia il ritardo degli ACK che la frequenza dei pacchetti persi aumentano, e valori di timeout troppo ridotti potrebbero peggiorare la situazione.

Una diversa causa di ritrasmissione si verifica quando la mancata ricezione di un riscontro è dovuta alla perdita di un segmento in andata (anziché del suo ACK), mentre invece i segmenti successivi sono consegnati correttamente: in tal caso il ricevente continua a citare, nei suoi ACK, sempre il numero di sequenza che indica il byte iniziale del segmento mancante. La ricezione di tre ACK consecutivi fuori sequenza causa nel mittente il convincimento che effettivamente un segmento sia andato perso (e non solo ritardato), ma dato che almeno tre segmenti successivi sono invece stati ricevuti correttamente, re-invia fiducioso il segmento perso, anche se l'RTO non è ancora scaduto (o spirato).

La figura seguente (tratta ancora da MMC) esemplifica la procedura di controllo di errore, nel caso in cui

Analizziamo ora ciò che accade:

Controllo di flusso

Nell'esempio precedente non si è tenuto conto di alcuna finestra, ovvero la stessa è stata supposta di dimensioni sufficientemente grandi, da non modificare il ritmo di invio dei segmenti. Ma come abbiamo detto, il meccanismo a finestra scorrevole determina, istante per istante, il numero massimo di bytes che possono essere trasmessi consecutivamente verso il destinatario senza ricevere riscontri, e consente ad un nodo poco veloce nella gestione dei segmenti ricevuti, di adeguare la velocità di tramissione alle proprie capacità. Infatti, il ricevente può variare la dimensione della finestra di trasmissione nel corso della connessione, impostando il valore del campo Finestra che compare nella intestazione TCP dei pacchetti inviati in occasione degli ACK.

L'esempio che segue

La precedente figura può essere così commentata:

Quanto illustrato è solo un esempio, dato che le diverse implementazioni del TCP possono, ad esempio, inviare un ACK per ogni segmento, o per ogni due, o più; ma fintantoché la dimensione del buffer di ricezione del TCP non supera quella del proprio RB, la procedura basata sull'aggiornamento della finestra del trasmettitore assicura che al ricevitore ci sia sempre uno spazio sufficiente per memorizzare tutti i segmenti ricevuti.

Controllo di congestione

Durante il transitorio iniziale della comunicazione, in cui la stima di RTT non è ancora consolidata, la trasmissione inizia con una dimensione di finestra ridotta, che viene poi aumentata nel caso in cui non si verifichino errori, la rete sopporti il traffico, ed i nodi abbiano memoria disponibile. La figura che segue illustra l'evoluzione temporale dell'ampiezza della finestra di trasmissione, come conseguenza della strategia di controllo congestione più comune, e che fa uso di una ulteriore variabile al trasmettitore, la finestra di congestione Wc, che concorre assieme a Ws a determinare il massimo numero di bytes che si possono trasmettere senza riscontri, ponendo la finestra di trasmissione pari alla più piccola delle due.

Il primo pacchetto in assoluto viene inviato con una strategia di tipo Send and Wait, ovvero adottando una finestra di dimensione pari ad un solo segmento, e aspettandone dunque il riscontro, prima di inviarne un secondo. Da quel momento, la connessione entra nella fase di slow start, in cui l'ampiezza della finestra di trasmissione Wc aumenta esponenzialmente nel tempo, in quanto è incrementata di un segmento per ogni ACK ricevuto. Infatti, il primo ACK perviene dopo t0 + RTT, e porta Wc a due segmenti, i cui riscontri pervengono ad un istante t0 + 2RTT, portando l'ampiezza a 3 e poi a 4; i 4 ACK successivi arrivano quindi dopo t0 + 3RTT, e portano Wc a 8. Dopo altri due RTT, Wc raggiunge la dimensione di 32 segmenti, determinando il raggiungimento della soglia di slow start (SST) in un tempo pari a circa cinque volte il valore dell'RTT.

Una volta raggiunto il valore di SST, la Wc viene incrementata al ritmo di 1/ Wc segmenti per ogni segmento riscontrato, ossia di un segmento per ogni Wc segmenti riscontrati, e dato che i segmenti partono ad un ritmo di Wc per ogni RTT, questo determina un aumento per Wc pari ad un segmento ogni RTT, ovvero lineare nel tempo: questa fase è indicata con il termine di congestion avoidance. Al raggiungimento di una seconda soglia per Wc (in figura, posta pari a 64) la procedura di controllo congestione entra in una ulteriore fase, in cui il valore di Wc è mantenuto costante, e Wc è detta pienamente aperta.

In una rete congestionata, i nodi iniziano a scartare pacchetti. Possono essere scartati i pacchetti di riscontro, o quelli spediti. Nel primo caso, il segmento non riscontrato viene ritrasmesso, e se arriva a destinazione, viene scartato dal ricevitore perché duplicato, ma è riscontrato comunque, e dunque il trasmettitore si vede tornare indietro degli ACK duplicati. Nel caso in cui vadano persi anche gli ACK duplicati, il trasmettitore inizia a constatare lo scadere dei timer di ritrasmissione.

Nel caso di perdita dei segmenti trasmessi, il TCP mittente interpreta la ricezione di tre ACK duplicati per uno stesso segmento, come un indicatore di una situazione di congestione. Anche se di fatto, la ricezione degli ACK (per di più duplicati) indica che la rete è ancora in grado di trasmettere, la perdita di un segmento trasmesso può segnalare l'inizio di un fenomeno di congestione. Pertanto, il TCP reagisce dimezzando la dimensione attuale della finestra di congestione, riducendo così il numero di segmenti non riscontrati che è possibile trasmettere in sequenza, e di conseguenza, riducendo il carico della rete. A questo punto, Wc riprende a crescere, secondo una modalità detta di fast recovery, in accordo alle regole viste in precedenza, ma ogni volta che vengono ricevuti 3 ACK duplicati, Wc viene nuovamente dimezzata, e via di seguito.

A questo meccanismo se ne aggiunge quindi un altro, legato alla perdita dei riscontri, e basato sulla interpretazione dell'evento di scadenza di un timeout, come segnale di un grave peggioramento della congestione, in quanto ciò indica che sono andati persi tutti gli ACK relativi ai segmenti che erano presenti nella stessa finestra di trasmissione, oppure (ma nessuno può saperlo) tutti i segmenti stessi.

In questo caso il comportamento del TCP è quello di resettare la procedura di controllo congestione, azzerando la dimensione di Wc, e ri-partendo dalla fase di slow start, che come abbiamo visto, inizia in modalità send and wait.

Esempio di capture

In questo esempio possiamoosservare

Diagramma di stato

Come finora discusso, il comportamento dell'entità TCP si modifica in funzione della storia dei pacchetti  precedentemente inviati e/o ricevuti. Ma al di là dei comportamenti legati ai diversi meccanismi di controllo, per quanto riguarda le applicazioni che fanno uso della interfaccia socket, l'entità TCP può trovarsi in uno degli stati sotto indicati, come può essere osservato con il comando netstat -tp, mentre le transizioni tra gli stessi dipendono dagli eventi indicati sugli archi del grafo:

Partendo da closed, un programma server si pone in listen (vedi capitolo seguente) per poi arrivare a established dopo aver terminato il three way handshake. Un client invece effettua una active Open iniziando con l'invio di un SYN. La chiusura della connessione può avvenire in modalità attiva o passiva a seconda di quale delle due parti vi da inizio; lo stato di time-wait non ritorna immediatamente a closed per evitare di far arrivare alle nuove connessioni vecchi pacchetti di questa, ma ritardati dalla rete.


Riferimenti

[AL] - Appunti di informatica libera di Daniele Giacomini
[UPF] - Unix Programming Frequently Asked Questions di Andrew Gierth
[MMC] - Multimedia Communications di Fred Halsall, ed. Addison-Wesley 2001, ISBN 0-201-39818-4
[BAF] - I procolli TCP/IP di Behrouz A. Forouzan - Ed McGraw-Hill 2001, ISBN 88-386-6005-0
[TST] - Trasmissione dei Segnali e Sistemi di Telecomunicazione di Alessandro Falaschi - Ed Aracne 2003, ISBN 88-7999-477-8 [NG4] - Tutorial: How to Accurately Interpret Traceroute Results - di Richard Steenbergen
[MCX] - man.cx - Tutte le Man page
Computer Networks - di
Theo Schouten

Capitolo: Network programming





Realizzato con Document made with Kompozer da Alessandro Falaschi -
x
Logo

Lo Strato Applicativo
di Internet

Dal TCP al VoIP, dal DNS all'Email alla crittografia, tutto ciò che accade dietro le quinte di Internet, completo di cattura del traffico.
Scopri come effettuare il download, ricevere gli aggiornamenti, e contribuire!