Sei sulla pagina 1di 95

Appunti del corso  Reti di telecomunicazione e Internet ∗

< daniele.iamartino at mail.polimi.it >

2013

Premessa
Questo documento contiene i miei appunti relativi al corso di Reti di telecomunicazione ed Internet seguito presso il
Politecnico di Milano nel primo semestre dell'anno scolastico 2011/2012. Ho pensato, man mano che seguivo il corso,
che sarebbe stato molto utile preparare degli appunti chiari, utili non solo a me ma anche eventualmente ad altri.
Mi sono reso conto che nella mia carriera potrebbe essermi molto utile anche avere una semplice reference per questi
argomenti, motivo in più per scrivere. Ho pensato quindi di renderlo più approfondito possibile integrando il materiale
di vari libri, che trovate nella bibliograa.
Sono ben consapevole che potrebbero esserci svariati errori (avendo scritto questo documento tra notti insonni e la
sera dopo le lezioni), non vi do quindi nessuna garanzia sulla correttezza dei contenuti. Segnalatemi pure eventuali
errori se ne trovate. Se volete inserire un paragrafo o fare grosse modiche sono ovviamente (in pieno spirito open
source ) disponibile per integrare le vostre modiche e aggiungere un vostro riferimento negli autori.
Vi prego di ricordare le regole di licenza Creative Commons nel caso voleste ridistribuire questo documento.

Ringraziamenti
Ringrazio Eugenio Guidetti per la realizzazione delle immagini vettoriali dei primi paragra e la segnalazione di alcuni
errori.

Fondamenti di trasmissione dati


Modellizzazione delle sorgenti
Le sorgenti si suddividono in analogiche e numeriche. Quelle numeriche emettono segnali analogici quantizzati.
I parametri principali sono tre:

ˆP = Frequenza di picco
 bit 
s

ˆA = Frequenza media
 bit 
s

ˆ B= A
P Fattore di burstiness [1]
Il termine  burst  indica una trasmissione a sprazzo, possiamo vedere B come la percentuale di tempo in cui viene
eettivamente trasmesso qualcosa.

Tipi di sorgenti
Esistono due grandi categorie di sorgenti di dati:

ˆ CBR (Constant Bit Rate ), cioè con A=P e B = 1, trasmetto sempre ad una certa frequenza.

ˆ VBR (Variable Bit Rate ), cioè A<P


∗ Quest'opera è sotto licenza Creative Commons Attribuzione - Condividi allo stesso modo 2.5 Italia License.

1
Sorgenti di tipo on-o deterministiche
Una sorgente dati di tipo on-o è una sorgente che ha dei tempi di deterministici di trasmissione e non trasmissione
che si ripetono in modo uguale e periodico.
Deniamo:

ˆT ON come la quantità di tempo per cui la sorgente trasmette dati

ˆT OF F come la quantità di tempo in cui la sorgente non trasmette

Il tempo TON + TOF F è anche chiamato tempo di interarrivo .


I vari tempi di trasmissione e non trasmissione si ripetono sempre in modo uguale:

ˆ
(
∀i TONi = TON
∀i TOF Fi = TOF F

In questo caso il burst è denito come:


TON
B=
TON + TOF F
Inoltre se indichiamo con L la quantità di dati (in bit) inviata in ogni intervallo di tempo TON , essa è pari a:

L = TON · P [bit]

Trasformazione in una VBR equivalente

Data una sorgente VBR con certi parametri, possiamo trasformarla in un'altra che trasmette la stessa quantità di
informazione (supponendo quindi la presenza di un buer).
Per eettuare le trasformazioni ci basta ricordare che in ogni caso, passando da una VBR ad una equivalente
devono sempre conservarsi:

ˆA
ˆT ON + TOF F
ˆL ON

Sorgente on-o statistica con variabile casuale esponenziale


Supponiamo che TONi e TOF Fi siano generate da un processo senza memoria (markoviano). Abbiamo:

ˆ f (t) =
(
λ · e−λt se t≥0
0 se t < 0

ˆ E [t] = 1
λ

Abbiamo cioè una distribuzione senza memoria. È molto protabile che trasmettiamo o non trasmettiamo per poco
tempo, piuttosto che per tanto tempo.
Modellizziamo le transizioni di stato della nostra sorgente con una catena di Markov:
Abbiamo due stati. Lo stato di OFF e lo stato di ON. Entrambi gli stati hanno una certa probabilità:

ˆp OF F = Probabilità di essere nello stato di OFF

ˆp ON = Probabilità di essere nello stato di ON

Inoltre abbiamo che:

ˆT ON è una variabile aleatoria esponenziale con media T ON = E [TON ] = 1


λ

ˆT OF F è una variabile aleatoria esponenziale con media T OF F = E [TOF F ] = 1


µ

Quindi:

ˆλ è la frequenza (se
1
λ è il periodo) di transizione da OFF a ON.

ˆµ è la frequenza di transizione da ON a OFF

Entrambe in Hz .
Abbiamo quindi le che probabilità di passare da uno stato all'altro sono:

ˆ Probabilità transizione OFF → ON = pOF F · λ

2
ˆ Probabilità transizione ON → OFF = pON · µ
pOF F · λ = pON · µ
Per ottenere equilibrio statistico dobbiamo avere
Inoltre dobbiamo soddisfare la condizione pOF F + pON = 1
(
λ · pOF F = µ · pON λ µ
⇒ pON = λ+µ , pOF F = λ+µ
pOF F + pON = 1
λ
A = P · pON + 0 · pOF F = P · λ+µ
λ
A P · λ+µ λ
B= P = P = λ+µ = pON
Volendo possiamo riscrivere B:
1 1
µ λ 1 1 µ
B= 1 · λ+µ = µ · λ+µ 1 = 1 1
µ λ ·µ λ+µ

T ON
B=
T ON + T OF F
Quindi in conclusione se conosciamo i tempi medi di ON e OFF della sorgente statistica (con v.c. tipo esponenziale)
possiamo comunque calcolare il fattore di burst B.

Sistemi a coda
ˆλ = Frequenza media di arrivo richieste al sistema
 req 
s

ˆT s = 1
µ =Tempo medio di servizio: tempo impiegato a svolgere il servizio richiesto [s]

Traco oerto al sistema


λ
Ao = λ · Ts = [req]
µ
In realtà è una grandezza adimensionale, si assume che la sua intensità sia misurata in erlang

Traco smaltito
ˆ Data λs = Frequenza di servizio

ˆ Indicando il traco smaltito come AS


λS
As =
µ

Probabilità di perdita
ˆπ p = Probabilità che una generica richiesta di servizio non sia accettata

λS = λ · (1 − πp )
Quindi:

λ · (1 − πp )
AS = = Ao · (1 − πp ) = Ao − Ap
µ
Dove Ap rappresenta il traco perso

ˆπ p =
Ap
Ao

Sistema a coda
ˆ m= Numero dei serventi indipendenti (ognuno smaltisce una richiesta alla volta)

ˆ L= Lunghezza massima della la d'attesa

Quindi il numero massimo di utenti nel sistema è (m + L)

ˆ Tempo di interarrivo delle richieste:


1
λ

3
1

A0 2
As
L …

Notazione di Kendall
La notazione è in questa forma: A1 /A2 /m/L/N
Dove:

ˆA 1 = Processo di arrivo, A2 = Processo di servizio che caratterizza la coda. I processi possono essere di vari
tipi:

 M: Processo di tipo markoviano/esponenziale

 Hm : Iperesponenziale di ordine m
 Em : Erlanghiana di ordine m
 G: Generale

 D: Deterministica

ˆ m= Numero dei serventi

ˆ L= Capacità della la d'attesa

ˆN= Numero di utenti potenziali del sistema

Processi markoviani
Per ora consideriamo solo processi di arrivo con distribuzione esponenziale A1 = M
Quindi i tempi d iinterarrivo delle richieste di servizio al sistema a coda sono variabili aleatorie indipendenti con
identica distribuzione di tipo esponenziale.

ˆ Se τi indica il generico tempo di interarrivo, allora

Fτi (t) = P {τi ≤ t} = 1 − e−λt

Doveλ indica la frequenza di arrivo ed è data da

1
λ=
E [τ ]

ˆ La distribuzione di probabilità del numero di arrivi n in un determinato intervallo t è di Poisson, cioè

n
(λ · t)
Pn (t) = · e−λt
n!
E [n] = λ · t
Il processo di Poisson ha assenza di memoria: la probabilità che un evento si verichi a partire da un certo
istante non dipende da quanto accaduto in precedenza

e−λ(t+t0 )
 
P {τ > t + t0 } −λt
P {τ > t + t0 | τ > t0 } = = = e = P {τ > t}
P {τ > t0 } e−λt0

ˆA 1 =M implica che il numero di utenti potenziali è innito: N = +∞

4
Processo di servizio
Anche per il processo di servizio considero una distribuzione esponenziale A2 = M e quindi i tempi di servizio θi sono
variabili aleatorie indipendenti con valore medio

1
Ts = E [θ] =
µ
Dove Ts è il tempo di servizio medio

ˆ Se abbiamo m servienti, la capacità di servizio è m·µ


m · µ = Frequenza di terminazione del servizio di un serviente

ˆ Considereremo anche:

 A2 = G → Distribuzione arbitraria

 A2 = D → Tempo di servizio costante

Coda M/M/1
Essendo M/M signica che i tempi di interarrivo e di servizio sono esponenziali, e avendo /1 signica che abbiamo
un serviente. Non c'è L, quindi L = +∞
ˆ Lo stato generico k rappresenta lo stato in cui il sistema contiene k utenti, dei quali uno è in fase di servizio

ˆ Gli archi che fanno verso stati superiori sono regolato dalla frequenza di arrivo λ, mentre quelli che tornano sono
regolati da µ.
ˆ Possiamo ricavare le probabilità dei singoli stati imponendo l'equilibrio del usso intorno ad ogni stato:

λ · pk−1 + µ · pk+1 = (λ + µ) · pk
λ · p0 = µ · p1
X∞
pk = 1
k=0

ˆ Poiché L = +∞, As = A0 = λ
µ

pk = (1 − A0 ) · Ak0 k = 0, 1, ...
ˆ In questo caso ρ = As , dove ρ rappresenta il coeciente di utilizzazione del servente

ˆ Il numero medio k di utenti in coda è dato da:

+∞
X A0 ρ
K= k · pk = =
1 − A0 1−ρ
k=1

Tempo di ritardo
ˆT w = Tempo medio speso nella coda

ˆT s = Tempo medio di servizio

ˆ Possiamo calcolare il ritardo totale T:


T = Tw + Ts

Formula di Little
K
T =
λ
λ
K A0 µ 1 1
T = = =  = =
λ (1 − A0 ) · λ 1 − µλ · λ µ · (1 − A0 ) µ · (1 − ρ)

Se ci ricordiamo che:
1
Ts =
µ
Possiamo trovare il tempo medio in coda:

ρ
Tw = T − Ts =
µ · (1 − ρ)

5
Coda M/M/1/L
Anche qua possiamo fare la catena di Markov:

ˆ Anche qua k rappresenta il numero di utenti nel sistema

ˆ Lo stato L+1 rappresenta la situazione di saturazione per il sistema a coda, che riuta ogni altra richiesta di
servizio.

ˆ L+1 e non L perché va conteggiata anche l'unità in lavorazione nel servente m=1
ˆ Calcoliamo l'equilibrio:
λ · pL = µ · pL+1
λ · pk−1 + µ · pk+1 = (λ + µ) · pk k = 1, 2, ... , L
λ · p0 = µ · p1

1 − A0
pk = · Ak0 k = 0, 1 ... , L + 1
1 − AL+2
0

ˆ Questa volta la lunghezza della coda non è innita, quindi può succedere che As 6= A0
λ
ρ = As = A0 · (1 − πp ) = · (1 − πp )
µ

ˆ Calcoliamo quindi quanto è la probabilità di riuto/blocco πp


1 − A0
πp = pL+1 = · AL+1
0
1 − AL+2
0

Numero medio utenti della coda:


L+1
X A0 1 − (L + 2) · AL+1 + (L + 1) · AL+2
0
K= k · pk = ·
k=1
1 − A0 1 − AL+2
0

Applichiamo la formula di Little


K
T =
λs
Dove λs = λ · (1 − πp ). Calcoliamo la latenza totale T :

K
T =
λ (1 + πp )
1
Ts =
µ
Tw = T − Ts

Coda M/G/1
Il processo di servizio ha distribuzione arbitraria questa volta, L=∞ e m=1 .

ˆ Non possiamo più disegnare il diagramma di stato perchè viene a mancare l'assenza di memoria del processo di
servizio.

Sappiamo però che:


 
2
λ · E [θ] + V ar [θ]
Tw =
2 · (1 − ρ)
1
Ts =
µ
 
2
λ · E [θ] + V ar [θ] 1
T = Tw + Ts = +
2 · (1 − ρ) µ
Con Little otteniamo anche che:
K =T ·λ

6
Coda M/D/1
Questa volta il tempo di servizio è sso, c'è m=1 e L = +∞.
ρ
Tw =
2µ (1 − ρ)
2−ρ
T = Tw + Ts =
2µ (1 − ρ)
Con Little otteniamo:
K =T ·λ

Coda M/M/m/0
Questa volta non c'è coda, abbiamo solo servienti. Se si arriva quando tutti i servienti sono occupati, il traco non
viene servito.
λ · pm−1 = m · µ · pm
λ · pk−1 + (k + 1) · µ · pk+1 = (λ + k · µ) · pk k = 1, 2, ... , m − 1
λ · p0 = µ · p1
Ak
0

pk = P k! i  k = 0, 1, ... , m
m A0
i=0 i!

λ
A0 =
µ
Il coeciente di utilizzo di ogni serviente è:

As A0 · (1 − πp )
ρ= =
m m
ˆ La frequenza massima di traco smaltibile è As = m [erlang]
Am
0
m!
πp = p m → =P  
m Aio
i=0 i!

T = Ts
K = Ts · λ

Tipologie di rete
Dobbiamo tenere conto di alcuni parametri:

ˆ C= Fattore di costo

ˆ E= Numero di rami di costo unitario α


ˆ β= Costo di eventuali altri apparati

Grado di un nodo
ˆ Grado+ = Numero dei lati uscenti

ˆ Grado− = Numero dei lati entranti

Cammino
ˆ Cammino = Percorso da sorgente S a destinazione D
ˆ Lunghezza di un cammino = Numero di nodi attraversati o
P
l
dl (dove dl è la distanza del lato l)

ˆ Diametro della rete = Il cammino più lungo

ˆ Cammino chiuso = Cammino che torna al punto di origine

7
Rete ad albero
Non esistono cicli, il numero di rami è N − 1.
ˆ C = α · E = α · (N − 1)
Rete ad anello
Esiste un solo cammino chiuso, ogni nodo è connesso solo con altri due nodi.

ˆ E=N
ˆ C =α·N
ˆ I
(
N
2 se N pari
M ax = N −1
(cammino massimo) se N dispari
2

ˆ 1≤ Lmin
(distanza minima)
≤ N
2

Rete a stella
ˆ C =α·N +β N odo (βN odo si riferisce al nodo centrale della stella)

ˆL =2
M ax/M in

Rete a bus
ˆ C =α·N +β Bus (βBus si riferisce al costo del bus)

ˆL =2
M ax/M in

Rete a maglia
Esistono almeno 2 cammini chiusi per ogni nodo.
N ·(N −1)
Il numero di rami nel caso in cui la maglia sia completa è N <E< 2
N

Altrimenti N <E< 2

ˆ C =α·E
ˆ L =1
M in

Segnali
Qualunque segnale periodico può essere scomposto e visto come una somma di seni e coseni.

s (t + T ) = s (t)


X
s (t) = a0 + 2 · [an · cos (2π · n · f0 · t) + bn · sin (2π · n · f0 · t)]
n=1
1
La frequenza f0 =T è detta  frequenza fondamentale . Quando si parla di prima e seconda aromonica, ci si
riferisce ai multipli interi di questa frequenza f0 , cioè f0 , 2f0 , 3f0 , ...
I coecienti della serie di Fourier vengono calcolati come segue:

ˆ T
1 2
an = s (t) · cos (2π · n · f0 · t) dt
T − T2
ˆ T
1 2
bn = s (t) · sin (2π · n · f0 · t) dt
T − T2

La serie di Fourier è solo un altro modo per riscrivere sotto forma diversa la stessa funzione. Questo è valido a
patto di tenere tutti i termini della serie.
Alcuni segnali hanno un numero nito di termini della serie, altri hanno un numero innito di termini. Ad
esempio un'onda quadra si rappresenta sommando un numero innito di seni e coseni.
La banda (range di frequenza) utilizzabile su un certo canale di comunicazione è sempre limitata a causa di
caratteristiche siche del materiale o per scelta di utilizzare solo una parte della banda.

8
Un canale di comunicazione lascierà quindi passare nel canale di comunicazione solo le componenti spettrali che
si trovano all'interno della sua banda. Le altre saranno ltrate.
Un canale passa basso lascia passare segnali di frequenza da 0Hz no ad una certa frequenza W Hz .
Un canale passa banda lascia passare segnali da frequenza f1 a frequenza f2 con f2 − f1 = W .
Se il nostro segnale ha componenti spettrali fuori dalla banda ammessa oppure ha frequenze spettrali innite, esso
sarà modicato nel passaggio nel mezzo (vedi esempio onda quadra).

Il campionamento
I segnali trasmessi sul mezzo devono essere letti a destinazione e ritrasformati in segnali digitali.
Il teorema del campionamento di Shannon aerma che se vogliamo ricostruire un segnale (con un interpo-
latore a seno cardinale) dobbiamo campionarlo (o leggerlo) ad almeno il doppio del suo periodo, cioè la frequenza di
capionamento deve essere:
fc > 2fsegnale

Se non soddisamo questo vincolo rischiamo di sotto-campionare, nendo per avere l'eetto di aliasing.
Solitamente si mettono dei ltri prima di trasmettere il segnale (per non mandare inutilmente sul canale delle
frequenze riutate) e anche in ricezione si ltra (per evitare di sommare disturbi a frequenza superiore al nostro
segnale).
A causa della non idealità dei ltri è necessario spesso sovracampionare.
Il processo di quantizzazione è quello che segue il campionamento del segnale analogico e consiste nella trasfor-
mazione del segnale analogico a segnale quantizzato su precisi livelli.
Il processo di codica consiste nell'assegnare a ciascuno dei livelli quantizzati un valore e trasformarlo in una stringa
di bit.

Esempio: segnale vocale In realtà la voce necessiterebbe circa 10kHz. Ne viene però limitata la banda a 3400Hz
(In realtà da 300 a 3400Hz). Viene utilizzata la codica PCM con fs = 8KHz (cioèfmax = 4kHz)
Si tengono (secondo PCM) 8 bit di risoluzione per campione. Abbiamo allora FC = fs · b = 64 kbit
s . In realtà la
quantizzazione non è lineare ma logaritmica in base a varie scale.

Mezzi trasmissivi
Cavi coassiali
Si dividono in due grandi categorie:

ˆ Thick (come ad esemipio RG-213), è un cavo spesso, 10mm di diametro, schermato.

ˆ Thin (come ad esempio RG-58), è un cavo sottile, 5mm di diametro, meno schermato dei thick.

Doppini
ˆ Doppino non schermato (UTP - Unshielded Twisted Pair )

 Solitamente due coppie di li di ramte interecciate. Soltiamente ogni cavo comprente varie coppie di tipo
UTP (almeno 4 di solito).

 Categoria 1: Vecchi doppini telefonici


 Categoria 2: Telefonia digitale, trasmissione dati seriale a bassa velocità.
 Categoria 3: Doppini con banda passante di 16M Hz (Utilizzati per Ethernet 10M bps e token ring)

 Categoria 4: Doppini con banda passante a 20M Hz (token ring a 16M bps)
 Categoria 5: Doppini con banda passante a 100M Hz (Ethernet 100BaseT)

 Categoria 5E: Categoria 5 migliorata come attenuazione (Ethernet 1000BaseT)


 Categoria 6: Doppini con banda a 250M Hz
 Categoria 7: Doppini con banda a 600M Hz

ˆ Doppino non schermato con schermo esterno (FTP )

ˆ Doppino schermato (STP )

 Ogni coppia di cavi è schermata separatamente

9
Attenuazione
POU T = PIN · e−α·d
Dove:

ˆP IN potenza all'ingresso del tratto

ˆP OU T potenza all'uscita del tratto

ˆd distanza

Sappiamo che in un tratto lungo l che attenua α dB per metro. L'attenuazione del tratto (in dB) sarebbe l · α.
   
Pin (0) dB
l · αdB = 10 · log10
Pout (l) m
In generale la formula più rilevante è

PT X − PRX = α · l + Aextra + M

Dove:

ˆP T X è la potenza di trasmissione

ˆP RX è la potenza di ricezione

ˆα è l'attenuazione in dB per metro

ˆA extra è l'attenuazione in dB dovuta ai giunti e collegamenti

ˆM è un margine per imprevisti in dB.

Solitamente i percorsi coassiali hanno una perdita di circa 5-8 dB per 100 metri (0, 05dB < α < 0, 08dB ) mentre ad
esempio i cavi UTP-5 perdono circa 20dB per 100 metri (α ' 0, 2 dB
m ).

Fibre ottiche

Le bre ottiche sono composte da due strati concentrici di materiale vetroso. Gli indici di rifrazione sono tali che
l'onda luminosa incidente ad una estremità del lo si propaga all'interno se l'angolo di incidenza è abbastanza piccolo.
Abbiamo due tipi di bra ottica:

ˆ Fibra ottica multimodo :

 Mantello spesso circa 125 micron


 Nucleo spesso circa 50 micron
 All'interno possono transitare più onde luminose.

ˆ Fibre ottiche monomodo :

 Nucleo di circa 10 micron


 Consente un solo modo di propagazione delle onde all'interno del nucleo.
 Hanno il vantaggio di avere una dispersione molto più bassa.

La caratteristica principe delle bre è la loro attenuazione. È sempre inferiore a qualche dB per kilometro, il che le
rende un mezzo adatto per collegamenti a lunga distanza a bassa perdita.
Ci sono tre nestre di lunghezze d'onda su cui è possibile trasmettere con attenuazione minima:

ˆ Prima nestra: 850nm , 1 − 2 dB


km (per bre multimodo)

ˆ Seconda nestra: 1300nm , 0, 4 dB


km (per bre multimodo o monomodo)

ˆ Seconda nestra: 1550nm , 0, 2 dB


km (per bre monomodo)

Le bre monomodo utilizzano solitamente laser al posto di LED.

10
Spettro elettromagnetico
La lunghezza d'onda viene utilizzata come alternativa per esprimere la frequenza di un segnale:

v
λ= [m]
f
Dove v = c ' 3 · 108 m
s
2
Nei mezzi guidati però ricordiamo che dobbiamo considerare una velocità di propagazione di circa
3 c , sia per i
mezzi in bra che per i mezzi in rame.

Congurazioni di linea
ˆ Trasmissioni simplex: canale di tipo unidirezionale

ˆ Trasmissione di tipo half-duplex: canale di trasmissione bidirezionale alternato

ˆ Trasmissione di tipo full-duplex: canale di trasmissione bidirezionale contemporaneo.

Trasmissione di segnali numerici e limiti di banda


Il segnale che trasmettiamo sul mezzo subisce quindi una attenuazione in ampiezza, una limitazione di banda e una
variazione di fase.
In particolare la variazione di ampiezza e fase dipendono dalla frequenza utilizzata.
Indichiamo con W la banda utile del canale, che non viene ltrata dal mezzo.
Supponiamo che il nostro canale ha una risposta in ampiezza costante A (f ) = C e risposta di fase lineare φ (f ) =
2π · f · tc
Abbiamo allora che il nostro segnale in uscita sarà suscita (t) = C · s (t − tc ) , cioè attenuato e ritardato.
In questo caso se trasmettiamo sul canale un impulso innitesimale ci esce un seno cardinale dalla forma

sin (2π · W · t)
y (t) =
2π · W · t
n
Questo seno cardinale si annulla (attraversa l'asse) per t = ± 2·W
I segnali emessi a impulsi in istanti diversi si sovrappongono dando luogo alla interferenza intersimbolica. Questa
interferenza diminuisce all'aumentare della distanza tra gli impulsi e si annulla se gli impulsi di opportuna ampiezza
1
sono trasmessi ogni
2W secondi (secondo Nyquist).
Dunque la massima frequenza di trasmissione è 2W .
In un caso non ideale però non è questa la banda massima, in generale possiamo dire che è invece W

Rmax = W
Abbiamo però fatto riferimento ad una trasmissione di tipo unicamente binario. Nella realtà è possibile anche
trasmettere su più livelli per codicare in un impulso una pluralità di bit. Se la massima ampiezza del segnale è ±A
2A
e si utilizzano M livelli, allora la dierenza in ampiezza tra i ilivelli adiacenti del segnale sarà
(M −1) . Ipotizzando che
il numero di livelli sia una potenza di 2 , possiamo esprimere la massima frequenza di trasmissione (cioè la capacità
del canale, non la banda!), come:

 
bit
C = 2W · log2 (M )
s
Guardando la precedente formula si potrebbe quindi dire che la capacità potrebbe essere aumentata a dismisura
semplicemente aumentando il numero dei livelli. Questo è vero, però bisogna considerare l'inevitabile presenza di
rumore sul canale, che produce degli errori. Dato un livello A del segnale, la probabilità di errore cresce all'aumentare
del numero di livelli M .
Claude Shannon ha dimostrato che, qualunque sia la tecnica di codica del usso numero nel segnale da trasmettere,
il limite teorico della capacità del canale è data da:

 
bit
Cmax = W · log2 (1 + SN R)
s
Dobbiamo però considerare che è possibile trasmettere su più livelli. Inoltre la presenza di rumore può distrubarci
se usiamo troppi livelli. Diciamo allora che il limite di banda sul canale è

C = W · log2 (1 + SN R)
Psegnale
Con SN R = Prumore

11
Tecniche di codica
I ruoli della codica di linea sono molteplici:

ˆ Determinare uno spettro adatto per il segnale, eliminando le componenti ad alta frequenza

ˆ Facilitare l'estrazione del cronosegnale a partire dal segnale ricevuto, evitando di dover trasmettere un segnale
di sincronismo separatamente

ˆ Realizzare funzioni di rivelazione d'errore, in aggiunta a quelle che se saranno eettuate eventualmente a livello
datalink

Codica unipolare
Si utilizza un solo livello del segnale, che codica il simbolo 1, l'assenza di segnale identica il simbolo 0. È il tipo
di codica più semplice ed è ormai obsoleta per la trasmissione su rame, ma viene ancora utilizzata per la trasmissione
su bra ottica.
Sono due i motivi per cui questa codica è obsoleta:

ˆ La presenza di una componente continua pone dei problemi nell'attraversamento di alcune linee di
trasmissione, che per loro natura non accettano segnali continui.

ˆ È dicile ricostruire la sincronia del segnale ricevuto. Ciò è invece possibile tanto meglio quanto maggiori sono
le alternanaze tra i simboli 0 e 1 sul segnale di linea ricevuto.

Codica polare
Si utilizzano due livelli del segnale, che codicano i simboli 0 e 1, si sfrutta poi eventualmente anche lo stato di assenza
di segnale. I due livelli utilizzati spesso vengono indicati come + e - (riferendosi alla polarità del segnale).

Non Return to Zero (NRZ)

Il segnale non torna mai al livello 0. Quando bisogna trasmettere 0 si emette un segnale -, quando si deve emettere
1 si emette un segnale +.
Esiste anche la codica NRZ-I (Inverted) che è l'opposto della precedente.

Return to Zero (RZ)

Simile a NRZ: 0 e 1 sono codicati con un segnale negativo e positivo, rispettivamentem il segnale resta però al livello
+ o - solo per la metà del tempo di bit e torna sempre al livello 0 nella restante metà

Coded Mark Inversion (CMI)

È un codice di tipo bifase. Il segnale non torna mai al livello 0. Il simbolo binario 0 viene codicato come una
sequenza di due segnali: uno negativo - e uno positivo +. Il simbolo binario 1 viene codicato con una sequenza di
un segnale positivo + e uno negativo -.
Questo codice presenta quindi sempre un'inversione di stato della linea per ogni simbolo binario 0 emesso, facili-
tando così la sincronizzazione in ricezione.

Manchester

Entrambi i simboli binari 0 e 1 sono codicati con una sequenza di due segnali alternati:

ˆ Transizione negativo  positivo : simbolo binario 1

ˆ Transizione positivo  negativo : simbolo binario 0

Esiste anche una variante di Manchester dove 0 e 1 sono scambiati.

Manchester Dierenziale

Una transizione positivo-negativo è sempre presente a metà del tempo di bit e l'assenza o la presenza di una transizione
di stato del segnale all'inizio del tempo di bit indica il simbolo emesso. Se una transizione è presente il simbolo binario
emesso è 0, altrimenti 1.

12
Nota

Notiamo che nelle codiche n'ora viste, a parte NRZ, data la frequenza di emissione di simboli binari pari a C,
l'eettiva frequenza di trasmissione sul canale sarà di Rs = 2C . Questo implica che, ad esempio, Manchester
richiede una quantità di banda doppia rispetto a NRZ. Questo ci dà però come garanzia l'interferenza intersimbolica
nulla.

Codica bipolare
Si utilizzano tre livello del segnale per rappresentare la sequenza di simboli 0 e 1. I tre livelli sono solitamente indicati
come +,-,0.
(TODO)

Codici a blocchi
Se teniamo conto della possibilità di trasmettere non più un bit alla volta ma blocchi di bit (sfruttando l'aumento di
livelli).
In generale possiamo dire che avendo m bit da inviare avremo un segnale di n simboli multilivello da inviare.
Si applicano spesso alcune nomenclature convenzionali.

ˆ Ad esempio se abbiamo un segnale binario rappresentando utilizzando un codice a blocchi che sfrutta un segnale
a 3 livelli scriveremo mBnT , dove T sta per ternario.

ˆ Se i livelli sono quattro, analogamente, avremo mBnQ

Lo strato datalink (livello 2 ISO/OSI)


Servizi oerti agli strati superiori
ˆ Gestione del collegamento dati per lo scambio di trame

ˆ Delimitazione delle trame

ˆ Indirizzamento a livello di rete interna (tra gli altri che possono ricevere la stessa trama)

ˆ Controllo di errore: mostrare agli strati superiori un canale di comunicazione ideale senza errori

ˆ Controllo di usso : Evitare la perdita di trame a causa di saturazione della destinazione

ˆ Buer di ritrasmissione
Procedure per il controllo d'errore
Esistono due metodi per il controllo di errore:

ˆ FEC - Forward Error Correction (Correzione dell'errore in avanti)

ˆ ARQ - Automatic Repeat reQuest (Richiesta di ripetizione automatica)

FEC - Forward Error Correction


Viene aggiunta dell'informazione a livello 2 per correggere gli errori. Si parla di codice a correzione d'errore. Non è
prevista la necessità di invio di un riscontro per confermare la corretta ricezione. La quantità di informazione trasferita
sul collegamento dati è indipendente dal tasso di errore.
Un esempio di tecnica FEC utilizzabile con canali con tassi di errore di 1 bit per pacchetto dati è l'utilizzo di un
bit di parità.

ARQ - Automatic Repeat reQuest


Ai dati in ogni pacchetto si aggiunge un campo che contiene un codice a rivelazione d'errore, capace di rilevare la
presenza di errore ma non di correggerlo. Si richiede poi al trasmettitore di rinviare il pacchetto corrotto. È necessario
un canale di ritorno anche per comunicazioni monodirezionali. La quantità di dati trasferiti sul canale è
dipendente dal tasso di errore. È inoltre necessario un buer di ritrasmissione.
I protocolli di tipo ARQ sono così suddivisi:

13
ˆ Stop & Wait
ˆ Continuous ARQ
 Go-back-n
 Selective repeat

Tassonomia sui tempi di trasmissione

I vari tempi sono quindi:

ˆ T tempo di trasmissione della trama


f

ˆ τ tempo di propagazione del segnale


ˆ T tempo di processing della trama
p

ˆ T tempo di trasmissione del riscontro


a
 
Lf Lf
Tf = = TON =
C P
d
τ=
v
dove v∼= 23 · c = 2 · 108 m
s per segnali guidati all'interno di un mezzo
Tp e Ta sono spesso approssimati a 0
Il tempo totale viene spesso espresso come

TT OT = Nf · (Tf + Ta + 2 · Tp + 2 · τ )

dove Nf è il numero delle trame.


Il tempo di propagazione normalizzato viene spesso utilizzato per comodità ed è denito come:

τ
a=
Tf

Protocolli Stop & Wait


ˆ Trasmetto una trama e aspetto il riscontro positivo (ACK) (Non esiste NACK)

ˆ Il destinatario eettua controllo di usso rallentando i riscontri

14
In assenza di errori:
Calcoliamo le prestazioni tenendo conto della quantità di tempo in cui stiamo eettivamente inviando dati utili
In generale abbiamo che l'ecienza del protocollo è data quindi da:

Tf
η=
TT OT
E quindi in questo caso particolare:

Tf
η=
Tf + Ta + 2 · Tp + 2 · τ
Supponendo Tp = Ta ' 0 allora

Tf 1
η= =
Tf + 2 · τ 1+2·a

ˆ Aumentiamo l'ecienza aumentando la lunghezza della trama.

ˆ Un'altra stima di ecienza, il throughtput viene fatta tenendo conto anche della frequenza di cifra:

T HR = η · C

In presenza di errori:
ˆ Denisco un tempo di timeout To tra l'invio della trama e un suo nuovo reinvio.

ˆ Utilizzando un timeout risolviamo il problema dei riscontri persi o trame totalmente perse (e non corrotte)

ˆ Il tempo di timeout non può essere scelto a caso ma deve essere almeno di un valore minimo

To ≥ Ta + 2 · Tp + 2 · τ

che considerando Tp = Ta ' 0 diventa:


To ≥ 2 · τ

ˆ Per denizione il tempo di timeout parte ad essere conteggiato dopo il completo invio del pacchetto (Tf )

ˆ Per evitare di ricevere due volte la stessa trama e pensare che la seconda sia nuova (se viene perso il riscontro),
è necessaria una numerazione di pacchetti ad almeno 1 bit.

ˆ Calcoliamo le prestazioni :

15
 p è la probabilità di errore sul singolo bit.
 P è la probabilità di errore nella trasmissione di una trama.
 ai è la probabilità di successo alla trasmissione della i-esima trama.
 NS è il numero medio di tentativi di trasmissione per trama ricevuta con successo.

 Ipotizzando gli errori sui bit statisticamente indipendenti, sappiamo che una trama sarà ritrasmessa quando
c'è almeno un bit sbagliato nella trama o nel riscontro. Abbiamo quindi che:

Lf +La
P = 1 − (1 − p)

*L f è la lunghezza della trama


*L a è la lunghezza del riscontro
* (1 − p) è la probabilità di successo nell'invio di 1 bit, (1 − p)
Lf +La
è la probabilità di successo nell'invio
di trame e riscontri, sottraendo a 1 si ottengono tutti gli altri casi.

 Calcoliamo ora il numero medio NS di tentativi di trasmissione per trama trasmessa (di cui solo
l'ultimo tentativo ha successo):

∞ ∞ ∞
X X X 1 1
NS = i · ai = i · P i−1 · (1 − P ) = (1 − P ) · i · P i−1 = (1 − P ) · 2 =
i=0 i=1 i=1 (1 − P ) (1 − P )

* La prima sommatoria
P∞
i=0 i · ai è la somma pesata del numero di tentativo e la relativa probabilità di
successo.

*P i−1
è la probabilità di fallimento per le precedenti, (1 − P ) è la probabilità di successo per l'ultima

* La serie

P
i=1
i·P i−1
è una serie nota: è la derivata della somma della serie geometrica.

 Quindi il tempo di invio di una trama lunga Lf è:

TT OT = (NS − 1) · (Tf + To ) + Tf + Ta + 2 · Tp + 2 · τ

* Dove (NS − 1) · (Tf + To ) sono tutti i tentativi precedenti in cui scatta il timeout.

 L'ecienza è quindi:

Tf Tf
η= =
TT OT (NS − 1) · (Tf + To ) + Tf + Ta + 2 · Tp + 2 · τ
1
dove considerando che NS = (1−P ) :

Tf · (1 − P )
η=
Tf + To · P + (Ta + 2 · Tp + 2 · τ ) · (1 − P )

 Per calcolare l'ecienza massima ci poniamo nella condizione limite di timeout (To = Ta + 2 · Tp + 2 · τ
). L'ecienza diventa quindi:

Tf · (1 − P )
η = ηM AX =
Tf + Ta + 2 · Tp + 2 · τ

ipotizzando poi come al solito Ta = Tp ' 0 abbiamo che

1−P
ηM AX =
1+2·a

 Notiamo che l'ecienza è fortemente legata al timeout scelto.

Protocolli Continuous ARQ:


ˆ Tentiamo di aumentare l'ecienza permettendo la trasmissione di più trame consecutive in attesa dei riscontri
delle prime trasmesse.

ˆ È necessaria una numerazione delle trame in modulo N. Di solito N = 2b

16
ˆT T OT = Nf · Tf + Ta + 2 · τ

 L'ecienza può quindi essere calcolata come

Tf Tf
η= =
TT OT Nf · Tf + Ta + 2 · τ

 Come sempre il throughtput è calcolato come:

T HR = η · C

Sliding Window
ˆ Si stabiliscono due nestre di trasmissione e ricezione che memorizzano la lista di trame che possono essere
ricevute e inviate:
WS = Numero di trame che posso inviare (send )

WR = Numero di trame che posso ricevere (recive )

ˆ Dobbiamo tenere conto anche degli estremi delle due nestre:

LR = Estremo inferiore della nestra di ricezione

LS = Estremo inferiore della nestra d'invio

ˆ Il trasmittente è autorizzato ad inviare tante trame n tali che:

LS ≤ n ≤ (LS + WS − 1)(mod N )

ˆ Il ricevente è autorizzato a ricevere le trame n tali che:

LR ≤ n ≤ (LR + WR − 1)(mod N )

ˆ Il ricevitore all'invio del riscontro relativo alla trama numero LS , incrementa il valore di LS di una unità (in
modulo N ).

ˆ Il trasmettitore alla ricezione del riscontro per la trama numero LR , incrementa il valore di LR di una unità (in
modulo N ).

17
ˆ L'incremento di LR e LS fa ruotare le rispettive nestre (in senso antiorario).

ˆ Solitamente nel caso n = 23 si rappresenta così:

ˆ Per garantire che ci sia un invio continuo di trame no all'arrivo del primo riscontro, è necessario imporre
un valore minimo per WS :
WS · Tf ≥ Tf + Ta + 2 · τ

 WS · Tf è il tempo totale di trasmissione di tutte le trame della nestra

 Tf + Ta + 2 · τ è il tempo necessario alla ricezione del primo riscontro

 Se questa relazione non è soddisfatta, si dice che il meccanismo a nestra strozza la piena
utilizzazione del collegamento.
 Nel caso in cui Ta ' 0 abbiamo:
WS · Tf ≥ Tf + 2 · τ
τ
e ricordando ancora che a = Tf , riscriviamo più semplicemente che la condizione per evitare la
strozzatura è:
WS ≥ 1 + 2 · a

Piggybacking Notare che nei canali bidirezionali non è sempre necessario inviare un riscontro separato, ma è
possibile semplicemente inserirlo insieme ai dati che si stanno inviando, in questo modo il riscontro si procura un
 passaggio gratis a bordo di un pacchetto dati già in trasmissione.

Vincolo sulla apertura delle nestre Per evitare ambiguità sui numeri di sequenza ricevuti ed evitare di
confondere quindi una ritrasmissione con un nuovo pacchetto, è necessario soddisfare la relazione:

WS + WR ≤ N

Protocolli go-back-n
Accetto le trame inviate solo se le ho ricevute strettamente in sequenza ciclica modulo N. Quindi sempre WR = 1.

ˆ Per il vincolo prima discusso abbiamo quindi: WS ≤ N −1 ⇒ WS ≤ 2b −1 , dove il caso migliore da scegliere
è sempre
WS = 2b − 1

ˆ ACK i : sinica ho ricevuto la trama i è tutte le precedenti.

ˆ NACK i signica non ho ricevuto i ma ho ricevuto le precedenti no a i-1, ora aspetto che mi rimandi i e
scarto eventuale altra roba in arrivo no a quando non mi arriva i .

ˆ C'è un timeout che scatta alla sorgente dopo che un pacchetto non ha ancora ricevuto un ACK dopo To secondi.

ˆ La sorgente non ruota la nestra no a quando non riceve l'ACK di LS alla destinazione.

ˆ Ipotizzeremo che la trasmissione di una trama venga sempre portata a termine, anche se intanto mi sta arrivando
un NACK o altro.

18
Protocollo selective repeat
ˆW R >1 e ricordiamo che WS + WR ≤ N .
ˆ Per l'ecienza massima del protocollo conviene scegliere

N
WS = WR =
2
ˆ ACK i : Ho ricevuto i e anche tutte le precedenti

ˆ NACK i : Non ho ricevuto la trama i, non ti dico niente sulle precedenti. Accetto eventuali trame seguenti che
rientrano nella nestra (senza però ruotarla quando le ricevo).

ˆ Timeout che scatta dopo To secondi dall'invio della trama come per il protocollo go-back-n.

Ecienza dei protocolli Continuous ARQ


In assenza di errori:
In base alla condizione di strozzatura (che in questo caso è l'unico vincolo di ecienza):

ˆ η=
(
1 se WS ≥ 1 + 2a
WS ·Tf
Tf +2·τ se WS < 1 + 2a

In presenza di errori:
Lf +La
Ricordiamoci che P = 1 − (1 − p) .

Tf 1
η= =
NS · Tf NS
NS è il numero medio di trasmissioni per trasmettere una trama.

Selective repeat

ˆ Non c'è perdita di ecienza legata alla latenza (a dierenza di Stop & Wait )

ˆ Poichè la ritrasmissione interessa solo una trama e non altre:


1
NS =
(1 − P )
e quindi
η = (1 − P )

Go-back-n

ˆK= Numero di trame consecutive che devono essere ritrasmesse in seguito ad un errore (è esclusa dal conto la
trama con successo).

 Con 1 errore: k+1 trame


 Con 2 errori: k+2 trame
 ...

ˆP i
· (1 − P ) = Probabilità di accumulare i errori su i trasmissioni ripetute della stessa trama.

NS = 1 · (1 − P ) + (K + 1) · P · (1 − P ) + (2K + 1) · P 2 · (1 − P ) + ...


X K ·P 1 + (K + 1) · P
NS = (i · K + 1) · P i · (1 − P ) = +1=
i=0
1−P 1−P

ˆ con K '2+2·a si ottiene


1−P
η=
1−P +2·a·P
ˆ Otteniamo quindi in ne che:
(
1−P
1+P +2·a·P se WS ≥ 1 + 2a
η= WS ·(1−P )
(1+2·a)·[1+(WS −1)·P ] se WS < 1 + 2a

19
Conclusioni sull'ecienza in caso di errori:
ˆ Sotto ipotesi di non strozzatura W S ≥ 1 + 2a :
(
(1 − P ) Selective Repeat
η= (1−P )
1+P +2·a·P Go-back-n

ˆ Sotto ipotesi di strozzatura W S < 1 + 2a :


( W ·(1−P )
S
1+2·a Selective Repeat
η= WS ·(1−P )
(1+2·a)·[1+(WS −1)·P ] Go-back-n

ˆ Selective repeat è meglio di go-back-n ma la dierenza tra i due si riduce man mano che diminuisce la distanza.

ˆ In caso di tasso di errore particolarmente basso però go-back-n diventa paragonabile o anche meglio di
Selective repeat, a causa della WS maggiore.

ˆ Stop & Wait ha praticamente sempre pessime prestazioni.

Protocollo HDLC
Tipi di stazioni

ˆ Stazione primaria (controllo del collegamento mediante comandi)

ˆ Stazione secondaria (Opera sotto una stazione primaria ed emette risposte)

ˆ Stazione combinata (Combina operazione primaria e secondaria, emette comandi e risposte)

Tipi di congurazione

ˆ Congurazione bilanciata: Sono presenti due stazioni combinate

ˆ Congurazione sbilanciata: Sono presenti una stazione primaria e una o più stazioni secondarie

Tre modalità di trasferimento

ˆ ABM - Asynchronous Balanced Mode (Full-Duplex)


 Utilizzato in congurazioni bilanciate
 Ognuna delle due stazioni combinate può iniziare a trasmettere

ˆ NRM - Normal Response Mode (Half-Duplex)


 Utilizzato in congurazioni sbilanciate
 La primaria può iniziare a trasmettere, una secondaria può solo rispondere

ˆ ARM - Asyncronous Response Mode (chiamato anche LAP-B)


 Utilizzato in congurazioni sbilanciate
 La primaria e le secondaria possono iniziare a trasmettere

ˆ In tutte le modalità è sempre la stazione primaria ad essere responsabile dell'inizializzazione del collegamento

Struttura della trama HDLC

   8·n         
Flag Address Control Information FCS Flag
(8 bit) ( bit) (8/16 bit) (8 ·n bit) (16/32 bit) (8 bit)

ˆ Flag (8 bit): Presente in testa e in coda, svolge la funzione di delimitatore della trama, vale 01111110.
ˆ Address 8 · n ( bit): Campo a 8 bit, estendibile a multipli di 8, specica la stazione secondaria ricevente (nel
caso di comandi emessi dalla primaria), oppure la stazione secondaria trasmittente nel caso di risposte.

 L'indirizzo composto da tutti 1 è un indirizzo di broadcast


 Possiamo indirizzare no a 128 stazioni

20
 Il campo address diventa ridondante per congurazioni punto-punto

ˆ Control (8/16 bit): Campo a 8 bit, estendibile a 16

 Specica il tipo di trama in trasmissione


 Gestisce i meccanismi di numerazione e riscontro
 Ci sono tre tipi di campo di controllo, a seconda dei primi due bit:

* Information (I) : Informazione utente, contiene il numero della trama trasmessa e il numero della
prossima trama che si aspetta di ricevere, N(R), mandando l'acknowledge implicito di N(R)-1. Il
campo P/F sarà descritto in seguito

· Nella versione a 8 bit:


Contenuto: 0 N(S) P/F N(R)
Numerazione: 0 1 2 3 4 5 6 7

· Nella versione a 16 bit:


Contenuto: 0 N(S) P/F N(R)
Numerazione: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

* Supervisory (S) : Utilizzato per gestire i riscontri di trama ed eventuale stato di fuori servizio. N(R)
indica la prossima trama in attesa di essere ricevuta. A seconda del protocollo ARQ può signicare
anche ACK no a N(R)-1. S è un campo utilizzato per specicare altre informazioni che verranno
descritte in seguito.

· Nella versione a 8 bit:


Contenuto: 1 0 S P/F N(R)
Numerazione: 0 1 2 3 4 5 6 7

· Nella versione a 16 bit:


Contenuto: 1 0 S 0 0 0 0 P/F N(R)
Numerazione: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

* Unnumbered (U) : Gestione del collegamento dati: inizializzazione, chiusura, reset per errore.

· Nella versione a 8 bit:


Contenuto: 1 1 M P/F M
Numerazione: 0 1 2 3 4 5 6 7

· Nella versione a 16 bit:


Contenuto: 1 1 M 0 0 0 0 P/F M
Numerazione: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

 Il campo P/F presente in varie trame del campo Control serve a identicare se il messaggio signica
domanda o risposta:

* P/F posto ad 1 serve a sollecitare una risposta (poll ) da parte della stazione primaria.
* P/F posto a 0 serve per segnalare una risposta ad un poll (nal ) da parte di una stazione secondaria.

ˆ Information ( 8 · n bit ): Può avere lunghezza variabile multipla di 8 bit. È sempre presente in trame di tipo I.

ˆ FCS (16 o 32 bit): Campo a 16 o 32 bit che svolte la funzione di rivelazione d'errore per la trama, utilizzando
il checksum di tipo CRC .

ˆ Nota: Il piggybacking viene sempre eettuato quando possibile.

Bit stung per il ag Per poter riconoscere l'inizio di una trama viene utilizzata una sequenza di sei 1 consecutivi,
preceduta e seguita da zeri. Cosa accade se questa sequenza è però già presente nella trama o nei dati? Come evitiamo
di confondere la ne della trama con un dato? Ci sono vari modi per risolvere questo problema. Quello scelto da
HDLC è il bit stung, che funziona nel seguente modo:

ˆ In invio, aggiungo un bit 0 dopo ogni occorrenza di 5 bit 1 (eccetto che nel ag )

ˆ In ricezione, dopo ogni gruppo di cinque 1, tolgo lo zero (se c'è) che segue.

CRC - Cyclic redundancy check

ˆ k= Lunghezza in bit del checksum CRC

ˆ n= Lunghezza in bit del messaggio da proteggere

ˆ Messaggio : [bn , bn−1 , bn−2 , ..., b2 , b1 , b0 ]

21
ˆ Deniamo un polinomio P (x) di grado n−1

P (x) = bn · X n−1 + bn−1 · X n−2 + ... + b1 · X + b0 · 1

ˆ Polinomio divisore D (x) di grado k, preassegnato dal protocollo.

 Esempio per k=4 abbiamo D (x) = x4 + x3 + 1


 Per k = 16:
* D (x) = x 16
+ x12 + x5 + 1 CRC-16EU
* D (x) = x 16
+ x15 + x2 + 1 CRC-16US

1. Moltiplico: P (x) · xk
2. Divido il risultato per D (x) con l'operazione di divisione tra polinomi e mi segno il resto R (x). Il mio checksum
è R (x).

(a) Possiamo esprimere l'intero messaggio (checksum compreso) con la notazione:

P 0 (x) = P (x) · xk + R (x)

3. In ricezione al posto di ricalcolare e confrontare, posso dividere P 0 (x) per D (x), se R (x) = 0 allora il checksum
è corretto.

ˆ Nella divisione tra polinomi in modulo 2, i segni non contano nulla (1 + 1 = 0 , 0 − 1 = 1).
ˆ Ricordarsi di sottrarre gli esponenti nella divisione tra polinomi.

Esempio k = 4 , n = 10 , Messaggio: 1001000101 , Divisore D (x) = x4 + x3 + 1


ˆ Il nostro polinomio è quindi P (x) = x9 + x6 + x2 + 1
ˆ P (x) · x k
= x13 + x10 + x6 + x4
x13 x10 x6 x4 x4 x3 1
x13 x 12
x 9

\ x12 x10 x9 x6 x4 x9 x8 x7 x5 x3 x1
x12 x 11
x8

\ x11 x10 x9 x8 x6 x4
x11 x10 x7

\ \ x9 x8 x7 x6 x4
x9 x8 x5

\ \ x7 x6 x5 x4
x7 x6 x3
5 4
\ \ x x x3
x5 x4 x
\ \ x3 x

ˆ Dunque il resto è R (x) = x3 + x e quindi l'FCS è 01010


ˆ P (x) = x
0 13
+ x10 + x6 + x4 + x3 + x Divisore D (x) = x4 + x3 + 1
x13 x10 x6 x4 x3 x x4 x3 1
x13 x 12
x 9

\ x12 x10 x9 x6 x4 x3 x x9 x8 x7 x5 x3 x1
x12 x 11
x8

\ x11 x10 x9 x8 x6 x4 x3 x
x11 x10 x7

\ \ x9 x8 x7 x6 x4 x3 x
x9 x8 x5

\ \ x7 x6 x5 x4 x3 x
x7 x6 x3
\ \ x5 x4 \ x
x5 x4 x
\ \ \

ˆ Avendo quindi R (x) = 0 il checksum è corretto.

22
Tipi di errori rilevabili

ˆ Errori su singolo bit, se D (X) ha almeno due termini

ˆ Errori su due bit, se D (X) non rappresenta un fattore di Xm + 1 per ogni valore di m minore della massima
lunghezza di trama ( 1 ≤ m < n+k )

ˆ Errori su un numero dispari di bit, se D (X) è esprimibile come fattore di X +1


ˆ Errori a burst, con lunghezza del burst inferiore o uguale a quella dell'FCS, cioè a k bit.

Tipi di trame S nel protocollo HDLC


Vengono utilizzate per il controllo di usso e di errore.

ˆ Recive ready (RR): Si tratta del messaggio di acknowledgement/riscontro utilizzato quando non faccio
piggybacking. Indico un ACK di N(R), cioè ho ricevuto no a N (R) − 1 e ora mi aspetto l'arrivo di N (R)
ˆ Recive not ready (RNR) : Si tratta del messaggio di acknowledgement/riscontro no a N (R) − 1 , però non
posso più ricevere! (Ad esempio perché ho il buer pieno)

ˆ Reject (REJ) : Messaggio NACK : mi manca la trama N (R), ma ho ricevuto no a N (R) − 1 . Messaggio
utilizzato nel protocollo go-back-n

ˆ Selective Reject (SREJ) :  NACK , mi manca la trama N (R), rimandala! Non ti dico niente sulle trame
precedenti. È possibile richiedere la ritrasmissione di più trame (ad esempio SREJ,7,0: rimandami le trame tra
0 e 7)

Tipi di trame U nel protocollo HDLC


ˆ SNRM/SNRME  Abilita NRM o NRM esteso (la versione estesa utilizza numerazione delle trame a 7 bit)

ˆ SARM/SARME  Abilita ARM o ARM esteso

ˆ DISC  Richiesta di disconnessione

ˆ UA  Informazioni di conferma (riscontro per messaggi di inizializzazione )

Protocollo ABM
ˆ È di tipo full duplex.

ˆ Si fa piggybacking dei riscontri sulle unità informative

ˆ I, 0, 1 signica trama informativa con N (S) = 0 e N (R) = 1


ˆ È possibile scegliere di sfruttare un protocollo go-back-n oppure selective repeat.

ˆ C'è il solito timeout To

ˆ È un protocollo pensato per una comunicazione punto-punto tra due stazioni

Protocollo NRM
ˆ È un protocollo half-duplex multiplato, dove c'è una stazione primaria e altre secondartie

ˆ L'inizializzazione del protocollo viene fatta con ciascun client della rete

ˆ Il bit P/F viene settato a P (poll ) dalla sorgente quando si aspetta una risposta dalla destinazione, viene invece
inviato il bit F (nal ) quando la destinazione manda l'ultimo pacchetto di risposta.

ˆ Una stazione secondaria aspetta di essere interrogata da una stazione primaria.

ˆ La scelta go-back-n/selective repeat è arbitraria.

23
Ecienza dei collegamenti HDLC ABM
Prendiamo a confronto l'utilizzo di go-back-n e selective repeat su un collegamento terrestre e uno satellitare.

ˆ Caso 1:

 b = 3 bit ⇒ N = 23 = 8
 Con go-back-n WR = 1 e WS = 7
 Con selective repeat WR = WS = 4

ˆ Caso 2:

 b = 7 bit ⇒ N = 27 = 128
 Con go-back-n WR = 1 e WS = 127
 Con selective repeat WR = WS = 64

Caso di un collegamento terrestre con probabilità di errore media

ˆ Per b=3 il protocollo di tipo go-back-n risulta leggermente più eciente di selective repeat perché la sua
nestra d'invio WS è più ampia.

ˆ Per b = 7 il protocollo di tipo selective repeat è sempre meglio di go-back-n . I due protocolli tuttavia si
eguagliano all'eccessivo aumento della lunghezza della trama.

Caso di un collegamento satellitare con probabilità di errore media Per la lunghezza di trama molto piccole
o molto grandi, go-back-n e selective repeat si eguagliano, però per b = 7 selective repeat è nettamente superiore.
Go-back-n ha prestazioni pessime perché manda un molte trame inutili perdendo parecchio tempo.

Caso di un collegamento con bassa probabilità di errore In caso di bassa probabilità di errore (ad esempio
p = 10−6 ), go-back-n è peggio di selective repeat ma non moltissimo. Per lunghezze di trama brevi go-back-n è
migliore.

Reti locali LAN (Local Area Network )


Spesso sono implementate con mezzo trasmissivo condiviso.

Tecniche ad accesso multiplo


ˆ Canalizzazione
 FDMA (Suddivisione delle frequenze)
 TDMA (Suddivisione a slot di tempo)
 CDMA (Suddivisione a divisione di codice)

ˆ Accesso dinamico
 Prenotazione: Si suddivide il tempo in slot in cui ciascuna stazione può segnalare la propria volontà di
trasmettere prenotandosi, poi ogni stazione in ordine inizia a trasmettere. È eciente ma richiede una
buona sincronia (costosa).

 Trasferimento di permesso: Usato nelle arcaiche reti token ring. C'è un gettone di permesso che ruota
tra i vari client e gli dà il permesso di trasmettere sulla rete.

 Accesso a contesa (o anche  accesso casuale ) Ogni stazione ha la liberà di decidere quando trasmettere,
se avviene una collisione di dati è necessario fermarsi è riprovare. Il canale di comunicazione è solitamente
a bus.

24
CSMA/CD (Carrier Sense Multiple Access / Collision Detection )
ˆ Il canale viene utilizzato in modo half-duplex .

ˆ Prima di iniziare qualunque comunicazione, la stazione ascolta il canale di comunicazione per vedere se è già
occupato (funzionalità di carrier sense ).

ˆ Rivelazione di collisioni dei segnali sul bus ed emissione di una sequenza di jamming.

ˆ Algoritmo di backo esponenziale binario:

 In seguito ad una collisione aspetto i · T secondi


 prima di trasmettere nuovamente. T = 51, 2µs è
 il tempo
di slot . i è un numero scelto a caso tra 0, ..., 2k − 1 dove k è il numero di collisioni avvenute.
 k resta sso a 10 come valore massimo. Dopo 16 collisioni consecutive viene dichiarato errore.

ˆ Se la trama trasmessa dalla sorgente non è abbastanza lunga, si rischia che la collisione torni quando ormai ho
terminato la trasmissione della trama e quindi penso che quella collisione non la riguardi.

ˆ Per evitare questo problema la condizione che deve essere soddisfatta, è che:

Lmin dmax
=2·τ =2·
C v
dove dmax è la distanza massima tra due stazioni e Lmin è la lunghezza minima delle trame trasmesse.

ˆ Nel caso di Ethernet classico abbiamo Lmin = 64Byte , C = 10 Ms b e quindi dmax = 5, 12 Km

Progetto IEEE802
Strati superiori Rete
(802.2) LLC
Collegamento dati
802.3 802.5 802.11 altro
CSMA/CD Token ring WiFi ...
Fisico
UTP,STP,bra ottica,radio,...

ˆ 802.1
Nel documento viene denita la struttura generale delle trame 802 e lo schema qui sopra disegnato

ˆ LLC - Logical Link Control : Ha il compito della gestione dei collegamenti logici tra i vari protocolli di
livello 2.

ˆ MAC - Medium Access Control : È specico per ogni tipo di LAN, anche se hanno caratteristiche comuni
tra loro (vedi MAC address in 802.3 e 802.11). Governa le procedure di accesso al mezzo trasmissivo.

Strato LLC (Logical Link Control )


ˆ Ha il compito di mostrare allo strato network una interfaccia unicata per tutti i vari protocolli di livello 2.

ˆ Il livello LLC è implementato a software (mentre il livello MAC solitamente è implementato in hardware)

ˆ Prende spunto da HDLC.

ˆ Fornisce servizi di:

 Servizio connectionless senza riscontro


 Servizio connection-oriented
 Servizio connectionless con riscontro

Struttura della trama


LLC DA LLC SA Control Information
1 Byte 1 Byte 1/2 Byte Variable

ˆ LLC DA (1 Byte): Indirizzo LLC di destinazione. Si tratta di indirizzi a livello applicativo all'interno delle
stazioni

ˆ LLC SA (1 Byte): Indirizzo LLC sorgente

ˆ Control (1 o 2 Byte a seconda del tipo di PDU): Sono denite PDU informative e supervisive, in cui il campo
di controllo è di 2 byte, mentre le PDU non numerate sono caratterizzate da un campo di controllo di 1 byte.
La struttura di questo campo è uguale a quella del protocollo HDLC

ˆ Information : Payload

25
Strato MAC (Medium Access Control ) generico
ˆ Provvede alla consegna delle unità informative LLC sulla rete

ˆ Gestisce l'indirizzamento tramite un indirizzo univoco chiamato  MAC Address 

Struttura della trama


MAC DA MAC SA Information FCS
6 Byte 6 Byte Variable 4 Byte

ˆ MAC DA : Indirizzo MAC di destinazione

ˆ MAC SA : Indirizzo MAC sorgente

ˆ Information : Payload

ˆ FCS : checksum

Indirizzi MAC

I MAC address sono indirizzi da 6 Byte (48 bit) univoci per ciascuna scheda di rete al mondo. Il mac address è

 
suddiviso in due parti:
(48 bit)

OUI Serial number

ˆ OUI : È l'identicatore del produttore della scheda di rete (24 bit)

ˆ Serial number : È un numero di serie univoco assegnato dal produttore alla scheda di rete (24 bit).

ˆ L'ultimo bit consente di distringuere tra indirizzi singoli di broadcast, globali o locali. FF : FF : FF : FF :
FF : FF è l'indirizzo di broadcast per inviare a tutte le stazioni della rete locale.

ˆ L'ordine di trasmissione è dal bit meno signicativo

ˆ Gli indirizzi universally administered e locally administered si distinguono per mezzo del settaggio del secondo
bit meno signicativo del byte più signicativo dell'indirizzo. Se il bit è a 0, l'indirizzo è universally locally
administered o local scope ; se viceversa è a 1, esso è globally administered o global scope.

Ethernet 802.3
Contenuto: Preamble SFD Destination Address Source Address Lenght LLC/PDU Padding FCS
Dimensione (Byte): 7 1 6 6 2 0-1500 0-46 4

ˆ Preamble : è una sequenza di bit stabilita a priori, destinata alla sincronizzazione del segnale.

ˆ SFD : è la sequenza 10101011 che contiene una violazione della codica Manchester. Viene utilizzato come Flag
per indentifcare l'inizio del frame.

ˆ Destination/Source Address : sono i MAC address destinazione e sorgente.

ˆ Lenght EtherType
/ : è la lunghezza del campo informativo seguente. Se il valore rappresentato è maggiore di
1500, si assume PDU pari a 1500 e si ignora Lenght.

 Nel primo standard 802.3 questo campo poteva conteneva la lunghezza size. Successivamente in  Ethernet
v2  questo campo venne chiamato EtherType, cioè il tipo di protocollo contenuto nel payload, dando
origine ad ambiguità. Per risolvere l'ambiguità in modo formale, venne rilasciata una correzione dello
standard 802.3, cioè lo standard IEEE 802.3x-1997, il quale stabilisce che quando si tratta di un numero
di protocollo, il campo deve contenere un valore superiore o uguale a 1536 (0x0600), mentre se il valore
è inferiore o uguale a 1500 si tratta della dimensione del payload. Questo valore fu scelto a causa della
lunghezza massima standard di 1500 Byte.

ˆ Padding : è un campo utilizzato per garantire che la lunghezza delle trame inviate sia sempre pari alla lunghezza
minima di 64 Byte .

ˆ FCS : è un codice a controllo di errore (checksum ) di tipo CRC-32.

ˆ IFG (Inter Frame Gap) : Non si tratta di un campo della trama. È il tempo di attesa tra la ne di una trama
e l'inizio della seguente. Per Ethernet classico abbiamo IF G = 9, 6µs

26
Mezzi trasmissivi per Ethernet a 10Mb/s (802.3)

XBaseY dove X =velocità in Mb/s , Base signica in banda base, Y è la lunghezza massima del cavo o altro.
10Base5 10Base2 10Base-T 10Base-FP 10Base-FL 10Base-FB
Cavo coassiale Cavo coassiale Doppino UTP Fibra ottica Fibra ottica Fibra ottica
500m max. 185m max. 100m max. 500m max. 2000m max. 2000m max.
100 stazioni max 30 stazioni max. 2 senza hub 33 con hub 2 stazioni max 2 stazioni max
Link segment Link segment Link segment

Dettagli per 10Base5

ˆ Due stazioni devono essere distanti almeno 2,5m tra di loro

ˆ Il cavo che collega la stazione al bus (cavo AUI ) non può essere più lungo di 50m.

Dettagli per 10Base2

ˆ Due stazioni devono essere distanti almeno 0,5m tra di loro.

ˆ Il cavo che collega la stazione al bus (cavo AUI ) non può essere più lungo di 50m.

Regole di interconnessione

ˆ Nel seguito considereremo un hub come un repeater con più porte. In realtà l'hub emette anche jamming per
aiutare CSMA/CD.

ˆ Ethernet classico utilizza sempre la codica manchester

ˆ Un dominio di collissione è una zona dove sicamente le stesse trame ethernet possono collidere tra loro.

ˆ In base ad alcune regole empiriche:

 Tra due stazioni qualunque ci possono essere al massimo:

* 5 segmenti

* 4 repeater

* 2 transreciver

 Nel caso di 5 segmenti e 4 ripetitori:

* Massimo 3 mixing segmenti

Fast Ethernet (802.3u) - Ethernet a 100Mb/s (1995)


ˆ Trama uguale a Ethernet classimo, cambiano i tempi:

 Tf M IN = 5, 12µs , Lf M IN = 64 Byte , Slot time = 5, 12µs , C = 100 Ms b


 Limite teorico: 500m , limite reale: 250m

ˆ Introdotto il full-duplex utilizzando due canali di comunicazione con switch

ˆ Viene aggiunto uno strato di riconciliazione dei mezzi sici sotto a CSMA/CD

100Base-TX 100Base-FX 100Base-T4 100Base-T2


2 UTP CAT5 Fibra ottica 4 UTP CAT3 2 UTP CAT3

ˆ Stella
4B5B-MLT-3
Stella
4B5B-NRZ-I
Stella
8B6T
Stella
PAM5x5
Full-duplex Full-duplex Half-duplex Full-duplex
100m 100m 100m 100m

27
Gigabit Ethernet (802.3z) - Ethernet a 1Gb/s (1998)
ˆ Viene aggiunto alla trama ethernet un campo  extension  dopo FCS, per garantire una lunghezza minima della
trama di 512 Byte.

ˆL f M IN = 512 Byte , Tf M IN = 4, 096µs , dteorica = 400m


ˆ La distanza massima reale è 200m
ˆ È possibile trasmettere più trame consecutive senza interporre l'IFG.

ˆ Full duplex solo se uso switch-switch oppure switch-endsys.

ˆ 1000Base-T = 25m

ˆ 1000Base-SX = 550m

10 Gigabit Ethernet (802.3ae) - Ethernet a 10Gb/s (2003)


ˆ Solo full-duplex

ˆ Vietato l'uso di hub

ˆ Permesso solo l'utilizzo di bra ottica come mezzo trasmissivo.

100 Gigabit Ethernet (802.ba) - Ethernet a 100Gb/s e 40Gb/s (2010)


ˆ Richiede apparati molto potenti, permette di scegliere tra 40Gb/s e 100Gb/s.

LAN Wireless - WiFi (802.11)


Con la diusione di dispositivi mobili, si è pensato di standardizzare dei protocolli a livello 2 per utilizzare le onde
radio come mezzo trasmissivo. L'utilizzo delle onde radio porta numerosi problemi che non è possibile risolvere
interferenze
applicando le stesse idee utilizzate per Ethernet standard. Basti pensare ai problemi dei disturbi e delle
elettromagnetiche, allapiccola quantità di spettro elettromagnetico a disposizione, la variabilità della potenza
del segnale e la necessità di gestire problemi relativi al risparmio di energia.
Lo sviluppo delle wireless LAN ha avuto luogo facendo uso di porzioni dello spettro elettromagnetico non soggette
per denizione a regolamentazione e quindi utilizzabili da chiunque (senza bisogno di licenze). Queste porzioni di
spettro sono chiamate ISM (Instrumental, Scientic, Medical ) e sono in tre gruppi: 900 MHz, 2.4GHz, 5GHz.
Gli standard sviluppati per le reti wireless sono tutti sottostandard del più generale IEEE 802.11 (la cui prima
versione risale al 1997), spesso chiamato informalmente WiFi (Wireless Fidelity ).

Strato sico di 802.11


Lo strato sico di 802.11 è stato suddiviso concettualmente in due parti:

ˆ Physical Layer Convergence Procedure (PLCP)


ˆ Physical Medium Dependent (PMD)
Phyisical Layer Convergence Procedure

In questa parte dello strato sico si specica come riuscire a trasmettere ecaciemente le trame MAC sul mezzo sico.
A dierenza di Ethernet, sul mezzo sico non viene inviata la trama MAC direttamente, ma è incapsulata a sua
volta all'interno di una PLCP PDU strutturata come segue:
PLCP Preamble PLCP Header PLCP SDU

ˆ PLCP Preamble : realizza la funzione di sincronizzazione in ricezione e segnala l'inizio della trama

ˆ PLCP Header : specica i parametri utilizzati nella trasmissione, come ad esempio la frequenza di cifra, la
lunghezza della PLCP SDU e fornisce funzionalità di controllo d'errore.

ˆ PLCP SDU (Physical Layer Convergence Procedure - Service Data Unit ): è la parte che contiene la trama del
sottostrato MAC.

Si noti che l'header della trama PLCP svolge funzioni speciche ed aggiuntive rispetto a quelle svolte a livello MAC.

28
Physical Medium Dependent

In questa parte dello strato sico si descrivono i vari metodi di trasmissione sica.
Come già accennato, IEEE 802.11 utilizza come bande radio le frequenze ISM; in particolare sono utilizzate le
frequenze 2,4GHz e 5GHz.
Nel primo standard IEEE 802.11 i metodi di trasmissione erano tre e operavano nell'ordine dei 1-2Mb/s:

ˆ Infrared

ˆ Frequency Hopping Spread Spectrum ( FHSS )

ˆ Direct Sequence Spread Spectrum ( DSSS )

I due metodi a spettro diuso (spread spectrum ) eettuano la trasmissione di un usso di dati di B bit/s utilizzando
una banda W molto più grande della frequenza di cifra del segnale numerico da trasmettere. Questo signica che il
W
rapporto
B è molto maggiore di 1 . Il motivo di questa scelta è tentare di combattere le interferenze che possono
interessare il segnale trasmesso.

Infrared È un metodo di trasmissione a infrarossi che funziona in modo simile ai telecomandi operando su lunghezza
d'onda 850-950 nm con modulazione PPM (Pulse Position Modulation ) ed uno schema di codica chiamato  codice
Gray che riduce gli errori dovuti alla sincronizzazione. La trasmissione può avvenire in modalità punto-punto o in
modalità diusa. In questo secondo caso si ha lo svantaggio di una bassa copertura (10-20 metri) e l'interferenza
dovuta ai raggi solari.

Frequency Hopping Spread Spectrum (FHSS) Vengono utilizzati 79 canali larghi 1Mhz ciascuno, che iniziano
dal margine inferiore della banda ISM a 2,4GHz. La sequenza numerica da trasmettere viene modulata con tecnica
FSK (Frequency Shift Keying ) su una portante che viene cambiata frequentemente in modo pseudocasuale. Tutte le
stazioni conoscono il seme casuale utilizzato per generare le frequenze, quindi possono mantenere la sincronizzazione.
La quantità di tempo spesa in ogni frequenza, ossia il tempo di rotazione, è un parametro regolabile che deve essere
minore di 400 msec. La rotazione della frequenza portante permette di ottenere un po' di sicurezza contro inter-
cettazioni (un attaccante deve conoscere il seme di rotazione) e rende il sistema abbastanza insensibile alle interferenze
radio. Ha buone prestazioni anche per collegamenti su lunghe distanze. Il suo svantaggio principale è la banda ridotta.

Direct Sequence Spread Spectrum (DSSS) In questa tecnica ogni bit viene trasformato in una sequenza di
segnali elementari chiamati chip (utilizzando la sequenza Barker ), che vengono trasmessi mediante modulazione
PSK (Phase Shift Keying ). Per la trasmissione dei ussi a 2Mb/s viene utilizzata la modulazione QPSK (Quaternary
Phase Shift Keying).

Physical Medium Dependent - I nuovi standard

Successivamente a questi primi metodi di trasmissione, sono stati standardizzati nuovi metodi che utilizzano velocità
superiori: 802.11a, 802.11b, 802.11g, 802.11n.

802.11a Utilizza la banda ISM intorno ai 5 GHz per distribuire no a 54 Mb/s. La tecnica di modulazione
multiportante utilizzata è OFDM (Orthogonal Frequency Division Multiplexing ), che utilizza 52 frequenze (48 dati e
4 per la sincronizzazione) e trasmette contemporaneamente su più frequenze nello stesso momento. Anche se la velocità
massima è 54Mb/s, sono state denite altre velocità operative tra cui scegliere, ed è possibile operare anche a 6Mb/s.
Viene utilizzata la modulazione PSK per le velocità no a 18Mb/s, QAM (Quadrature Amplitude Modulation ) per
velocità superiori. OFDM era stato scelto per garantire la compatibilità con un altro standard europeo chiamato
HiperLAN/2.

802.11b Nonostante il nome, questo standard è stato approvato e messo sul mercato prima di 802.11a. Questo
standard viene chiamato anche HR-DSSS (High Rate Direct Sequence Spread Spectrum ).
Si basa sulla modulazione spread spectrum come DSSS, utilizza però una tecnica di codica più complessa chiamata
CCK (Complementary Code Keying ).
Sono denite quattro velocità possibili per il usso dati: 1, 2, 5.5 e 11 Mb/s. La velocità da utilizzare viene scelta
automaticamente analizzando la qualità del canale. Per garantire la retrocompatiblità con DSSS, alle velocità 1 e 2
Mb/s si utilizza lo stesso metodo di codica di DSSS. Per le ultime due velocità si opera a 1,375 Mbaud con 4 e 8 bit
per baud, usando i codici Walsh/Hadamard .
802.11b è più lenta di 802.11a, ma il suo campo d'azione è circa sette volte più ampio.

802.11g Nel Novembre 2001 è stato pubblicato questo nuovo standard, derivato da 802.11b.
Viene utilizzato il metodo di modulazione OFDM (come in 802.11a) ma opera nella più ristretta banda ISM del
2,4 GHz. La velocità massima utilizzabile è 54 Mb/s.

29
Struttura della rete
In una rete radiomobile si distinguono due tipi di congurazioni: servizio radiomobile base e il servizio radiomobile
esteso.
Nel servizio di tipo base le stazioni, il cui insieme è chiamato BSS (Basic Service Set ), possono comunicare l'una
con l'altra senza restrizioni. Se presente, un'altra stazione chiamata AP (Access Point ) agisce da stazione radio base
che consente la comunicazione delle altre stazioni con altri apparati remoti di rete. Se non è presente nessun Access
Point, la rete prende il nome di rete ad-hoc .
È possibile collegare tra loro più insiemi di BSS in un ESS (Extended Service Set ). Ciò viene realizzato con
l'interconnessione degli AP delle varie BSS mediante un sistema di distribuzione (DS , Distribution System ), che è
tipicamente una LAN cablata (per esempio una rete Ethernet).

Il problema della stazione nascosta/esposta


Nonostante il successo delle reti Ethernet, le reti wireless non utilizzano il protocollo CSMA/CD. Il motivo principale
è che con i collegamenti radio, la potenza del segnale ricevuto è strettamente dipendente dalla positizione del terminale
e quindi non si ha più la certezza di poter rilevare collisioni.
Il problema più noto nelle reti radiomobili è il problema della  stazione nascosta . Poiché non tutte le stazionisono
all'interno del campo radio delle altre, le trasmissioni che avvengono in una parte della cella possono non essere ricevute
in un'altra parte della stessa cella. Può dunque succedere che una stazione, che non riceve i segnali di altre che stanno
comunicando tra loro, pensi erroneamente che il canale di comunicazione sia libero e inizi a trasmettere.
Il problema complementare, cioè quello della  stazione esposta  accade quando una stazione rileva del traco adia-
cente e decide di non trasmettere, anche se la sua destinazione è pronta a ricevere e la trasmissione non inuenzerebbe
il traco adiacente.

Protocollo CSMA/CA
È un protocollo di accesso diverso che cerca di prevenire le collisioni. Il nome CSMA/CA signica Carrier Sense
Multiple Access with Collision Avoidance .
Dunque abbiamo ancora la funzione di  sensing del canale ma la possibile presenza di collisioni viene gestita in
modo diverso. CSMA/CA supporta due modalità operative:

ˆ Nella prima modalità la stazione controlla se il canale è libero prima di trasmettere. Durante la trasmissione la
stazione non controlla il canale ma emette l'intero frame, che può comunque rimanere danneggiato. Se il canale
è occupato la stazione rimanda l'operazione no a quando il canale non diventa libero e poi invia i dati. In caso
di collisione, le stazione coinvolte rimangono in attesa per un tempo casuale adottando l'agoritmo di backo
esponenziale binario, quindi ritentano.

ˆ Nell'altra modalità operativa di CSMA/CA (basata su MACAW ), viene utilizzato un meccanismo di controllo
di presenza del canale virtuale più sosticato. Viene introdotta la procedura di esplicita autorizzazione alla
trasmissione da una stazione all'altra, eseguita mediante l'invio di una trama Request To Send (RTS ) , cioè
richiedo invio e risposta positiva con una trama Clear To Send (CTS ) cioè puoi inviare. Naturalmente
pur adottando questo meccanismo le collisioni possono comunque avvenire. Si prevede quindi che le trame dati
ricevute correttamente siano esplicitamente riscontrate inviando una trama di acknowledgement (ACK ) cioè
di riscontro. Di seguito ci riferiremo sempre a questa seconda modalità operativa (la prima è poco
utilizzata).

A causa di svariati motivi, il tasso di errore sulle reti wireless è nettamente superiore a quelle cablate. Per questo motivo
si prevede che le trame dati di lunghezza superiore ad una data soglia vengano suddivise in frammenti consecutivi.
In questo modo si limita il numero delle trame da ritrasmettere in caso di errore. Ogni trama ha il proprio checksum,
i frammenti sono numerati e inviati con una sorta di protocollo stop-and-wait.

Protocollo di accesso
Lo standard 802.11 prevede due modalità di accesso al canale radio condiviso:

ˆ Distributed Coordination Function (DCF ): Modalità distribuita di accesso al mezzo secondo il protocollo
CSMA/CA che può dar luogo a collisioni.

ˆ Point Coordination Function (PCF ): Procedura aggiuntiva che può essere eettuata in presenza di un Access
Point per evitare l'occorrenza di collisioni. Questa seconda modalità è utilizzata molto raramente.

La seconda modalità operativa prima discussa si basa tutta su un discorso di dierenziazione dei tempi di ritardo,
quattro diversi intervalli minimi di
per gestire la priorità nell'accesso al mezzo trasmissivo. Vengono identicati
tempo tra le trasmissioni di trame consecutive, detti InterFrame Spacing (IFS ) che elenchiamo qui dal più breve al
più lungo:

30
ˆ Short Interframe Spacing (SIFS ): Minimo tempo di attesa dopo la rivelazione della ne trasmissione di una
trama. È anche il tempo atteso prima di trasmettere trame ad alta priorità, che sono:

 Trame CTS, ACK


 Trame di risposta a interrogazioni dell' AP
 Frammenti successivi di altri frammenti trasmessi con successo

ˆ PCF InterFrame Spacing (PIFS ): Intervallo di tempo intermedio utilizzato per garantire priorità di accesso al
mezzo nella modalità PCF.

ˆ DCF InterFrame Spacing (DIFS ): Intervallo di tempo più lungo adottato dalle stazioni che operano in modalità
DCF per trasmettere il primo frammento delle trame dati e trame di gestione.

ˆ Extended InterFrame Spacing (EIFS ): L'intervallo di tempo dopo cui una stazione che ha ricevuto un frammento
danneggiato/sconosciuto può annunciarlo alle altre stazioni.

Questi tre tipi di ritardi sono calcolati a partire dal momento in cui termina l'occupazione del canale. All'intervallo
di tempoDIFS soltanto segue un intervallo di tempo, detto nestra di contesa, in cui le stazioni che operano in
modalità DCF tentano di prendere il controllo del canale mediante l'utilizzo del protocollo CSMA/CA. Lo slot di
contesa τ è nell'ordine dei 5 − 50µs.
Di seguito è illustrato il diagramma a stati delle operazioni su CSMA/CA (riferito alla modalità DCF):

Descriamo ora il funzionamento del protocollo nei due casi DCF e PCF

Modalità DCF

È la modalità maggiormente utilizzata.


Partiamo dall'esempio della comunicazione rappresentato in gura:

31
In questo esempio ipotizzeremo l'assenza di collisioni di cui comunque parleremo dopo.

ˆ La stazione A ha una trama da inviare alla stazione B. Aspetta un intervallo di tempo DIFS in cui si assicura
che il canale sia libero e poi trasmette una trama RTS di richiesta trasmissione destinata alla stazione B.

ˆ La stazione B attende un tempo SIFS e acconsente alla trasmissione inviando ad A una trama CTS.

ˆ La stazione A attende un tempo SIFS dalla ricezione della trama CTS e inivia i dati.

ˆ Dopo un intervallo di tempo SIFS successivo all'invio dei dati, la stazione B invia una trama ACK per confermare
l'avvenuta ricezione dei dati.

Al ne di evitare altre trasmissioni mentre la stazione A sta inviando, che possono provocare collisioni, le trame RTS e
CTS contengono al loro interno l'informazione sull'intervallo di tempo di occupazione del mezzo trasmissivo per l'invio
e il riscontro della trama in questione (compresi gli intervalli SIFS). Questa informazione di occupazione è chiamata
NAV (Network Allocation Vector ).
Le altre stazioni che ricevono queste trame (RTS e CTS) restano inattive durante l'intervallo di tempo NAV
(signicato dei blocchi NAV per le stazioni C e D nella gura precedente). Il fatto che l'indicazione del tempo sia
anche all'interno della trama CTS (oltre a quella RTS) permette di fare in modo che se ad esempio D non riceve il
segnale di A ma riceve quello di B, riesce ad accorgersi comunque che è in corso una trasmissione. Questo meccanismo
risolve il problema della stazione nascosta.

Caso del canale occupato Una stazione che rivela il canale occupato, attende che il canale permanga libero per
un tempo DIFS. Ciò garantisce che le trasmissioni a priorità superiore (cioè tutte quelle che attendono un intervallo
di tempo inferiore a DIFS) possano essere eettuate. Se il canale risulta libero dopo un tempo DIFS, viene trasmessa
la trama RTS di richiesta di trasmissione. Altrimenti la stazione applica l'algoritmo di backo.

Algoritmo di backo di CSMA/CA Se si entra in fase di backo, la trasmissione viene ritardata di un tempo
casuale di i slot, selezionato a caso all'interno di un intervallo di durata massima di K slot. K cresce man mano con
il numero di tentativi di trasmissione che non hanno successo. Il valore iniziale dell'intervallo è K = 7 slot, così che il
ritardo iniziale è un numero di slot tra 0 e 7. 22+i − 1 slot.
Al tentativo i -esimo, l'intervallo ha ampiezza massima
Una particolarità dell'algoritmo di backo utilizzato da CSMA/CA è che gli slot di attesa vengono calcolati solo
durante le eettive nestre di contesa, cioè quando il mezzo è libero. Il conteggio degli slot di attesa viene sospeso
se si rivela una nuova trasmissione in corso. Il conteggio viene ripreso un intervallo di tempo DIFS dopo la ne
dell'occupazione del canale. Esaurito il backo si trasmette la trama RTS.

Collisioni Nonostante il protocollo implementi i meccanismi di permesso con RTS, CTS e il backo, possono
comunque avvenire delle collisioni tra le trame. Può infatti succedere che due stazioni emettano una trama RTS
nello stesso slot temporale. In questo caso la stazione destinataria non emette (come previsto) la trama CTS entro un
tempo SIFS e quindi la stazione che ha emesso la trama RTS applica l'algoritmo di backo.
Questo meccanismo si applica anche quando una trama dati non viene riscontrata da una trama ACK dopo un
tempo SIFS. In quest'ultimo caso si noti che è possibile che ci sia un errore sulla trama dati (quindi scartata dalla
destinazione ricevente che non conferma con ACK), sia una collisione che ha interessato la trama di riscontro ACK,
che non torna al mittente.
Per risolvere questi problemi le trame e i frammenti sono numerati, cosa che permette di riconoscere duplicati in
caso di ritrasmissioni.

Frammenti Come già accennato prima, la trasmissione del primo frammento dati richiede un tempo di attesa DIFS,
mentre i successivi frammenti vengono inviati dopo un intervallo di tempo libero SIFS. In questo modo si dà priorità
al completamento della trasmissione di tutti i frammenti di una trama rispetto all'invio di nuove trame.

32
Modalità PCF

Nella modalità PCF (raramente utilizzata), una stazione agisce da coordinatore (Coordination Point, P C) e controlla
in modo centralizzato l'accesso al mezzo trasmissivo. Questo meccanismo di controllo centralizzato avviene in modo
simile a quanto già visto per la modalità NRM del protocollo HDLC. Quindi in modalità PCF non possono vericarsi
collisioni a priori, dato che è la stazione centrale a gestire tutti i permessi. La stazione PC risiede su un Access Point
e attiva la modalità PCF inviando una trama speciale dopo un tempo PIFS dall'ultima occupazione del canale. La
stazione PC invia poi delle trame di interrogazione  poll  a cui le stazioni rispondono con una distanza temporale pari
ad un intervallo SIFS.

Servizi e trama di 802.11


Nel protocollo 802.11 ci sono tre tipi principali di trame:

ˆ Trame di gestione
 Autenticazione
 Associazione
 Sincronizzazione
 ...

ˆ Trame di controllo
 RTS, CTS, ACK

ˆ Trame dati
Servizi oerti

Lo standard 802.11 stabilisce nove servizi che ogni LAN wireless deve fornire. I primi cinque sono servizi di dis-
tribuzione (riguardano la gestione dell'appartenenza alla cella), gli altri quattro sono servizi stazione (si occupano
dell'attività all'interno della singola cella).

1. Associazione: Servizio utilizzato dalle stazioni mobili per eettuare la connessione alla stazione base. La
stazione annuncia la propria identità e le funzionalità (velocità, servizi PCF, gestione alimentazione), la stazione
base può decidere se accettare o meno. Se accetta il passo successivo è l'autenticazione

2. Separazione: La stazione mobile o quella base possono separarsi interrompendo la relazione. Una stazione
mobile dovrebbe utilizzare questo tipo di messaggio per avvisare la stazione base prima di lasciare la cella.

3. Riassociazione: Con questo servizio una stazione mobile può cambiare la propria stazione base da una cella
all'altra. Se viene sfruttata correttamente, questa funzionalità permette di evitare la perdita di dati nel passaggio
da un access point all'altro.

4. Distribuzione: Servizio che stabilisce come instradare i frame verso la stazione base. Se la stazione base è
direttamente accessibile verranno inviati via radio, altrimenti via rete cablata.

5. Integrazione: Servizio che permette la traduzione tra indirizzi di tipo diverso per instradare un frame attraverso
una rete non 802.11.

(seguono le operazioni interne alle celle aettuate solo dopo l'associazione)

1. Autenticazione: Per garantire la sicurezza nell'accesso alla rete, la stazione base manda un frame challenge per
vedere se la stazione mobile conosce la risposta, se la conosce la stazione mobile risponde con un frame cifrato
alla stazione base, per confermare di conoscere il segreto condiviso. Se il risultato è corretto la stazione mobile
viene denitivamente registrata all'interno della cella.

2. Invalidamento: Quando si desidera abbandonare la rete, si invalida l'autenticazione precedentemente eettuata.

3. Riservatezza: Le informazioni trasmesse sulla LAN wireless possono essere cifrate per garantirne la riservatezza.
Questo servizio gestisce la codica e decodica dei dati. Il sistema che gestisce la riservatezza, integrato nello
standard 802.11 è WEP (Wired Equivalent Privacy ) che fa uso di RC4 come algoritmo di cifratura. Questo
sistema ha soerto di seri problemi di progettazione, che permettono ad un attaccante di violare la sicurezza di
una rete WEP nel giro di pochi minuti. In risposta a questi problemi di sicurezza sono stati inventati i sistemi
WPA (Wi-Fi Protected Access ).

4. Trasferimento dei dati: 802.11 fornisce ovviamente un modo per trasmettere e ricevere dati. Così come
Ethernet però la trasmissione non è adabile e gli strati superiori devono gestire il rilevamento e la correzione
degli errori.

33
Formato di trama

La trama del sottostrato MAC del protcollo 802.11 è strutturata come segue:
Contenuto: FC Duration/ID Address 1 Address 2 Address 3 Seq.Control Address 4 Info FCS
Byte 2 2 6 6 6 2 6 0-2312 4
Discuteremo dei vari campi Address nel segito, vediamo il signicato dei vari campi:

ˆ FC , Frame Control (2 Byte): Comprende un sottinsieme di informazioni strutturate come segue:

Prot.Ver. Type Sub Type To DS From DS More Flag Retry Pwr Mng More Data WEP Order
2 bit 2 bit 4 bit 1 bit 1 bit 1 bit 1 bit 1 bit 1 bit 1 bit 1 bit

ˆ I cui campi sono:

 Protocol Version (2 bit): Specica la versione del protocollo (quella corrente è la 0)


 Type (2 bit): Distingue tra 3 tipi di trama: gestione (00), controllo (01) e dati (10)
 SubType (4 bit): Specica ulteriormente il sotto tipo di trama: (sotto-)trama di assocazione (trama di
gestione), (sotto-)trama RTS (trama di controllo)

 To DS (1 bit): Specica come interpretare i campi indirizzo


 From DS (1 bit): Specica come interpretare i campi indirizzo
 More Flag (1 bit): Settato se si tratta di un frame frammento
 Retry (1 bit): Specica se la trama è una ritrasmissione o è la prima volta che viene trasmessa
 Power Management (1 bit): Indica lo stato attivo o in risparmio energetico della stazione radiomobile.
 More Data (1 bit): Indica alla stazione in stato di risparmio energia che ci sono altre trame in attesa
nell'AP indirizzate alla stessa stazione.

 WEP (1 bit): Indica che l'informazione trasportata dalla trama è cifrata mediante il sistema WEP.
 Order (1 bit): Specica alla stazione destinazione che le trame devono essere elaborate nell'ordine inviato.

ˆ Duration/ID (2 Byte): Indica la durata di occupazione prevista del canale (NAV ), espressa in microsecondi. Se
si utilizza la modalità PCF, nel caso di trame di controllo per interrogazione (poll) indica invece l'identicazione
dell stazione sorgente della trama che sta rispondendo ad una interrogazione.

ˆ Sequence Control numero del frammento della trama in corso di


(2 Byte): Indica, con i primi 4 bit il
trasmissione e con i successivi 12 bit il numero di sequenza (tra 0 e 4095). Ovviamente il numero di trama è
lo stesso per più frammenti della stessa trama.

ˆ Information (0-2312 Byte): Contiene le informazioni del protocollo superiore trasportate dalla trama (il livello
LLC ).

ˆ FCS , Frame Check Sequence (4 Byte): Contiene il codice di controllo d'errore (checksum) di tipo CRC-32.

I diversi signicati dei quattro campi  Address  dipendono dai valori assunti dai campi to DS e From DS. In ogni
caso gli indirizzi sono MAC address a 48 bit, strutturati allo stesso modo di quelli Ethernet.
Di seguito una tabella riassuntiva con le varie congurazioni:
Caso To DS From DS Address 1 Address 2 Address 3 Address 4 Tipo di trama
A 0 0 Dest. Addr. Source Addr. BSS ID - punto-punto
B 0 1 Dest. Addr. BSS ID Source Addr. - Uscente dal DS
C 1 0 BSS ID Source Addr. Dest. Addr. - Entrante nel DS
D 1 1 Reciver Addr. Transmitter Addr. Dest. Addr. Source Addr. Da BSS a BSS

ˆ Nel caso A il trasferimento della trama avviene all'interno della BSS, di cui viene specicato l'identicatore.

ˆ Il caso B si riferisce ad una trama inviata dal sistema di distribuzione (DS) a una stazione di cui si specica
l'indirizzo all'interno di un dato BSS.

ˆ Il caso C, speculare al precedente, si riferisce ad una trama inviata da una stazione all'interno di un dato BSS
verso il sistema di distribuzione (DS)

ˆ Il caso D si riferisce alla trasmissione di una trama tra stazioni di BSS dierenti. Il reciver address indica
l'indirizzo MAC dell'AP di transito nel BSS sorgente che riceve, allo stesso modo trasmitter address indica
l'indirizzo dell'AP del BSS di destinazione.

34
Prestazioni delle reti LAN
Metriche
ˆ Traco smaltito

ˆ Probabilità di perdita

ˆ Tempo di attraversamento

 Ritardo causato dal buer


 Ritardo di trasmissione
 Ritardo di propagazione

Parametri
ˆN= Numero dei nodi (esclusi i punti di attraversamento)

ˆ λ= Frequenza media di arrivo in una generica stazione delle unità informative

ˆ C= Velocità della rete


 bit 
s

ˆ L= Lunghezza ssa del pacchetto trasmesso

Conseguenze
ˆ Traco oerto alla rete (da tutti): A = N · (λ · L) o
 bit 
s

ˆ Traco smaltito dalla rete: A = (N · λ · L) · (1 − π ) S p

 πp è la proababilità di errore per pacchetto

ˆ Se ipotizziamo πp = 0 allora il throughtput di rete normalizzato è S=ρ= (N ·λ·L)


C [Erlang] = [1]

 0≤ρ≤1 indica la quantità di tempo in cui la rete è occupata


 bit 
 T HR = S · C s

ˆ Nel seguito considereremo il mezzo trasmissimo ideale e privo di errori

Traco su una rete TDMA


Trama 1 Trama 2 Trama 3
1 2 3 ... N 1 2 3 ... N 1 2 ...
 NL
C   NL
C 
ˆ Per ogni slot il tempo di trasmissione è TT = L
C

ˆ S=ρ= N ·λ·L
C

ˆ Trascurando il tempo di propagazione, abbiamo 3 componenti di ritardo:

 TT tempo di trasmissione nel mezzo


 TW tempo di attesa nella stazione (attesa che i pacchetti nel buer vengano inviati)

 TSync tempo di sincronizzazione, di attesa per l'arrivo dello slot assegnato

ˆ T
Il tempo W è determinato da una coda di tipo M/D/1
ˆT = W · = ρ
2·(1−ρ) · 1
µ
ρ
2·(1−ρ)
N ·L
C

ˆT = · Sync
N ·L
C
1
2 mediamente

ˆ Delay di attraversamento medio :

L ρ N ·L N ·L
DT DM A = + · +
C 2 · (1 − ρ) C 2·C

ˆ Delay di attraversamento medio normalizzato:


DT DM A N ·ρ N
D̂T DM A = =1+ +
TT 2 · (1 − ρ) 2

35
Traco su una rete FDMA
Stazione 1 Stazione 2 ... ... Stazione N
  C
  C
 C

C
N N N t

ˆ Assumiamo1 bit
Hz

ˆT = T = L
=
V elocità [s] L
C
N
N ·L
C

ˆ S =ρ=λ·T =λ· [ T ] = [1] N ·L


C Erlang con sempre 0≤ρ≤1
ˆ M/D/1
Ipotizziamo ancora una coda di tipo

ˆ Delay di attraversamento medio:


N ·L ρ N ·L
DF DM A = + ·
C 2 · (1 − ρ) C

 Il termine NC·L è da intendere come il tempo di trasmissione TT


ρ N ·L
 Il termine 2·(1−ρ) · C è il tempo TW nel buer

 Non c'è tempo di sync

ˆ Delay di attraversamento medio normalizzato:


N · (2 − ρ)
D̂F DM A =
2 · (2 − ρ)

osserviamo quindi che rispetto al caso TDMA:

N
D̂F DM A = D̂T DM A + −1
2

ˆ Quindi TDMA è soprendentemente più eciente di FDMA.

Protocollo ALOHA
ˆ Niente carrier sensing, niente collision detection

ˆT = T Tempo di trasmissione del pacchetto

ˆ S= Numero medio di trasmissioni con successo in un intervallo di tempo T


ˆ G= Numero medio di trasmissioni tentate in un intervallo di tempo T

ˆ Arrivo dei pacchetti con distribuzione di Poisson con Λ= G


T

ˆ S={ Probabilità di passare} = G · {Probabilità che in 2·T non trasmette nessuno} = G · e−2·G
1
 Il massimo si ottiene per G= 2 ⇒ S = 0, 184 cioè passa al massimo solo il 18% del traco!

ˆ In base alla metrica del ritardo:


DALOHA = e2·G − 1 · TT + 2 · τ + k−1
 
 2 · TT + TT + τ

*Il termine e
2·G

− 1 rappresenta il numero di tentativi senza successo per ottenere una trasmissione
che vada a buon ne.

* Il termine
k−1
2 · TT rappresenta la media del tempo di backo.

 Abbiamo quindi un delay di attraversamento medio normalizzato pari a D̂ALOHA = e2·G − 1 ·
k+1

2 +2·a +1+a
 Se aumento S e k,D tende ad esplodere

36
Interconnessione di reti locali
ˆ Dominio di collisione : È una zona della rete dove due trame provenienti da due stazioni, possono collidere
tra di loro.

ˆ Dominio di broadcast : È l'insieme delle stazioni di una rete a cui viene consegnata una trama con indirizzo
broadcast generata da una qualunque delle stazioni stesse.

Interconnessione tramite repeater o hub


Si tratta di due tipi di dispositvi hardware che lavorano a livello protocollare 1 (sico)

ˆ Quando è semplicemente necessario amplicare il segnale attenuato dai limiti sici del mezzo, possiamo utilizzare
un repeater che legge il segnale in ingresso e lo ritrasmette amplicato.

ˆ Quando dobbiamo connettere più stazioni allo stesso mezzo condiviso, con i cavi UTP è necessario utilizzare
un hub. Un hub è sostanzialmente un repeater con più porte. Un hub legge il segnale ricevuto su una porta
e lo ritrasmette su tutte le altre. In realtà c'è una piccola dierenza: quando un hub intercetta una collisione,
provvede ad emettere la sequenza di jamming su tutte le porte, cosa che il repeater non fa.

 Un hub unisce domini di collisione e broadcast.

Interconnessione tramite bridge (e switch)


Un bridge è ben più evoluto di un hub. Esso infatti non si limita a ritrasmettere segnali a livello sico, ma si occupa
anche di leggere le trame informative di livello 2 che vengono ricevute. Un bridge può interconnettere sia reti che
utilizzano lo stesso protocollo di livello 2, cioè lo stesso protocollo MAC, sia reti che utilizzano protocolli MAC diversi
(ad esempio 802.3u e 802.11g).
Sostanzialmente un bridge interconnette tra loro reti diverse per costituire un unico dominio di broadcast senza
tuttavia unire i domini di collisione.
Il bridge di tipo più diuso è il così detto  transparent bridge . Esiste un altro tipo di bridge, utilizzato nelle
sole reti token ring, chiamato source routing bridge.
Tra i compiti del bridge abbiamo l'unicazione di reti con:

ˆ Dierente frequenza di cifra

ˆ Dierente dimensione massima del campo informativo

ˆ Dierenti meccanismi di gestione di priorità e riscontro delle trame

Passiamo ora a vedere come funziona un bridge. Per sapere dove inviare le trame, ogni bridge dispone di una tabella
di inoltro dove memorizzare l'associazione tra l'identicatore di una stazione (l'indirizzo MAC) e la porta del bridge
attraverso cui la stazione può essere raggiunta. Per evitare la crescita incontrollata della tabella, ad ogni voce della
tabella è associato un campo età, che consente di eliminare dalla tabella quelle voci che non sono aggiornate entro
un intervallo di tempo massimo (per esempio 10 minuti). La dierenza tra bridge e switch è abbastanza sottile.
Solitamente per switch si intendono dei bridge a più porte che lavorano solo su rete Ethernet 802.3 (e non tra diversi
tipi di reti) e solitamente ogni porta comunica con un solo host, e non con una rete a bus.
La tabella di inoltro potrebbe quindi apparire in modo simile a questo:
Porta MAC address Età
1 00:12:34:03:AB:01 3 min
4 01:44:AF:41:E7:02 1 min

Operazioni svolte dal bridge

Vediamo in che modo il bridge popola le proprie tabelle di inoltro.

Fase di inoltro Dopo aver vericato l'assenza di errori nella trama per mezzo del campo FCS, il bridge esamina il
campo destinazione della trama stessa. Se la destinazione è presente nella tabella di inoltro, la trama viene inviata su
quella porta. Se invece la destinazione non è presente nella tabella di inoltro (oppure se l'indirizzo coincide con quello
di broadcast), la trama viene inviata su tutte le porte eccetto quella da cui è stata ricevuta.

Fase di apprendimento La popolazione della tabella di inoltro avviene in modo automatico nella fase di apprendi-
mento, osservando il campo dell'indirizzo sorgente nella trama ricevuta. Se il mittente non è presente nella tabella di
inoltro, viene aggiunto. Se il mittente è già presente nella tabella, viene aggiornato il campo età e eventualmente
l'identicatore della porta, nel caso in cui fosse diverso da quello memorizzato precedentemente (ad esempio quando
una stazione si sposta da una rete all'altra).

37
MAC ooding Esiste un tipo di attacco con il quale un possibile attaccante potrebbe riempire le tabelle di
inoltro di un bridge (rallentandone le prestazioni) emettendo molte trame con indirizzi sorgente fasulli.

Spanning tree È abbastanza ovvio che, in presenza di diversi bridge possono venire a formarsi dei cicli (loop )
all'interno della rete. Questi cicli devono essere evitati per eliminare il fenome dei broadcast storm (tempeste di
broadcast).
La rimozione del loop viene attuata mediante la costruzione dello  spanning tree , che consiste nell'etichettare
opportunamente le porte dei bridge in modo che alcune di queste possano essere disabilitate, con il risultato di
identicare un albero che unisce tutti i bridge. Si ricorda in proposito che gli alberi sono per denizione aciclici.
Ciascun bridge è individuato mediante un unico identicatore (ID) e in particolare si denisce root-bridge
quello con ID più basso. Questo identicatore è ricavato a partire da un indirizzo MAC del bridge come vedremo
in seguito.
Le porte di ogni bridge possono assumere uno tra i seguenti ruoli:

ˆ root R ( ): la porta che individua il percorso più breve che porta dal bridge al root-bridge

ˆ designated (D): la porta che determina il percorso più breve della LAN interfacciata verso il root-bridge

ˆ blocked B ( ): identica una porta disabilitata

Vediamo alcune caratteristiche:

ˆ Un root-bridge è dotato solo di porte di tipo D.

ˆ Se più bridge interfacciano la stessa LAN, solo uno di essi ha una porta di tipo D verso la LAN

ˆ Ogni bridge ha solo una porta marcata come B.

La costituzione dello spanning tree è realizzata mediante lo Spanning Tree Protocol STP [IEEE 802.1D]. Questo
standard denisce lo scambio di apposite unità informative denominate Bridge Protocol Data Unit (BPDU), che
permettono di eleggere il root bridge e l'etichettatura delle porte di tutti i bridge.

Trama BPDU
 (22 Byte, 176 bit) 
Contenuto Root Identier (ID) Root Path Cost (RPC) Bridge Identier (BI) Port Identier (PI)
Byte 8 4 8 2
Vediamo la descrizione dei vari campi:

ˆ Root Identier, RI (8 byte): identicatore (ID) del root bridge secondo il bridge emittente (BI) che invia la
trama BPDU. Questo identicatore è composto di due parti:

 Bridge Priority (2 Byte): È un valore che può essere modicato dall'amministratore di rete per cambiare
le priorità dei vari birdge. Il valore di default è 32768.

 MAC address (6 Byte)

ˆ Root Path Cost, RPC (4 Byte): costo della via dal bridge BI che emette la BPDU, al (presunto) root-
bridge RI, espresso con opportuna metrica. Una regola comunemente utilizzata consiste nel porre il costo di
1000
attraversamento di una rete con frequenza di cifra di C Mbit/s uguale al valore
C (ad esempio per una rete
Fast Ethernet si ottiene 10).

ˆ Bridge Identier, BI (2 Byte): identicatore del bridge che emette la trama BPDU. È suddiviso in due parti
uguali a quelle presenti nel campo  root identier 

ˆ Port Identier, PI (2 Byte): identicatore della porta attraverso cui la BPDU viene trasmessa. È suddiviso
in due campi:

 Port priority (1 Byte): È un valore che può essere modicato dall'amministratore di rete per cambiare le
priorità delle porte (vedremo in seguito a cosa può servire). Il valore di default è 128.

 Port number (1 Byte): Identicatore della porta sica. Essendoci 1 Byte abbiamo a disposizione al
massimo 256 porte.

38
Meccanismo di scambio delle trame BPDU

ˆ Ogni bridge che riceve una BPDU ne aggiorna il valore y del campo RPC ricevuto sommandovi il costo n
dell'ultima rete attraversata per ottenere un nuovo vaore y+n del campo RPC. In caso di dubbi sul costo,
sommare 1 può essere una scelta adeguata.

ˆ Inizialmente ogni bridge ritene di essere il root bridge, quindi invia in rete delle BPDU del tipo (x, 0, x, −) dove
x è l'identicatore del bridge in questione. Un birdge che riceve su una porta una BPDU in cui il valore di RI è
più piccolo del proprio BI, capisce di non essere il root bridge e imposta il valore di RI ricevuto come valore
del root bridge e marca la porta come R. Nel caso di più BPDU ricevute, viene scelta quella con priorità più
alta: con il più piccolo valore di RPC ricevuto, a parità di questo con il più piccolo valore di BI ricevuto,
a parità di questo con il pià piccolo valore di Port Identier del bridge stesso.

ˆ Un bridge che non sia root bridge provvede a ritrasmettere le BPDU che riceve sulla porta R verso tutte le altre
porte D, aggiornando i campi BI, RPC e PI.

ˆ Se la BPDU emessa su una porta ha una priorità più bassa (secondo le stesse regole citate prima per la
elezione della porta root di un bridge), di almeno una delle BPDU ricevute sulla stessa porta, la porta viene
etichettata come B, e quindi disabilitata per elimitare il loop. In caso contrario la porta resta etichettata come
D. Attenzione: questo confronto di priorità viene fatto prima di aggiornare il valore RPC della trama BPDU!

ˆ Le porte R ricevono trame BPDU, non si invia su porte R.

ˆ Il root bridge etichetta tutte le sue porte come D e sarà l'unico ad inviare trame BPDU.

ˆ Le porte bloccate B non possono essere utilizzate per inviare, ma si può ricevere dati per aggiornarsi.

Lan virtuali (802.1Q)


Per svariati motivi, ad esempio di congestione della rete, di suddivisione in gruppi lavorativi etc.. Può essere utile
suddividere una rete locale in più reti locali virtuali, dette anche VLAN (Virtual Local Area Network) .
Le VLAN sono assolutamente indipendenti dalla congurazione sica della struttura di una LAN. È quindi possibile
eettuare lo spostamento di una stazione da una LAN a un'altra senza dover operare alcuna modica di cablatura
sica della stazione stessa.
Esistono svariati modi per identicare una stazione all'interno di una LAN:

ˆ In base alla porta del bridge/switch su cui arriva la trama

ˆ In base all'indirizzo MAC della stazione

ˆ Per il tipo di protocollo di livello 3 utilizzato

Lo standard 802.1Q ha fatto alcune piccole modiche alla trama standard Ethernet, al ne di poter meglio identicare
a quale rete appartiene una stazione. Vediamo la nuova struttura della trama :
1

Contenuto Preamble SFD Destination Address Source Address VLAN prot. Priority, CFI, VLAN ID
Byte 7 1 6 6 2 2

Length LLC/PDU Padding FCS


2 0-1500 0-42 4
Vediamo nel dettaglio le aggiunte fatte dallo standard:

ˆ VLAN protocol (2 Byte): In realtà questo campo, che ha sempre valore esadecimale 0x8100, permette di
identicare che si tratta di una trama di tipo 802.1Q. In una trama Ethernet normale infatti, al suo posto ci
sarebbe il campo Length, che non può superare il valore 1500, quindi grazie a questo campo aggiunto non c'è il
rischio di confondere una nuova trama 802.1Q con una vecchia 802.3

ˆ Priority (3 bit): Permette di associare un livello di priorità ad un usso di traco a livello 2. In realtà questa
è considerabile una leggera violazione della straticazione protocollare, secondo la quale sarebbe più consono
gestire la qualità del servizio a livelli superiori. Dato che la modica della trama Ethernet è un evento molto
raro, qualcuno ha pensato di aggiungere questo campo.

ˆ Canonical Format Indicator, CFI (1 bit): Specica, se posto ad 1, che la trama è di tipo Token Ring, ed è
quindi necessaria una elaborazione particolare.

ˆ VLAN Identier, VLAN ID (12 bit): Indica la VLAN a cui appartiene la trama, con valori ammessi da 1 a
4094 (i valori 0x000 e 0xFFF sono riservati).

1È stata qui rappresentata su due righe per motivi di impaginazione

39
In realtà molte delle apparecchiature non supportano ancora questo standard, ed è quindi necessario, sugli switch/bridge,
eettuare una conversione prima di consegnare la trama Ethernet. Poi, volendo guardare alla sicurezza, è meglio evitare
di ricevere trame 802.1Q dalle stazioni connesse agli switch, perché esse potrebbero ngersi parte di un'altra VLAN.
È meglio invece assegnare le VLAN a ciascuna porta sica dello switch (via software) e inviare trame Ethernet standard
ai client, utilizzando trame Ethernet 802.1Q solo per la comunicazione tra switch. Questa è una pratica abbastanza
diusa.

Congurazione delle VLAN sui sistemi GNU/Linux

Sui sistemi GNU/Linux (e tutti gli altri sistemi che implementano la suite di comandi iproute2 ) è possibile creare una
scheda di rete virtuale associata ad una determinata vlan con un comando tipo:
ip link add link eth2 name eth2.5 type vlan id 5
Con questo comando si crea una interfaccia di rete virtuale chiamata eth2.5 , che è in realtà la interfaccia sica eth2
per tutte le trame Ethernet con identicatore VLAN 5. Il comando dovrebbe occuparsi di abilitare automaticamente
il modulo del kernel  8021q che gestisce le trame 802.1Q.
Per cancellare l'interfaccia:
ip link delete eth2.5

Lo strato di rete (livello 3 ISO/OSI)


Qualità del servizio
Le esigenze di un usso dati possono essere svariate e sono caratterizzate principalmente da quattro parametri
fondamentali:

ˆ Adabilità : Il fatto di ricevere informazioni non corrotte ed essere sicuri che arrivino a destinazione. Il
trasferimento di les, posta elettronica e pagine web è importante che sia adabile, mentre per applicazioni
multimediali audio/video, telefonia etc.. possiamo anche permetterci di ricevere dati parzialmente errati o
perdere qualche pacchetto.

ˆ Ritardo: Abbastanza importante in quasi tutte le applicazioni eccetto la posta elettronica e la navigazione web,
tuttavia è essenziale per la telefonia. Un ritardo superiore al secondo nell'invio o ricezione dei dati rende una
telefonata pessima.

ˆ Jitter : Si tratta della variabilità del ritardo. È molto importante per applicazioni come video in streaming, le
telefonate e le videoconferenze. Se un video è in ritardo anche di qualche secondo non è essenziale, è importante
però che questo ritardo resti costante. Se il ritardo continua a variare non sarà possibile neanche utilizzare dei
buer per compensare l'eetto del ritardo.

ˆ Banda : Importante in tutte le applicazioni, anche se si fa sentire maggiormente su quelle audio/video.

Trac shaping
Esaminiamo la tecnica del trac shaping, cioè la  uidicazione  del traco di rete. Il trac shaping regola la velocità
media della trasmissione dei dati. Al contrario, i protocolli a nestra scorrevole studiati precedentemente limitano la
quantità di dati in transito in ogni momento, e non la velocità di trasmissione.

Tecnica isaritmica
Viene utilizzata principalmente per gestire l'accesso alla rete. Consiste nello stabilire che all'interno della rete debba
circolare un numero sso di pacchetti. Ogni nodo ha un certo numero di permessi. Ogni volta che invia una pacchetto
consuma un permesso, ogni volta che riceve un pacchetto acquisisce un nuovo permesso.

L'algoritmo leaky bucket


Non si tratta d'altro che di un sistema che permette di prendere un usso irregolare di pacchetti in ingresso e lo
trasforma in un usso regolare di pacchetti in uscita.
Si immagini un secchio con un piccolo buco sul fondo. Qualunque sia la velocità d'ingresso dell'acqua, e per quanto
possa essere irregolare, l'uscita di acqua dal foro sottostante sarà sempre costante. Se l'acqua raggiunge la cima del
secchio esce (viene scartata). Lo stesso concetto viene applicato anche nel caso delle reti: i pacchetti in ingresso
vengono accodati in una coda nita (con logica FIFO ) e man mano rilasciati in uscita a intervalli regolari. Se la coda
è piena i pacchetti in ingresso vengono scartati. Il problema dell'algoritmo leaky bucket è che si potrebbe aumentare
pericolosamente il ritardo dei dati che lo attraversano, che può risultare svantaggioso per molte applicazioni.

40
Nel leaky bucket c'è una coda di capacità
 bit  W pacchetti, che riceve pacchetti dalla sorgente a frequenza di cifra
Ps s . I pacchetti vengono accettati a condizione di trovare spazio nella coda, altrimenti vengono scartati. La
1
coda si svuota a frequenza costante v : ogni
v secondi viene generato il permesso per trasmettere un pacchetto. Se ci
sono pacchetti in coda viene preso quello più vecchio e trasmesso, se la coda è vuota non si fa nulla.
Se ogni pacchetto trasmesso è grande Lb bit e la frequenza di svuotamento della coda è v , abbiamo che la frequenza
media di trasmissione in uscita dal nostro token bucket sarà

Ab max = Lp · v

Pacchetti a lunghezza variabile

In realtà questo algoritmo opera bene con pacchetti a lunghezza costante. Se i pacchetti sono a lunghezza variabile è
meglio operare lo stesso meccanismo con un conteggio di Byte anzichè di pacchetti.
Poichè ogni pacchetto deve essere trasmesso per intero, si pongono delle condizioni sul numero minimo di Byte.

L'algoritmo token bucket


Con la tecnica leaky bucket siamo in grado di controllare rigidamente la frequenza in uscita dei pacchetti indipenden-
temente dal fattore di burstiness della sorgente. Questo signica che aumentiamo la latenza della connessione e se
dobbiamo mandare anche solo un pacchetto, esso verrà rallentato.
L'algoritmo token bucket si adatta meglio a sorgenti che emettono segnali bursty .
W , questa volta però
Come prima utilizziamo un secchio a capacità nita: una coda (sempre FIFO ) di capacità
 permessi 
1
la coda raccoglie dei permessi. Un permesso viene generato con la frequenza
s v
, quindi ogni
v secondi viene
generato un nuovo permesso e inserito all'interno della coda. Quando la coda è piena di permessi, non ne vengono
aggiunti altri.
Quando arriva un pacchetto dalla sorgente, esso viene immagazzinato in una memoria separata (sempre in logica
FIFO ) e viene trasmesso non appena c'è un permesso disponibile nella coda.
Questo meccanismo permette di accumulare permessi e trasmettere tanti pacchetti in successione quando c'è un
burst. C'è eventualmente anche la possibilità di accumulare W permessi e inviare quindi W pacchetti alla velocità di
picco in uscita Pb . In questo modo si riduce anche il ritardo del bucket.
Si presti attenzione al fatto che nell'algoritmo token bucket sono solo i permessi ad essere scartati, i pacchetti
possono potenzialmente essere acumulati senza limiti.
Anche in questo caso abbiamo:
Ab max = Lp · v
Ovviamente Ab max non può mai eccedere la frequenza di trasmissione sulla linea di uscita, cioè Ab max ≤ Pb .

Pacchetti a lunghezza variabile

Anche con token bucket è possibile gestire i pacchetti a lunghezza variabile. Per farlo è possibile trasformare il permesso
per il pacchetto in un permesso per un certo numero di byte.

Politiche  store and forward  e  cut-through 


Ci sono due modalità in cui può operare un algoritmo di tipo bucket.
In modalità  store and forward  la trasmissione di un pacchetto non può avere inizio prima che tutti i suoi bit
siano stati ricevuti.
In modalità  cut-through , invece, la trasmissione avviene senza nessun ritardo. Si noti che in questo secondo
caso la modalità può essere applicata solo se la frequenza di uscita non è superiore alla frequenza di ingresso.

Altri metodi di trac shaping


Solitamente si preferisce adottare insieme token bucket e leaky bucket mettendoli in cascata uno dopo l'altro.

Protocollo IP
Principi generali dello strato network di Internet2
ˆ Assicurarsi che funzioni : non ultimare il progetto o lo standard no a quando non è stato testato a dovere.

ˆ Mantenerlo semplice : eliminare le funzionalità non strettamente necessarie.

ˆ Fare scelte chiare : Se la stessa cosa può essere fatta in modo diversi, sceglierne uno. Fare la stessa cosa in
due modi signica andare a cercare guai.

2 Riassunto dei punti citati da A.Tanenbaum in Reti di calcolatori

41
ˆ Sfruttare la modularità : separare il progetto in varie parti distinte di modo da non dover modicare tutto.

ˆ Aspettarsi l'etereogenità : aspettarsi l'utilizzo di diversi tipi di hardware, diversi tipi di applicazioni, attrez-
zature di trasmissione...

ˆ Evitare opzioni e parametri statici : Se i parametri sono inevitabili, invece di fare scelte sse è meglio lasciare
che trasmettitore e ricevitore concordino tra loro un valore.

ˆ Mirare ad un buon progetto, non è necessario che sia perfetto : Non è necessario progettare qualcosa
che funziona sempre bene, ma almeno funziona bene nella stragrande maggioranza dei casi. Rari casi speciali
gestiti male sono poco rilevanti.

ˆ Essere rigorosi nella trasmissione e tolleranti nella ricezione : Inviare pacchetti che si attengono rig-
orosamente agli standard ma aspettarsi di tutto in ingresso.

ˆ Pensare alla scalabilità : Se il sistema deve poter gestire sia pochi host che milioni o miliardi in modo ecace.
Il carico deve essere il più distribuito possibile.

ˆ Considerare le prestazioni e i costi : Se una rete ha scarse prestazioni e/o alti costi nessuno la utilizzerà.

Caratteristiche generali di IP
ˆ best eort (perciò non garantito e connection-less )
Lo scopo dello strato network è fornire un mezzo di tipo
per traspostare i datagrammi inviati da una sorgente a una destinazione, senza tener conto della posizione
delle macchine (che possono trovarsi su reti diverse) e della eventuale presenza di reti intermedie (poste tra le
macchine).

ˆ A dierenza della maggior parte dei protocolli di strato network più vecchi, IP è stato progettato n dall'inizio
pensando alla comunicazione tra reti.

ˆ Lo strato di trasporto prende i ussi da inviare e li separa in datagrammi che passa allo strato network. In teoria
ogni datagramma può essere grande 64KB, ma in realtà nella pratica la dimensione dei datagrammi non supera i
1500 byte (per poter essere incapsulata in un frame Ethernet). Lo strato network si concentra sull'instradamento
delle informazioni.

ˆ Ogni datagramma che attraversa Internet può essere frammentato in unità più piccole e a destinazione deve
essere riassemblato per riottenere il datagramma originale.

ˆ La consegna dei datagrammi non è garantita. Non c'è nessun meccanismo di riscontro

Struttura del datagramma IP (versione 4 - IPv4)


 32 bit 
Version (4 bit) HLEN (4 bit) Service type (8 bit) Total length (16 bit)
Identication (16 bit) Flags (3 bit) Fragmentation oset (13 bit)
Time to live (8 bit) Protocol (8 bit) Header checksum (16 bit)
Source IP address (32 bit)
Destination IP address (32 bit)
Options
Data
La parte ssa dell'intestazione è lunga 20 Byte, estendibile con opzioni. Viene trasmessa in ordine big endian: da
sinistra a destra, a partire dal bit di ordine più elevato del campo version.
I campi dell'header sono:

ˆ Version (4 bit): Tiene traccia della versione del protocollo usato per il datagramma. Grazie a questa infor-
mazione è possibile pensare nuove versioni del protocollo. La versione attualmente più utilizzata è la 4, anche
se è in corso una migrazione alla versione 6 (IPv6) a causa della scarsità di indirizzi. IPv5 è stato un protocollo
sperimentale di streaming in tempo reale, mai utilizzato nella realtà.

ˆ HLEN (4 bit): Viene utilizzato per indicare la lunghezza dell'intestazione espressa in parole di 32 bit (poiché
essa non è costante a causa del campo opzioni). Il valore massimo di questo campo è 15, quindi la dimensione
massima dell'intestazione è 60 Byte, che escludendo i 20Byte ssi si traduce in un massimo di 40Byte di opzioni.
In realtà alcune opzioni (come ad esempio quella record route ) necessitano più di 40 Byte, quindi sono costretti
ad ignorare questo campo.

ˆ Service type (8 bit): Era utilizzato per distinguere diverse classi di servizio, sono ammesse diverse combinazioni
di adabilità e velocità.

42
 Originariamente era strutturato come segue:
 (8 bit) 
Precedence (3 bit) D T R Not used (2 bit)

* Precedence (3 bit): indica la priorità del datagramma. Priorità 0 signicava pacchetto normale,
priorità 7 signicava pacchetto di controllo.

*D (1 bit): Signica  minimize delay

*T (1 bit): Signica  maximize throughtput

*R (1 bit): Signica  maximize raliability (massimizza l'adabilità)

* Not used (2 bit): Sono due bit inutilizzati.

 È stato poi aggiunto anche il bit C  minimize cost :

 (8 bit) 
Precedence (3 bit) D T R C Not used (1 bit)

 In seguito, IETF ha deciso di cambiare il signicato del campo:

 (8 bit) 
DSCP (6 bit) ECN (2 bit)

 Dove il campo DSCP sta per  Dierentiated Services Code Point  (RFC 2474), e vuole indicare la classe
di servizio da utilizzare per il pacchetto.

 Il campo ECN (RFC 3168) viene utilizzato per comunicare al destinatario se il mittente supporta la  Explicit
Congestion Notication , cioè la capacità di avvisare il destinatario di congestione, senza scartare pacchetti.
(Altri dettagli in merito ad ECN verranno spiegati dopo TCP)

* 00  Non ECN-Capable Transport, Non-ECT

* 10  ECN Capable Transport, ECT(0)

* 01  ECN Capable Transport, ECT(1)

* 11  Congestion Encountered, CE.

 Nella pratica i router di Internet ignorano completamente il campo DSCP. Il campo DSCP viene solitamente
utilizzato (all'interno della architettura  DiServ ) nel modo seguente:

* Il pacchetto arriva sul router di frontiera della rete di destinazione

* Il pacchetto in ingresso alla rete viene analizzato controllando qual'è la sorgente, destinazione, protocollo
trasportato e relative porte (vedi dopo il concetto di  porta )

* In base ad una serie di regole locali, viene scelta una classe di servizio per il pacchetto e viene quindi
etichettato applicando una classe di servizio consona

* Durante il transito del pacchetto nella rete di destinazione, i routers intermedi utilizzando l'informazione
sul DSCP per capire qual'è la priorità del pacchetto (se deve essere messo in delle code o inoltrato subito)

ˆ Total length (16 bit): tiene conto di tutto il contenuto del datagramma, intestazione e dati. Grazie a questo
campo è possibile capire dove terminano i dati. La lunghezza massima è 65535 Byte. Questo limite superiore
oggi è tollerabile, ma le reti gigabit del futuro potrebbero trovarlo limitante.

ˆ Identication (16 bit): Serve all'host di destinazione per determinare a quale datagramma appartiene il fram-
mento appena arrivato. Tutti i frammenti di uno stesso datagramma contengono lo stesso valore identication.

ˆ Flags (3 bit):
 3 bit 
Not used D M

 Not used (1 bit)


 D (1 bit): Do not fragment (non frammentare). Indica ai router di non dividere in frammenti il
datagramma perchè la destinazione non è in grado di di rimettere insieme i pezzi.

 M (1 bit): More fragments (altri frammenti). Non può essere usato per l'ultimo frammento di un
datagramma frammentato (ovviamente).

ˆ Fragment oset (13 bit): Indica la posizione del frammento nel datagramma corrente. Tutti i frammenti tranne
l'ultimo in un datagramma devono essere multipli di 8 byte, che è la dimensione del frammento elementare. Poiché
ci sono 13 bit, ci sono al massimo 8192 frammenti per ogni datagramma.

ˆ Time To Live, TTL (8 bit): È un contatore che viene utilizzato per limitare il tempo di vita di un pacchetto.
Ogni router su cui passa il datagramma decrementa di una unità questo valore. Nello standard originale questo
valore veniva decrementato ogni secondo se il datagramma stazionava su un router. Nella realtà al giorno d'oggi
viene solo decrementato negli hop che attraversa. Quando questo valore raggiunge lo zero il pacchetto deve essere
scartato. Questa funzionalità impedisce a datagrammi errati di girare a vuoto per sempre in Internet (evento
che potrebbe facilmente accadere in caso di danneggiamento delle tabelle di routing).

43
ˆ Protocol (8 bit): È un identicatore del protocollo di trasporto utilizzato all'interno dei dati trasportati dal
pacchetto IP. TCP e UDP sono delle possibilità. Un'altra è ad esempio ICMP. La numerazione dei protocolli è
3
univoca e assegnata dall'ente IANA . Con 8 bit ci sono 256 possibili protocolli di trasporto. Di seguito una lista
dei più famosi:

Nome Valore decimale RFC


0 Riservato /
1 ICMP RFC792
2 IGMP RFC1112
4 IP (per incapsulazione IP over IP) /
6 TCP RFC793
8 EGP RFC888
9 IGP /
17 UDP RFC768
... ... ...

ˆ Header checksum (16 bit): È un codice a controllo di errore che verica la correttezza della sola intestazione
(non dei dati). Questo checksum aiuta a rilevare errori generati da locazioni di memoria difettose nel router. Il
metodo di calcolo è analogo a quello utilizzato in TCP e UDP, si rimanda ai paragra successivi sul metodo di
calcolo. Si noti poi che questo checksum deve essere ricalcolato da ogni router su cui transita il pacchetto, dal
momento che almeno un campo cambia sicuramente (Time To Live ).

ˆ Source IP address (32 bit): È l'indirizzo sorgente dell'host che ha trasmesso il pacchetto. Gli indirizzi IP sono
univoci in tutta Internet.

ˆ Destination IP address (32 bit): È l'indirizzo sorgente dell'host a cui è destinato il pacchetto. Gli indirizzi
IP sono univoci in tutta Internet.

ˆ Options : È un campo di estensione dell'header per aggiungere delle opzioni. Tra le più note ci sono:

 Record route option: costringe ogni router che riceve il pacchetto IP ad aggiungere il proprio indirizzo IP
in coda ad una lista di indirizzi di transito all'interno dell'header. Questa opzione è solitamente supportata
dai router di Internet. Il formato di questa opzione è il seguente:
Code 7 Length Pointer
00000111 (Total length)
First IP address (32 bit)
...
Last IP address (32 bit)

 Strict source routing option: Si specica all'interno del pacchetto IP inviato, l'intero percorso che deve
seguire per arrivare a destinazione. Il formato di questa opzione è il seguente:
Code 137 Length Pointer
10001001 (Total length)
First IP address (32 bit)
...
Last IP address (32 bit)

 Loose source routing option: Si specica all'interno del pacchetto IP inviato, alcuni punti di passaggio
forzati che il pacchetto deve seguire per arrivare a destinazione:
Code 131 Length Pointer
10000011 (Total length)
First IP address (32 bit)
...
Last IP address (32 bit)

 Timestamp option: Viene richiesto ad ogni host su cui transita il pacchetto IP di inserire in coda ad una
lista il proprio indirizzo IP ed un timestamp.
Code 68 Lenght Pointer O-Flow Flags
01000100 (Total lenght) (4 bit) (4 bit)
First IP address (32 bit)
...
Last IP address (32 bit)

 Security option: era stata introdotta una opzione per specicare che dei dati erano condenziali (ad
esempio dati militari,...) in realtà non è mai stata usata ed è attualmente ignorata.

3 L'elenco completo e aggiornato degli assegnamenti dei numeri di protocollo si trova alla pagina
http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xml

44
Struttura del datagramma IPv6
Nuova versione, introdotta principalmente per ovviare al problema della mancanza di indirizzi IPv4, ma anche per

 
semplicare e migliorare il datagramma IP.
(32 bit)
Version (4 bit) Trac class (8 bit) Flow label (20 bit)
Payload lenght (16 bit) Next header (8 bit) Hop limit (8 bit)

Source IP address (128 bit)

Destination IP address (128 bit)

Extension headers (variable)

ˆ Version (4 bit): Specica la versione del protocollo IP utilizzata, in questo caso 6.

ˆ Trac class (8 bit): Specica il tipo di servizio distinguendolo in varie classi, esattamente come il campo
relativo in IPv4.

ˆ Flow label (20 bit): Viene utilizzato per specicare ai router che è necessario un trattamento speciale per il
pacchetto. Può essere utilizzato per specicare particolari modalità di trattamento dei datagrammi.

ˆ Payload lenght (16 bit): Indica la lunghezza del payload del datagramma in numero di Byte. Quindi il payload
può essere lungo no a 65535 Byte. A diernza di IPv4, i 40 Byte dell'intestazione non sono conteggiati nel
calcolo della lunghezza.

ˆ Next header (8 bit): È un campo che serve a specicare il tipo di campo che segue i 40 Byte di intestazione.
È infatti possibile aggiungere opzioni/estensioni all'intestazione, una incatenata dopo l'altra. L'ultima di queste
(o nel caso in cui non ce ne fossero) deve avere in next header un identicatore che specica cosa contiene il
payload (TCP/UDP/...)

ˆ Hop limit (8 bit): Denisce il numero di salti che possono essere fatti per raggiungere la destinazione. Ogni
host su cui transita il pacchetto decrementa questo valore. Funziona come il vecchio TTL di IPv4.

ˆ Source address/Destination address (128 bit): indica l'indirizzo IP sorgente/destinazione.

ˆ Extension headers:
Header Tipo di informazione
Hop-by-hop options Richieste per elaborazione nodo per nodo
Routing Percorso di rete richiesto per il datagramma
Fragment Tipo di frammentazione eettuata (dal mittente)
Destination options Informazioni addizionali per la destinazione
Authentication Informazioni di autenticazione sul mittente
Encapsulating security payload Informazione di sicurezza per la destinazione
Nella progettazione di IPv6 si è deciso di rimuovere il campo checksum, poiché molto costoso sui router e
relativamente inutile (altri controlli vengono già fatti a livelli superiori).
Non viene utilizzata più la frammentazione. Tutti gli host IPv6 compatibili devono determinare dinamicamente la
dimensione del datagramma da utilizzare. La dimensione minima del datagramma è stata portata a 1280 Byte.
Quando un router non è in grado di inoltrare un pacchetto troppo grande, invia un messaggio di errore al mittente
(ICMPv6 packet too big ) al posto di frammentarlo. Solo la sorgente può frammentare il datagramma. Probabilmente
si continuerà ad utilizzare 1500 Byte come dimensione massima di modo da contenere l'intero pacchetto in una trama
Ethernet.
Una sotto-opzione che fa parte dell'opzione hop-by-hop options è l'intestazione estesa per grandi datagrammi
(jumbogrammi). Quando è utilizzata, il campo payload lenght nell'intestazione è impostato a 0. La struttura di questa

 
opzione è:
(32 bit)
next header 0 194 4
jumbo payload lenght
Questa opzione è importante per alcune applicazioni che devono inviare gigabytes di dati attraverso Internet.

45
Indirizzamento IPv4
Il protocollo IP (versione 4) adotta un meccanismo di indirizzamento a 32 bit. Ogni host connesso in rete è identicato
da uno o più indirizzi IP. In teoria non possono esistere su Internet due host con lo stesso indirizzo IP. Ogni indirizzo IP
è formato da una parte che rappresenta l'identicatore di rete (net-id ) e da una parte che rappresenta l'identicatore
dell'host (host-id ). Possiamo pensare a queste due parti come a un presso e un susso.
Solitamente per comodità gli indirizzi IP vengono rappresentanti con la cosiddetta notazione decimale puntata del
tipo x.y.z.w, in cui ognuno di questi quattro elementi (anche detti teti a volte) può assumere un valore tra 0 e 255. In
eetti ognuno dei quattro elementi decimali dell'indirizzo, rappresenta un byte. Per esempio l'indirizzo esadecimale
C0290614 corrisponde all'indirizzo 192.41.6.20, decisamente più comodo da ricordare.

Indirizzamento per classi


Tutti i possibili indirizzi IP (che sono 232 nella versione 4 di IP), sono stati suddivisi per comodità in cinque classi, che
si dierenziano per la diversa congurazione e lunghezza delle due parti net-id e host-id. Questo tipo di suddivisione
non è più attualmente in uso (vedremo tra poco il metodo utilizzato ad oggi), ma è didatticamente molto utile a

 
comprendere il resto.

 °   °   °   ° 
(32 bit)
(1 Byte) (2 Byte) (3 Byte) (4 Byte)

Classe A 0 net-id host-id

Classe B 1 0 net-id host-id

Classe C 1 1 0 net-id host-id

Classe D 1 1 1 0 indirizzi multicast

Classe E 1 1 1 1 riservato per usi futuri


Nel dettaglio:

ˆ Classe A (0.0.0.0 - 127.255.255.255): 7 bit di net-id, preceduti da un bit sso sempre posto a 0. Denisce
poche reti (125 quelle utilizzabili su Internet), ognuna contenente un grande numero di host (al massimo
16'777'214 host).

 Gli indirizzi compresi in 0.0.0.0 - 0.255.255.255 sono utilizzati per identicare la rete stessa
 Gli indirizzi compresi in 127.0.0.0 - 127.255.255.255 sono utilizzati come indirizzi di  loopback , non possoo
essere utilizzati come indirizzi di rete esterni, sono riservati per le comunicazioni locali internet all'host.

ˆ Classe B (128.0.0.0 - 191.255.255.255): 14 bit di net-id, preceduti da due bit ssi, sempre posti a 1 0. Denisce
16'384 reti (16'368 quelle utilizzabili su Internet), ciascuna contenente al massimo 65534 host.

ˆ Classe C (192.0.0.0 - 223.255.255.255): 21 bit di net-id, preceduti da tre bit ssi, sempre posti a 1 1 0. Denisce
molte reti (2'096'896 quelle utilizzabili su Internet), ciascuna contenente solo 254 host.

ˆ Classe D (224.0.0.0 - 239.255.255.255): Si tratta di indirizzi riservati per servizio di tipo multicast. Questi
indirizzi iniziano sempre con una parte ssa composta dai quattro bit 1 1 1 0.

ˆ Classe E (240.0.0.0 - 255.255.255.255): Si tratta di indirizzi riservati per utilizzi futuri. Sono sempre preceduti
da una parte ssa composta dai quattro bit 1 1 1 1.

Indirizzi speciali
In ciascuna rete, ci sono due sussi host-id che non vengono utilizzati mai. L'indirizzo composto da tutti zeri nel
campo host-id è un identicatore per riferirsi alla rete stessa. L'indirizzo composto invece da tutti 1 nel campo host-id
è un identicatore per riferisti a tutti gli host di quella rete (indirizzo di broadcast ). Questi due speciali indirizzi non
possono essere assegnati a host sici della rete. Quando facciamo i calcoli sul numero di host disponibili dobbiamo
quindi sempre assicurarci di sottrarli dal conteggio. Inoltre l'indirizzo 255.255.255.255 è un indirizzo di broadcast per
riferirsi a tutti gli host della rete stessa (nel caso in cui non si conosca l'indirizzo della rete ad esempio). Spesso gli
amministratori di rete disabilitano questo indirizzo su alcuni protocolli (ex: ICMP ping a 255.255.255.255 spesso è
bloccato dal router).
L'indirizzo 0.0.0.0 è invece utilizzato per identicare l'host sorgente di una connessione e la rete corrente, quando
non ne si conosce l'indirizzo.

46
Indirizzi privati
Esistono poi una serie di indirizzi delle classi A,B e C che non possono essere utilizzati su Internet, perché riservati
ad utilizzo privato. In una rete interna di una azienda potrebbero essere utilizzati per sfruttare il protocollo IP pur
non avendo assegnati degli indirizzi. In teoria questi indirizzi non sono pensati per poter essere connessi ad Internet,
tuttavia come vedremo in seguito, mediante la tecnica del NAT è possibile farlo.
Blocco Indirizzo iniziale Indirizzo nale Notazione VLSM
1 10.0.0.0 10.255.255.255 10.0.0.0/8
2 172.16.0.0 172.31.255.255 172.16.0.0/12
3 192.168.0.0 192.168.255.255 192.16.0.0/16

ˆ Il primo blocco è composto da 16'777'216 indirizzi della classe A, di cui 16'777'214 utilizzabili (escludendo
l'indirizzo di rete e quello di broadcast).

ˆ Il secondo blocco è composto da 16 reti di classe B adiacenti tra loro. Ciascuna di queste 16 reti può contenere
65534 host, per un totale di 1'048'544 host nelle 16 reti.

ˆ Il terzo blocco è composto da 256 reti di classe C adiacenti tra loro. Ciascuna di queste 256 reti può contenere
254 host, per un totale di 65'024 host nelle 256 reti. (Come vedremo, utilizzando una maschera /16 possiamo
arrivare ad avere 65534 host in questo blocco)

In realtà esistono anche altri blocchi di indirizzi privati, che non possono essere utilizzati pubblicamente su Internet
e sono stati riservati per scopi specici (carrier grade NAT, ham radio, ...). Spesso, per riferirsi a tutti questi indirizzi
che non possono essere utilizzati su Internet, si parla di bogons (dall'inglese, bogus IP addresses ).

Registers
L'univocità degli indirizzi IP in Internet è garantita da una organizzazione centrale denominata IANA - Internet
Assigned Number Authority che provvede ad assegnare gli indirizzi. Poiché tutti gli interessati ad ottenere un
indirizzo dovrebbero contattare la IANA, è stata istituita una gerarchia di  registers, cioè di organizzazioni che
ricevono dalla IANA grandi blocchi di indirizzi, che ri-suddividono in blocchi più piccoli da assegnare a loro volta.

Nome Aree gestite


ARIN Nord America
RIPE Europa, Medio Oriente, Asia centrale
APNIC Asia e Pacico
LACNIC America Latina
AFRINIC Africa

Subnetting e routing
Il meccanismo di indirizzamento per classi descritto precedentemente, si è rivelato negli anni particolarmente rigido.
Può succedere ad esempio che una università prenda una classe B di indirizzi per il dipartimento di Ingegneria Infor-
matica. Quando anche il dipartimento di Ingegneria Elettronica desidera accedere ad Internet si potrebbe estendere
la LAN mettendo una serie di ripetitori. A breve però il limite dei quattro ripetitori verrebbe raggiunto. Servirebbe
un'altra rete separata ma l'università ha già abbastanza indirizzi con la sua classe B. La soluzione consiste nel dividere
internamente la rete in più parti, chiamate subnets.
Nella RFC950 è stato proposto il meccanismo di subnetting, che consente di suddividere una rete generica
in più sottoreti, la cui struttura resta un fatto interno all'organizzazione proprietaria e non deve essere comunicata
ad altri.
La denizione di sottoreti all'interno di una rete, viene fatta utilizzando un identicatore chiamato netmask, che
accompagna l'indirizzo IP dell'host, e gli permette di capire quali sono gli indirizzi IP che fanno parte della sua
sottorete.
Una netmask è un indirizzo IP, che inizia con tutti 1 nel campo che corrisponde al presso di rete net-id e ha tutti
0 nel campo che corrisponde all'host-id.
Supponiamo ad esempio di prendere una classe B con indirizzo 131.175.0.0 e di volerla suddividere in 256 reti.
Anche se si tratta di un indirizzo di classe B e non C, possiamo aggiungere una netmask 255.255.255.0 su ciascun host
della nostra organizzazione. La dierenza tra la net-id denita dalla classe e la net-id denita con la netmask, è
chiamata subnet-id. In questo esempio abbiamo una subnet-id di 8 bit.
Spesso per semplicità, dato che le netmask sono una sequenza di uni consecutivi da sinistra a destra, si utilizza
anche una notazione /n, dove n è il numero di bit posti a uno osservando la netmask da sinistra verso destra. La
netmask del precedente esempio è dunque anche rappresentabile con /24.
Seguono delle netmask standard che corrispondono a quelle utilizzate normalmente per l'indirizzamento a classi,
se la netmask non viene impostata manualmente.

47
Classe Netmask decimale Netmask binaria Notazione /n
A 255.0.0.0 11111111 00000000 00000000 00000000 /8
B 255.255.0.0 11111111 11111111 00000000 00000000 /16
C 255.255.255.0 11111111 11111111 11111111 00000000 /24
L'adozione di una netmask permette ad host e router di individuare velocemente se un indirizzo IP sorgente/destinazione
fa parte o meno della propria sottorete. È suciente infatti eseguire un'operazione di AND logico tra i bit della net-
mask e l'indirizzo ricevuto. In questo modo si isola l'indirizzo della rete (escludendo la parte host-id ) ed è possibile
confrontarlo. Questa è l'operazione fatta di norma dai router per l'instradamento dei pacchetti.

Routing per subnet

Una tabella di routing potremmo pensarla organizzata in questo modo (vedremo di seguito quella più realistica):
Destination Netmask Flags Reference Use Gateway Interface
131.175.21.0 255.255.255.0 U 0 0 131.17.123.254 eth0
131.175.16.0 255.255.255.0 U 0 0 131.17.78.254 eth1
131.56.0.0 255.255.0.0 U 0 0 131.17.15.254 eth2
131.155.0.0 255.255.0.0 U 0 0 131.17.15.254 eth2
0.0.0.0 0.0.0.0 UG 0 0 131.17.123.254 eth0
Sappiamo inoltre la situazione delle interfacce del router:
Interface eth0
IP address 131.17.123.1
Netmask 255.255.255.0

Interface eth1
IP address 131.17.78.1
Netmask 255.255.255.0

Interface eth2
IP address 131.17.15.12
Netmask 255.255.255.0

ˆ Per inoltrare un pacchetto, il router deve capire se questo appartiene ad una delle sottoreti delle sue interfacce.
In caso contrario consulterà la sua tabella di routing.

ˆ Quando arriva un pacchetto viene estratto il suo indirizzo IP di destinazione e per ogni interfaccia di rete del
router viene fatta l'operazione:

(IP destinazione) AN D (Netmask interfaccia) = Rete di destinazione

 E la rete di destinazione viene confrontata con la rete dell'interfaccia, che può essere (pre)calcolata facendo:

(IP interfaccia) AN D (Netmask interfaccia) = Rete interfaccia

 Se le due reti coincidono, allora la subnet è la stessa e si procede all'inoltro diretto del pacchetto

ˆ Se il confronto con le reti delle interfacce non ha successo, si procede in modo analogo confrontando la tabella
di routing voce per voce:

(IP destinazione) AN D (Netmask interfaccia) = Rete di destinazione

 Confrontato con:

(Destination regola n) AN D (Netmask regola n) = Rete della regola n

 In caso aermativo si invia il pacchetto a questo hop successivo che si preoccuperà di inoltrarlo a sua volta.
Per inviare il pacchetto all'hop successivo si opera a livello 2. Ad esempio se i due router sono collegati da
rete Ethernet, si invia una trama Ethernet mettendo come destinazione il MAC address del router indicato
come gateway e inserendo come PDU il pacchetto IP (aggiornando il campo TTL ovviamente).

ˆ Può capitare che due regole della tabella di routing soddisno l'uguaglianza. In questo caso viene scelta la rete
con la netmask più lunga.

ˆ L'ultima regola della tabella è la regola di default, specica a chi inoltrare tutti i pacchetti che non si sa come
gestire. Viene utilizzata solo se nessuna delle altre regole è soddisfatta, poiché la lunghezza della sua netmask è
zero.

48
ˆ Spesso per gestire il routing verso la rete locale e per evitare di ricalcolare la rete di ogni interfaccia, si aggiunge
una riga alla tabella di routing per ogni interfaccia. Ad esempio in questo caso per l'interfaccia eth0 avremmo
avuto una riga nella tabella di routing del tipo:

Destination Netmask Flags Reference Use Gateway Interface


131.17.123.0 255.255.255.0 U 0 0 0.0.0.0 eth0

ˆ Riguardo agli altri campi non analizzati della tabella di routing:

 Flags: informazioni aggiuntive sulla regola di route

*U : Router attivo

*G : Destinatario fuori dalla sottorete

*H : destinatario host specico

*DM / : reindirizzamento eettuato con ICMP (vedi nella sezione seguente su ICMP)

 Reference: Numero di connessioni lungo il percorso


 Use: Numero di utilizzi di questa regola
 Interface: Nome dell'interfaccia su cui inoltrare il pacchetto (utile se si utilizzano gli stessi indirizzi su due
interfacce distinte)

Si noti che questo meccanismo di subnetting non aumenta il numero di host sopportabili da Internet, ma aumenta
solo la essibilità della suddivisione in classi, ritenuta oggi troppo rigida e penalizzante.

Variable Length Subnet Mask (VLSM)


Prima abbiamo parlato di netmask supponendo che ciascun host all'interno della nostra rete utilizzi la stessa. In
realtà è possibile partizionare la rete con diverse netmask di lunghezza variabile. Questo è accompagnato da maggiore
complessità nella divisione della rete e nella gestione delle tabelle di routing ma permette una divisione più eciente
degli indirizzi.

Classless Inter-Domain Routing (CIDR)


Il modo in cui sono suddivise le classi porta ad uno spreco enorme di indirizzi. Organizzazioni non certe della propria
espansione, compravano classi B anche per collegare pochi host, spaventate dalla possibilità di esaurire una eventuale
classe C.
Per introdurre una maggiore essibilità, nel 1993, si è deciso di abbandonare la struttura a classi e introdurre il
Classless Inter-Domain Routing, che estende il concetto di subnetting su tutto Internet.
Gli indirizzi IP assegnati ad una organizzazione vengono quindi deniti da: l'indirizzo più basso del blocco e il
numero di bit più signicativi comuni a tutti gli indirizzi (l'n della notazione /n ).
Utilizzando CIDR su Internet, non solo i router delle reti interne devono tenere conto delle netmask, ma anche i
router di tutta Internet (che prima funzionavano invece in modo molto più semplice basandosi sulle classi).

Supernetting
Utilizzando CIDR è possibile nalmente assegnare liberamente indirizzi. Quando vengono utilizzati una serie di
indirizzi di classe C ad esempio per creare una rete più grande mediante CIDR, si dice che si sta facendo una operazione
di supernetting, perché si riuniscono, ad esempio,più classi in una classe più grande.

Network Address Translation


Poiché gli indirizzi IP(v4) iniziano a mancare e a diventare costosi, già dall'inizio degli anni 90' è stata introdotta
la tecnica del NAT. Una organizzazione spesso non ha tutti gli host collegati ad internet. È quindi possibile farsi
assegnare un numero di indirizzi IP inferiore a quelli realmente necessari. A questo punto possiamo utilizzare indirizzi
IP privati all'interno della nostra organizzazione e mappare quando necessario un indirizzo pubblico su quell'indirizzo
privato. Il router di frontiera dovrà memorizzare l'associazione indirizzo pubblico-indirizzo privato e quindi occuparsi
di prendere i pacchetti IP provenienti/diretti al nostro host e modicare l'indirizzo IP sorgente/destinazione all'interno
del pacchetto IP in ingresso/uscita.
In realtà spesso si ha invece bisogno di collegare più macchine e si hanno a disposizione solo pochi indirizzi IP. La
soluzione in questo caso (molto più utilizzata della precedente nella realtà) è il NAPT (Network Address Port
Translation ) .
Sapendo che la maggior parte delle operazioni in rete viene svolta mediante i protocolli di trasporto TCP e UDP
(che hanno entrambi dei numeri di porta sorgente e destinazione), si possono collegare molti host dietro ad un unico
indirizzo IP. Il meccanismo del NAPT è il seguente:

49
ˆ Quando un pacchetto in uscita dall'host interno alla nostra rete, attraversa il router di frontiera per andare su
Internet, il router:

 Osserva i campi source port del pacchetto TCP/UDP e source address del pacchetto IP
 Cerca un numero di porta non attualmente occupato sul router
 Modica il pacchetto TCP/UDP con un proprio numero di porta sorgente pubblica e salva in una tabella
con la porta sorgente privata, l'IP privato dell'host interno e l'indirizzo IP di destinazione

 Modica l'indirizzo IP sorgente del pacchetto sostituendolo con l'indirizzo IP pubblico del router

ˆ Quando un pacchetto in ingresso viene ricevuto da Internet dal router di frontiera, ed è diretto ad un host interno
alla rete, il router:

 Osserva i campi porta destinazione del pacchetto TCP/UDP, l'indirizzo IP sorgente e verica se è in corso
una connessione verso quell'indirizzo

 In caso aermativo viene sostituita la porta destinazione del pacchetto TCP/UDP in ingresso con la porta
sorgente privata salvata prima in tabella

 Modica lindirizzo IP destinazione del pacchetto sostiuendolo con l'indirizzo IP privato dell'host a cui è
diretto.

La tabella del NAPT è simile alla seguente:


Indirizzo IP privato Porta sorgente privata Indirizzo IP destinazione Porta sorgente NAPT
10.0.0.2 1000 131.175.12.1 502
10.0.0.3 1054 131.154.3.22 554

ˆ Utilizzando il NAPT sono possibili no a 65536 (numero di porte disponibili) connessioni contemporanee per ogni
indirizzo IP pubblico utilizzato dal router che eettua il NAPT. Questo fattore può essere limitante se utilizziamo
un solo indirizzo IP per un intero ateneo o una azienda, perché quando tutti gli host stanno contattando
contemporaneamente degli host esterni, potremmo esaurire le porte a disposizione.

ˆ N.B: Spesso gli apparati che implementano il NAT non modicano la porta sorgente, se è libera sull'indirizzo
pubblico su cui eettuano la traduzione. Questa assunzione permette tra l'altro la realizzazione di alcune tecniche
di  nat traversal  come  UDP hole punching 

ˆ I pacchetti ICMP più comuni (descritti in seguito) possono essere trasmessi tramite NAPT sfruttando alcune
proprietà sui numeri di sequenza e altro...

Tipi di NAPT (approfondimento ):


Il NAPT
4 è stato standardizzato lasciando molti dettagli non ben deniti. Per questo motivo diversi implementatori
hanno fatto scelte diverse. Da ciò sono scaturiti svariatissimi tipi di NAT, che presentano comportamenti leggermente
diversi. Le dierenze si concentrano principalmente nelle politiche applicate sui pacchetti in ingresso, in particolare
su quali campi vengono controllati.
La classicazione che faremo di seguito è basata sulla RFC3489 (L'RFC della prima versione del protocollo STUN).
Questa classicazione è utile per capire vari comportamenti generali, anche se ad oggi ci sono anche altri tipi di NAT
leggermente dierenti da quelli elencati.

ˆ Assunzione di base:
 Un client dietro la NAT con indirizzo sorgente interno (SIP , SSP ort )
 Il client apre una connessione verso un host su Internet con destinazione indirizzo (DIP , DDP ort )
 L'host su Internet risponde al NAT usando come proprio indirizzo con indirizzo (DIP , DSP ort )
 L'host su Internet può rispondere eventualmente con un altro indirizzo (DIP , DSP ort2 )
 Un altro host su Internet può rispondere eventualmente con indirizzo (D2IP , D2SP ort )

Vediamo cosa succede quando tornano indietro le risposte dalla destinazione.

4 Nel seguito di questo paragrafo useremo la parola NAT per restare conformi all'abitudine di non specicare la dierenza tra NAPT e
NAT

50
Full Cone NAT:

È il tipo meno restrittivo di NAT.

ˆ Quando arrivano pacchetti da Internet verso la NAT, viene eettuato un controllo nel pacchetto ricevuto:

 Sull'indirizzo IP di destinazione (che deve essere uguale a quello del NAT)


 Sul protocollo (TCP e UDP solitamente)
 La porta di destinazione : viene fatto un lookup nella tabella del NAPT e viene inoltrato il pacchetto
se la quella porta è stata allocata per qualche host sulla rete interna.

ˆ Non viene vericato nessun campo sorgente come l'indirizzo IP o la porta sorgente.

ˆ Notiamo che meno veriche signica meno costo computazionale, ma ci sono evidenti problemi di sicurezza.

 Un attaccante può tentare di inviare pacchetti in una connessione esistente, senza necessità di fare spoong
dell'indirizzo IP sorgente

ˆ Nel caso in cui arriva un pacchetto su una porta non allocata dal NAT può:

 Tornare al mittente un segmento TCP contenente un RST


 Tornare al mittente un errore ICMP
 Non accade nulla

server1

host1 NAT box

server2

ˆ Riassumendo:

 L'host interno invia una richiesta ad un host esterno: (SIP , SSP ort ) → (DIP , DDP ort ) su un certo protocollo
P rotocol
 Il NAT genera una nuova riga nella tabella delle connessioni e salva all'interno SIP , SSP ort , P rotocol e lascia
la colonna relativa a N ATSP ort vuota.

SIP SSP ort P rotocol N ATSP ort


... ... ...

 Il NAT sceglie una porta sorgente libera N ATSP ort sul suo indirizzo esterno N ATIP e aggiunge la porta
nella riga appena creata della tabella di mapping, che è ora completa.

SIP SSP ort P rotocol N ATSP ort


... ... ... ...

 A questo punto il NAT utilizza il proprio indirizzo IP pubblico e inoltra il pacchetto modicandolo:
(N ATIP , N ATSP ort ) → (DIP , DDP ort )
 L'host esterno riceve il pacchetto da (N ATIP , N ATSP ort ), alloca una porta DSP ort per la nuova connessione
e risponde inviando il pacchetto (DIP , DSP ort ) → (N ATIP , N ATSP ort )
 Il NAT riceve il pacchetto (DIP , DSP ort ) → (N ATIP , N ATSP ort ),cerca nella tabella e vede che c'è una riga
che ha un N ATSP ort e P rotocol corrispondenti. Inoltre anche N ATIP è corretto, poiché il pacchetto è
stato ricevuto. Quindi il NAT trasforma il pacchetto in: (DIP , DSP ort ) → (SIP , SSP ort ) e lo inoltra.

 Ogni successivo pacchetto da/a l'host interno segue le regole della tabella come sopra
 Ammettiamo che lo stesso host esterno decida di aprire un'altra connessione verso l'host interno:

* L'host esterno genera un pacchetto (DIP , DSP ort2 ) → (N ATIP , N ATSP ort ) e lo inoltra
* Il NAT riceve il pacchetto e trova nella tabella una riga con N ATSP ort e P rotocol uguali. Non viene
fatto nessun ulteriore controllo.

* Il NAT modica il pacchetto e inoltra (DIP , DSP ort2 ) → (SIP , SSP ort ) che viene ricevuto dall'host
interno.

* Quindi l'operazione ha successo.

 Ammettiamo che un altro host decida di aprire una connessione verso l'host interno

51
* Il nuovo host esterno genera un pacchetto (D2IP , D2SP ort ) → (N ATIP , N ATSP ort ) e lo inoltra.
* Il NAT riceve il pacchetto e trova nella tabella una riga con N ATSP ort e P rotocol uguali. Non viene
fatto nessun ulteriore controllo.

* Il NAT modica il pacchetto e inoltra (D2IP , D2SP ort ) → (SIP , SSP ort ) che viene ricevuto dall'host
interno.

* Quindi l'operazione ha successo.

(Address) Restricted Cone NAT

ˆ Quando arrivano pacchetti da Internet verso la NAT, viene eettuato un controllo:

 Sull'indirizzo IP di destinazione (che deve essere uguale a quello del NAT)


 Sul protocollo (TCP e UDP solitamente)
 Sulla porta di destinazione
 Sull'IP sorgente: nella tabella di mapping del NAPT viene salvato anche l'indirizzo IP dell'host remoto
con cui è eettuata la connessione, quindi viene vericato che il pacchetto in ingresso dal mittente stia
arrivando dall'indirizzo IP precedentemente salvato nella tabella. Tuttavia la porta sorgente del mittente
non viene vericata, quindi l'host remoto può aprire una nuova connessione sulla stessa porta.

ˆ In questo modo un host remoto può collegarsi ad un host dietro NAT solo se l'host dietro NAT lo aveva già
contattato il precedenza.

ˆ Notiamo anche l'aggiunta anche dell'indirizzo IP dell'host remoto nella tabella di mapping del NAPT permette
di aumentare il numero di connessioni contemporanee con l'indirizzo del NAPT.

ˆ Anche in questo caso se il pacchetto fallisce la verica potrebbe essere ritornato un errore ICMP, TCP o nulla.

server1

host1 NAT box

server2

ˆ Riassumendo:

 L'host interno invia una richiesta ad un host esterno: (SIP , SSP ort ) → (DIP , DDP ort ) su un certo protocollo
P rotocol
 Il NAT genera una nuova riga nella tabella delle connessioni e salva all'interno SIP , SSP ort , DIP , P rotocol
e lascia la colonna relativa a N ATSP ort vuota.

SIP SSP ort DIP P rotocol N ATSP ort


... ... ... ...

 Il NAT sceglie una porta sorgente libera N ATSP ort sul suo indirizzo esterno N ATIP e aggiunge la porta
nella riga appena creata della tabella di mapping, che è ora completa.

SIP SSP ort DIP P rotocol N ATSP ort


... ... ... ... ...

 A questo punto il NAT utilizza il proprio indirizzo IP pubblico e inoltra il pacchetto modicandolo:
(N ATIP , N ATSP ort ) → (DIP , DDP ort )
 L'host esterno riceve il pacchetto da (N ATIP , N ATSP ort ), alloca una porta DSP ort per la nuova connessione
e risponde inviando il pacchetto (DIP , DSP ort ) → (N ATIP , N ATSP ort )
 Il NAT riceve il pacchetto (DIP , DSP ort ) → (N ATIP , N ATSP ort ),cerca nella tabella e vede che c'è una
riga che ha un N ATSP ort , DIP e P rotocol corrispondenti. Inoltre anche N ATIP è corretto, poiché il
pacchetto è stato ricevuto. Quindi il NAT trasforma il pacchetto in: (DIP , DSP ort ) → (SIP , SSP ort ) e lo
inoltra.

 Ogni successivo pacchetto da/a l'host interno segue le regole della tabella come sopra
 Ammettiamo che lo stesso host esterno decida di aprire un'altra connessione verso l'host interno:

* L'host esterno genera un pacchetto (DIP , DSP ort2 ) → (N ATIP , N ATSP ort ) e lo inoltra
* Il NAT riceve il pacchetto e trova nella tabella una riga con N ATSP ort , DIP e P rotocol uguali. Non
viene fatto nessun ulteriore controllo.

52
* Il NAT modica il pacchetto e inoltra (DIP , DSP ort2 ) → (SIP , SSP ort ) che viene ricevuto dall'host
interno.

* Quindi l'operazione ha successo.

 Ammettiamo che un altro host decida di aprire una connessione verso l'host interno

* Il nuovo host esterno genera un pacchetto (D2IP , D2SP ort ) → (N ATIP , N ATSP ort ) e lo inoltra.
* Il NAT riceve il pacchetto e trova nella tabella una riga con N ATSP ort e P rotocol uguali ma DIP è
diverso. Quindi non è possibile inoltrare il pacchetto.
· Viene inviato un errore ICMP, TCP (N ATIP , N ATSP ort ) → (D2IP , D2SP ort ) o nulla.

* Quindi l'operazione non ha successo

Port-restricted cone NAT

ˆ Quando arrivano pacchetti da Internet verso la NAT, viene eettuato un controllo:

 Sull'indirizzo IP di destinazione (che deve essere uguale a quello del NAT)


 Sul protocollo (TCP e UDP solitamente)
 Sulla porta di destinazione
 Sull'IP sorgente
 Sulla porta sorgente, che deve essere quindi salvata nella tabella del NAT al momento dell'instaurazione
della connessione (arrivo del primo pacchetto SYN/ACK da parte dell'host remoto).

ˆ Aggiungiamo overhead nella tabella del NAPT senza aumentare particolarmente il livello di security.

ˆ Come prima c'è la possibilità di un errore ICMP o TCP nel caso in cui fallisce la verica

server1

host1 NAT box

server2

ˆ Riassumendo:

 L'host interno invia una richiesta ad un host esterno: (SIP , SSP ort ) → (DIP , DDP ort ) su un certo protocollo
P rotocol
 Il NAT genera una nuova riga nella tabella delle connessioni e salva all'interno SIP , SSP ort , DIP , P rotocol
e lascia le colonne relative a N ATSP ort e DSP ort vuote.

SIP SSP ort DIP P rotocol N ATSP ort DSP ort


... ... ... ...

 Il NAT sceglie una porta sorgente libera N ATSP ort sul suo indirizzo esterno N ATIP e aggiunge la porta
nella riga appena creata della tabella di mapping.

SIP SSP ort DIP P rotocol N ATSP ort DSP ort


... ... ... ... ...

 A questo punto il NAT utilizza il proprio indirizzo IP pubblico e inoltra il pacchetto modicandolo:
(N ATIP , N ATSP ort ) → (DIP , DDP ort )
 L'host esterno riceve il pacchetto da (N ATIP , N ATSP ort ), alloca una porta DSP ort per la nuova connessione
e risponde inviando il pacchetto (DIP , DSP ort ) → (N ATIP , N ATSP ort )
 Il NAT riceve il pacchetto (DIP , DSP ort ) → (N ATIP , N ATSP ort ),cerca nella tabella e vede che c'è una
riga che ha un N ATSP ort , DIP e P rotocol corrispondenti e DSP ort non è ancora denito. Inoltre
anche N ATIP è corretto, poiché il pacchetto è stato ricevuto. Quindi il NAT trasforma il pacchetto in:
(DIP , DSP ort ) → (SIP , SSP ort ), lo inoltra e inoltre aggiorna la tabella del mapping aggiungendo il valore
di DSP ort mancante.

SIP SSP ort DIP P rotocol N ATSP ort DSP ort


... ... ... ... ... ...

 Ogni successivo pacchetto da/a l'host interno segue le regole della tabella come sopra

53
 Ammettiamo che lo stesso host esterno decida di aprire un'altra connessione verso l'host interno:

* L'host esterno genera un pacchetto (DIP , DSP ort2 ) → (N ATIP , N ATSP ort ) e lo inoltra

* Il NAT riceve il pacchetto e trova nella tabella una riga con N ATSP ort , DIP e P rotocol uguali ma
DSP ort è diverso.
· Viene inviato un errore ICMP, TCP (N ATIP , N ATSP ort ) → (DIP , DSP ort ) o nulla.

* Quindi l'operazione non ha successo.

 Ammettiamo che un altro host decida di aprire una connessione verso l'host interno

* Il nuovo host esterno genera un pacchetto (D2IP , D2SP ort ) → (N ATIP , N ATSP ort ) e lo inoltra.
* Il NAT riceve il pacchetto e trova nella tabella una riga con N ATSP ort e P rotocol uguali ma DIP è
diverso. Quindi non è possibile inoltrare il pacchetto.
· Viene inviato a un errore ICMP, TCP (N ATIP , N ATSP ort ) → (D2IP , D2SP ort ) o nulla.

* Quindi l'operazione non ha successo.

ˆ Symmetric NAT
 Si tratta di un NAT di tipo port-restricted cone dotato di più di un indirizzo IP pubblico.
 Come prima avremo che quando arrivano pacchetti da Internet verso la NAT, viene eettuato un controllo:

* Sull'indirizzo IP di destinazione (che deve essere uno di quelli del NAT)


* Sul protocollo (TCP e UDP solitamente)
* Sulla porta di destinazione
* Sull'IP sorgente
* Sulla porta sorgente, che deve essere quindi salvata nella tabella del NAT al momento dell'instau-
razione della connessione (arrivo del primo pacchetto SYN/ACK da parte dell'host remoto).

 Quando un host dietro la NAT eettua una connessione con un host esterno viene utilizzato un certo
indirizzo IP sorgente dal NAT. Quando viene instaurata una nuova connessione, anche con lo stesso server,
il NAT potrebbe decidere (ad esempio perché è saturo di porte sorgenti occupate) di utilizzare un indirizzo
IP pubblico sorgente diverso da quello precedente. Quello che accade è che quindi un host dietro NAT si
presenta a dei server pubblici con indirizzo diverso.

 Questo meccanismo genera problemi in una serie di antiche applicazioni che fanno qualche tipo di load
balacing inoltrando connessioni a server diversi.

 Questo tipo di NAT viene solitamente adottato in grandi reti aziendali, campus universitari etc... Il motivo
principale è la scarsità di connessioni contemporanee che è possibile ottenere con un unico indirizzo IP
sorgente (vedi nei paragra seguenti).

NAT server1

host1

box server2

ˆ Riassumendo:

 L'host interno invia una richiesta ad un host esterno: (SIP , SSP ort ) → (DIP , DDP ort ) su un certo protocollo
P rotocol
 Il NAT genera una nuova riga nella tabella delle connessioni e salva all'interno SIP , SSP ort , DIP , P rotocol
e lascia le colonne relative a N ATSP ort , N ATIP e DSP ort vuote.

SIP SSP ort DIP P rotocol N ATIP N ATSP ort DSP ort
... ... ... ...

 Il NAT sceglie una porta sorgente libera N ATSP ort sul uno dei vari indirizzi esterni N ATIP e aggiunge
la porta nella riga appena creata della tabella di mapping.

SIP SSP ort DIP P rotocol N ATIP N ATSP ort DSP ort
... ... ... ... ... ...

* Notiamo che se viene aperta un'altra connessione, potrebbe essere selezionato un indirizzo N ATIP
completamente diverso, che è proprio la proprietà del symmetric NAT.

54
 A questo punto il NAT utilizza il proprio indirizzo IP pubblico e inoltra il pacchetto modicandolo:
(N ATIP , N ATSP ort ) → (DIP , DDP ort )
 L'host esterno riceve il pacchetto da (N ATIP , N ATSP ort ), alloca una porta DSP ort per la nuova connessione
e risponde inviando il pacchetto (DIP , DSP ort ) → (N ATIP , N ATSP ort )
 Il NAT riceve il pacchetto
(DIP , DSP ort ) → (N ATIP , N ATSP ort ),cerca nella tabella e vede che c'è una riga
che ha unN ATSP ort , DIP , N ATIP e P rotocol corrispondenti e DSP ort non è ancora denito. Quindi il
NAT trasforma il pacchetto in: (DIP , DSP ort ) → (SIP , SSP ort ), lo inoltra e inoltre aggiorna la tabella del
mapping aggiungendo il valore di DSP ort mancante.

SIP SSP ort DIP P rotocol N ATIP N ATSP ort DSP ort
... ... ... ... ... ... ...

 Ogni successivo pacchetto da/a l'host interno segue le regole della tabella come sopra
 Ammettiamo che lo stesso host esterno decida di aprire un'altra connessione verso l'host interno:

* L'host esterno genera un pacchetto (DIP , DSP ort2 ) → (N ATIP , N ATSP ort ) e lo inoltra
* Il NAT riceve il pacchetto e trova nella tabella una riga con N ATIP , N ATSP ort , DIP e P rotocol uguali
ma DSP ort è diverso.
· Viene inviato un errore ICMP, TCP (N ATIP , N ATSP ort ) → (DIP , DSP ort ) o nulla.

* Quindi l'operazione non ha successo.

 Ammettiamo che un altro host decida di aprire una connessione verso l'host interno

* Il nuovo host esterno genera un pacchetto (D2IP , D2SP ort ) → (N ATIP , N ATSP ort ) e lo inoltra.
* Il NAT riceve il pacchetto e trova nella tabella una riga con N ATIP , N ATSP ort e P rotocol uguali ma
DIP è diverso. Quindi non è possibile inoltrare il pacchetto.
· Viene inviato a un errore ICMP, TCP (N ATIP , N ATSP ort ) → (D2IP , D2SP ort ) o nulla.

* Quindi l'operazione non ha successo.

Altre complicazioni del NAPT


ˆ Su alcuni NAT è possibile tramite interfacce web o protocolli appositi (NAT-PMP, UPnP, Zeroconf, interfacce
web,...) impostare delle regole per stabilire un mapping sso ingresso. Ad esempio se abbiamo un server web
dietro NAPT è possibile istruire il nat dicendo tutte le connessioni che ricevi sulla porta 80 inoltrale all'indirizzo
IP privato ..., questo permette di rendere pubblico un server web dietro nat. Questo meccanismo viene alle
volte chiamato DNAT (destination NAT).

ˆ Alcuni tipi particolari di NAT hanno dei trigger, che impostano dei port mapping statici automaticamente
(e li rimuovono dopo un certo periodo di tempo) per alcune porte solitamente utilizzate per applicazioni p2p
(giochi online etc). Non è una funzionalità molto diusa comunque.

ˆ Alcuni tipi aggressivi di NAPT vericano addirittura i numeri di sequenza e acknowledgment del TCP, even-
tualmente modicando anche quelli oltre ai numeri di porta. Fortunatamente è un tipo di NAPT molto raro da
trovare.

ˆ Hairpinning
ˆ Per risolvere un po' dei problemi riguardo alle imprecisioni sull'implementazione delle NAT, la IETF ha rilasciato
due RFC, relative a raccomandazioni per i nat che usano TCP e UDP: RFC5382 e RFC4787.

Perché il NAPT non andrebbe utilizzato (approfondimento )


ˆ NAPT viola la più importante regola di straticazione dei protocolli , secondo la quale un protocollo
di livello k non dovrebbe fare nessuna assunzione riguardo a protocolli di livello k+1. Un router normalmente
dovrebbe solo prendere i pacchetti IP che arrivano ed instradarli, invece con il NAPT deve anche andare a
controllare il carico del pacchetto IP per vericare il numero di porta, cosa che non dovrebbe fare per le regole
sulla straticazione dei protocolli. Questo causa inoltre overhead non previsto su un apparato che dovrebbe solo
instradare e invece deve iniziare anche a tenere traccia di tutte le connessioni che lo attraversano.

ˆ NAPT viola il modello gerarchico di IP , che aerma che ogni macchina collegata in rete è identicata in
modo univoco a livello mondiale da uno o più indirizzi IP.

ˆ I processi su Internet non sono obbligati ad utilizzare TCP e UDP (o ICMP). Se un utente dietro
ad una NAT decide di utilizzare un diverso protocollo di livello 4 non potrà funzionare, perchè il NAPT si basa
sull'idea di controllare i numeri di porta, che in alcuni protocolli di livello 4 potrebbero non esistere. ICMP,
il protocollo per il controllo del funzionamento di IP e per la diagnostica di rete, non utilizza numeri di porta

55
ed è stato necessario implementare nei router che fanno il NAPT dei particolari workaround per permettere di
inviare e ricevere i pacchetti correttamente. Questo ovviamente è tutto altro carico sulle spalle del router. Ad
oggi su Internet, per le applicazioni di larga diusione sono quindi solo 3 i protocolli di livello 4 che possono
essere utilizzati: TCP, UDP e ICMP. Se servono altre funzionalità l'unica strada solitamente adottata è quella
di costruire qualcosa di custom sopra UDP, che è comunque un protocollo a datagramma semplicissimo, quindi
adatto allo scopo. Tuttavia questa resta una cattiva violazione dei principi su cui è stato costruito Internet.

ˆ Il numero di connessioni contemporanee diminuisce . Poichè il router del NAPT deve allocare una delle sue
porte sorgente per ciascuna connessione, essendo le porte utilizzabili 216 (in realtà le prime 4096 sono riservate ad
usi speciali), non possiamo avere più di 61440 connessioni contemporanee per ogni indirizzo IP pubblico utilizzato
dal router. Possono sembrare una valanga ma se usiamo un solo IP per la rete di una azienda o una università e
magari qualcuno inizia a fare port-scanning o altre brutte cose che consumano un sacco di connessioni, il router
satura subito le porte libere. Se abbiamo 614 computer dietro il NAT, ciascuno potrà fare circa 100 connessioni
contemporanee, dopo di che il NAPT non ha più numeri di porta liberi. Tra l'altro la reazione del NAPT in
seguito all'esaurimento del numero di porte utilizzabili è molto ambigua. Alcuni NAPT chiudono le porte più
vecchie, altri riutano nuove connessioni, altri non fanno niente e alcuni NAPT addirittura vanno in crash.

ˆ NAPT trasforma Internet da una rete ad assenza di connessione , in un tipo di rete orientata alle
connessioni, perchè il dispositivo NAPT deve conservare le informazioni relative ad ogni connessione che lo
attraversa. Se un dispositivo NAPT si blocca e la sua tabella di mappatura si perde, tutte le sue connessioni
TCP/UDP verranno distrutte. In assenza di NAPT, i guasti ai router non hanno eetto su TCP/UDP, perchè
il processo di ritrasmissione si attiva dopo il timeout di alcuni secondi.

ˆ L'header IPv4 e quello TCP/UDP/ICMP contengono al loro interno dei campi di checksum. Nell'header
IPv4 andiamo a modicare sicuramente un indirizzo IP per implementare il NAPT, quindi dovremo ricalcolare il
checksum dell'header IP. TCP e ICMP contengono inoltre dei checksum di tutto il pacchetto, non solo l'header.
Questi checksum comprendono anche una parte dell'header IP, quindi dovranno essere ricalcolati. Il router che
si occupa di fare NAPT nirà per avere molto lavoro da fare per poter calcolare tutti i checksums di tutti i
pacchetti a velocità wire-speed.

ˆ Se un pacchetto IPv4 viene frammentato, il primo frammento conterrà l'header TCP/UDP/ICMP, ma gli
altri frammenti no. Per poter identicare il pacchetto ed applicare una traduzione corretta, il NAPT dovrà
tenere traccia del  Fragment Identier di ogni pacchetto frammentato. Se due host con gli stessi indirizzi IP
comunicano tra di loro generando due pacchetti frammentati con lo stesso Fragment Identier, il NAPT non sarà
più in grado di eettuare la traduzione, non potendo distinguere i due pacchetti. È una situazione abbastanza
rara e improbabile, ma possibile, specialmente se stiamo lavorando con links ad alta capacità dove è attiva la
frammentazione (Il fragment identier è di soli 13 bit, ci sono solamente 8192 fragment id possibili).

ˆ Solitamente ogni host collegato su Internet può eettuare delle connessioni a dei server, oppure esporre dei
propri servizi alla rete e permettere ad altri di collegarvisi. Purtroppo con l'introduzione del NAPT, se
ad esempio nella rete locale ci sono due host con server web sulla porta 80, non è possibile esporre entrambi quei
servizi sullo stesso indirizzo sulla stessa porta 80, quindi l'unica soluzione possibile (quando viene manualmente
abilitata con il così detto Port Forwarding), è di assegnare due porte distinte dell'indirizzo pubblico ai due servizi
dietro al NAPT, quindi ad esempio la porta 80 per uno dei due server web e la porta 81 per l'altro. Così facendo
ovviamente i servizi che i vari host della rete locale possono esporre si riduce notevolemente. Se poi teniamo
conto che gli stessi numeri di porta devono anche essere usati come porte sorgenti per le connessioni in uscita,
la situazione è sempre peggiore.

ˆ Molti protocolli a livello applicativo, tra cui DCC e il notissimo FTP (in modalità attiva) fanno uso degli
indirizzi IP degli host da cui si originano le connessioni all'interno dei messaggi scambiati a livello
applicativo per avvertire il server a cui si collegano di inviare i dati da scaricare su una certa porta del client. Il
NAPT non sa nulla di tutto questo e il risultato è che questi protocolli non sono più in grado di funzionare perché
i server FTP tentano di inviare i dati a porte sul router NAPT che non è a conoscenza di questa operazione
in corso e non permette il passaggio. Su alcuni router sono stati implementati dei meccanismi per intercettare
il traco a livello applicativo di questi protocolli e sbloccare le porte in ingresso per mettergli di funzionare
(Application Level Gateways ). Questo è ancora più grave del primo punto perché con questo problema il
router non deve solo andare a vedere il livello protocollare 4, ma addirittura anche i dati sul livello 7. Questo
genera un overhead esagerato sulle operazioni di cui deve tenere traccia il povero router.

ˆ Il NAPT non permette di mantenere connessioni aperte in stato idle . Spesso può capitare di dover
tenere una connessione aperta dove non passa neanche un bit per settimane. TCP supporta questa cosa senza
problemi ma il NAPT avendo pochi numeri di porta sorgente a disposizione non può permettersi di sprecarli
per connessioni che non fanno nulla, quindi quando non viene rilevata attività per un po' di tempo in molte
implementazioni di NAPT si è obbligati a cancellare dalla tabella del NAPT la connessione. La cosa peggiore di
questa cosa è che i due host credono di essere ancora collegati tra loro, perché il NAPT non avvisa nè mittente

56
nè destinatario che ha cancellato la riga nella tabella, quindi il client che ha aperto la connessione non vedrà
nessun dato arrivargli anche se il server ha tentato di inviarli senza ricevere risposta.

Va inne sottolineato come, purtroppo, a causa della mancanza di indirizzi pubblici da assegnare che si sta facendo
sentire soprattutto negli ultimi mesi (nel 2011 la IANA ha terminato i blocchi assegnabili ai registers regionali),
non abbiamo al giorno d'oggi altra soluzione che costringersi ad utilizzare il NAT, nell'attesa dell'arrivo di IPv6 (che
comunque già dal 2008 è ucialmente attivo su tutti i backbone di Internet).
In generale la comunità sostiene che il NAT non sia buono (vedi i motivi di cui sopra), ma che considerato il
problema da risolvere è un compromesso accettabile. Tuttavia visti i problemi sopra bisognerebbe perlomeno evitare
due situazioni abbastanza comuni:

ˆ In alcune reti aziendali o campus universitari vengono acquistati un numero elevato di indirizzi IP pubblici che
sono inutilizzati, spesso sono in numero suciente per distribuirli a tutti. Certo assegnarli a tutti gli utenti e
lasciarli completamente aperti non è una buona soluzione, si può predisporre un rewall di fronte, però adottare
il NAPT come soluzione in una situazione del genere è ineciente e relativamente stupido.

ˆ In alcune reti già dietro NAPT vengono create delle sotto-reti locali utilizzando altri router che eettuano il
NAT. Visti i problemi di cui sopra, se non ci sono motivi seri per farlo è meglio evitare di creare una NAPT
dentro la NAPT. Meglio ricorrere ad un semplice rewall se i problemi sono di sicurezza.

NAT Traversal (approfondimento )


Per risolvere i problemi di comunicazione end-to-end tra host dietro NAT è possibile utilizzare dei metodi di NAT
Traversal. Purtroppo ce ne sono diversi e non tutti sono sempre disponibili e/o funzionanti. Perché? Come citato
precedentemente nel paragrafo sui tipi di NAT, inizialmente l'idea del NAT è stata criticata dalla comunità IETF che
lavora sugli standard di Internet, per diversi motivi tra cui quelli sopra citati. Per questo motivo è andato a nire che
i vendors che avevano bisogno di una soluzione al problema degli IPv4 pubblici hanno iniziato ad implementare NAT
comunque, anche se uno standard non era presente e ben denito. In questo modo ogni vendor ha nito per utilizzare
una propria soluzione specica e dedicata, spesso senza rilasciarne le speciche implementative. Il risultato è che sono
venuti a formarsi tanti tipi di NAT (sopra arontati) che si comportano in modo diverso. Ergo è dicile utilizzare
una tecnica per attraversarli che funzioni su tutti.
Principalmente le tecniche sono le seguenti:

ˆ Relay su un server esterno : È la politica adottata dal protocollo TURN (che insieme a STUN forma il
protocollo ICE). Si sceglie un server esterno che faccia da relay a livello applicativo dei messaggi.

ˆ Simultaneous SYN : Nella RFC di TCP è considerato un caso in cui due host aprono una connessione man-
dandosi un SYN a vicenda che arriva ad entrambi prima che l'altro abbia inviato altro. Sfruttando questo fatto
e assumendo che questa funzionalità sia implementata dal NAPT, dovrebbe essere possibile per due host dietro
due NAPT, stabilire una connessione tra loro, a patto di accordarsi (tramite qualche meccanismo esterno) sui
numeri di porta da utilizzare.

ˆ UDP Hole punching : Questa tecnica sfrutta una proprietà (citata come port preservation in RFC4787)
che hanno molti NAPT riguardo al preservare la porta UDP sorgente utilizzata da un client che stabilisce una
connessione dall'interno di una NAT verso l'esterno. Sfruttando un qualche meccanismo di comunicazione esterno
per il signaling, due host, entrambi dietro NAPT, possono stabilire una connessione UDP diretta tra di loro, a
patto di accordarsi sui numeri di porta da utilizzare, e dopo aver scoperto i propri indirizzi IP pubblici. Anche se
alcuni NAPT non modicano la porta UDP sorgente, potrebbero mandare un ICMP port unreachable quando
la richiesta del mittente arriva dalla rete esterna sul NAPT prima che il destinatario abbia inviato anche lui una
richiesta. Per risolvere questi problemi sono necessarie dei trucchi che comprendono una possibile modica
del TTL dei pacchetti inviati, di modo da farli scadere prima che raggiungano il NAPT router di destinazione.
(Questo metodo era sfruttato molto da un software VPN free chiamato  Hamachi )

ˆ NAT pinning : Tecnica che permette a due host entrambi dietro NAPT, oppure entrambi dietro due NAPT
diverse che sono in cascata ad una NAPT più grande, di stabilire una connessione tra di loro, rimbalzando i
pacchetti sul NAPT di primo livello.

ˆ UPnP Internet Gateway Device (IGD) Service : È un servizio oerto da un router NAPT che implementa
anche il protocollo UPnP. Il client può contattare il router senza autenticazione e richiedergli di aprire (fare un
assegnamento statico di) una porta TCP o UDP dall'esterno verso il proprio indirizzo interno. In questo modo
il client può facilmente stabilire canali diretti (a patto di avere questo servizio installato sul router). UPnP IGD
è implementato solitamente sui router domestici e presenta comunque diversi problemi di sicurezza sia per la
mancanza di autenticazione che per possibili attacchi dall'esterno (a causa di implementazioni errate) dimostrati
da alcune ricerche.

ˆ NAT-PMP : Molto simile a UPnP IGD ma meno famoso.

57
ˆ STUN : Sfrutta le proprietà dei tipi di NAPT mostrati in precedenza (Full Cone, Port Restricted, ...) per
stabilire una connessione UDP diretta tra due host. Spesso funziona anche in presenza di più NAPT in cascata.
L'unico caso in cui non riesce a funzionare è quando entrambi gli host coinvolti nella comunicazione sono dietro
Symmetric NAT. Insieme al protocollo TURN forma il protocollo ICE, che ad oggi è lo standard più utilizzato
per NAT Traversal. Viene utilizzato da Skype e WebRTC. In base a recenti statistiche circa il 70% dei NAT
presenti supporta l'utilizzo di STUN per fare traversal.

ˆ Esistono una serie di tecniche simili a STUN, basate su TCP invece di UDP, raccolte nella RFC 6544.

Indirizzamento IPv6
La principale modica di IPv6 a IPv4 è stata la lunghezza degl indirizzi. IPv6 utilizza infatti indirizzi IP da 128 bit
(16 byte). Gli indirizzi IPv6 vengono, per comodità, rappresentati da 8 blocchi da 4 caratteri esadecimali, come ad
esempio:

8000 : 0000 : 0000 : 0000 : 0123 : 4567 : 89AB : CDEF


Poiché molti indirizzi possono contenere parecchi zeri, sono state introdotte alcune ottimizzazioni:

ˆ È possibile ometter gli zero iniziali di un gruppo, quindi nel gruppo 0123 dell'indirizzo precedente, è possibile
omettere lo 0.

ˆ Dove sono presenti blocchi nulli consecutivi, è possibile semplicemente ometterli, quindi l'indirizzo precedente
diventerebbe:
8000 :: 0123 : 4567 : 89AB : CDEF

 Tuttavia questa regola può essere applicata una sola volta nell'indirizzo. Se l'indirizzo fosse 8000 : 0000 :
0000 : 1000 : 0000 : 0000 : 0000 : 0001, non possiamo scrivere 8000 :: 1000 :: 0001, in quanto si perde
l'informazione su dove sia il blocco 1000

ˆ Inne gli indirizzi IPv4 possono essere scritti in notazione decimale a punti dopo una coppia di due punti
all'interno di un IPv4:
:: 192.31.20.46

Con 2128 indirizzi, se l'intero pianeta, terraferma ed acqua, fosse coperto di computer, IPv6 permetterebbe di utilizzare
7 · 1023 indirizzi per metro quadro che, almeno per il momento, sembrano essere sucienti per adesso e per il futuro...
Gli indirizzi non saranno assegnati in modo eciente, ma anche considerando un caso pessimo, con pessime scelte di
allocazione e sprechi, ci saranno almeno 1000 indirizzi per metro quadro terrestre.
Ogni indirizzo IPv6 è suddiviso idealmente in quattro parti:
Tipo indirizzo Presso ISP Sottorete Identicatore host
3 bit 45 bit 16 bit 64 bit

ˆ Tipo di indirizzo (3 bit): detto anche  format prex , serve per specicare se si tratta di indirizzi unicast o
multicast. Gli indirizzi di tipo unicast hanno la sequenza di bit 001
ˆ Presso ISP (45 bit): È un identicatore dell'Internet Service Provider, è suddiviso in varie parti:

 Top-Level Aggregation ID, TLA ID (bit #4-16): È un identicatore del provider a livello di backbone
 RES (bit #17-24): Campo riservato per uso futuro
 Next-Level Aggregation ID (bit #25-48): È un identicatore di ISP regionale e ID sito

ˆ Sottorete (16 bit): Anche detto (Site-Level Aggregation ID - SLA ID ), è un identicatore di una sottorete
dell'ISP regionale.

ˆ Identicatore host (64 bit): Anche detto Interface ID , è un identicatore che ciascuna macchina della sot-
torete può solitamente scegliere a piacere. Per convenzione combina solitamente l'indirizzo MAC della scheda
di rete con le cifre esadecimali 0xFFFE. Un bit speciale (il bit 6 del primo byte) del MAC (il bit chiamato uni-
versal/local bit ) deve essere complementato (RFC2373). Sfruttando questo sistema gli host vengono numerati
in modo automatico, senza obbligo di DHCP o congurazione manuale. Questa parte dell'indirizzo sarà com-
pletamente controllata dalla sottorete, quindi gli ISP non hanno la possibilità di limitare il numero di indirizzi
pubblici assegnati al di sotto dei 264 .

58
Il fatto di utilizzare il MAC address all'interno dell'indirizzo pubblico potrebbe portare potenzialmente ad alcune
problematiche di sicurezza. Un ipotetico attacante potrebbe dedurre il tipo di host dall'indirizzo e tentare qualche
attacco. È anche vero però che quel campo può essere impostato ad un valore qualunque e non obbligatoriamente il
MAC address.
Assegnare indirizzi IPv6 è più semplice che assegnare indirizzi IPv4 perché bisogna tenere traccia solo della sottorete.
Ogni sottorete ha un numero di indirizzi possibili enorme:

264 = 18446744073709551616 ' 1, 84 · 1019


Una modica interessante introdotta da IPv6 è che quando una organizzazione decide di cambiare ISP o comunque
sottorete, sarà necessario cambiare solo la prima parte dell'indirizzo e non tutta. Questo permetterà di dover cambiare
solo l'indirizzo principale sul router di frontiera. Anche gli indirizzi degli host della sottorete cambieranno, però la
parte di identicazione host resterà uguale. In questo modo si ottiene una sorta di meccanismo analogo al NAT, senza
tutti i problemi che però ha il NAT.
L'utilizzo delle maschere di rete è comunque consentito per permettere tutti i meccanismi classici di Internet e
anche per permettere di assegnare più sottoreti ad una stessa organizzazione.

Tipo e intervalli di indirizzi


Presso IPv6 Allocazione
0000::/8 Riservati da IETF
2000::/3 Global Unicast
fc00::/7 Unique Local Unicast
fe80::/10 Link Local Unicast
00::/8 Multicast
3f:f::/32 Riservati per esempi e documentazione
2001:0DB8 Riservati per esempi e documentazione
L'indirizzo ::1/128 è riservato per l'utilizzo locale (come il vecchio 127.0.0.1/8 )

ˆ Link Local Unicast (Scope:Link) : Indica che si tratta di un indirizzo IPv6 privato non routabile, valido
solo all'interno della singola sottorete. Lo scopo di questi indirizzi è per collegamenti interni in reti ad-hoc (ad
esempio servizi per conferenza).

ˆ (Scope:Host ) : Indica che si tratta di un indirizzo IPv6 di loopback. I pacchetti provenienti da questo indirizzo
non lasciano mai la macchina locale.

ˆ Multicast in IPv6 è simile al broadcast IPv4, con alcune dierenze: un indirizzo di multicast invia solo ad
alcuni host, non a tutti quelli nella sottorete.Il router farà passare poi i pacchetti del gruppo a cui appartiene
anche lui stesso, di modo da poter ricevere le risposte. Tutti gli indirizzi di broadcast iniziano con .

ˆ Anycast : è un indirizzo singolo assegnato a più nodi. Il pacchetto inviato a questo indirizzo sarà recapitato al
primo host disponibile. Questa funzionalità è stata pensata per load-balancing e ridondanza dei servizi. Alcuni
dei server DNS principali utilizzano questo tipo di indirizzo.

Protocollo ICMP
È un protocollo di supporto a IP che serve per controllare il corretto funzionamento dei router e degli host. Ci sono
circa una ventina di tipi di messaggi ICMP, vedremo qui i più importanti.
ICMP non corregge gli errori, si limita a segnalarli. I messaggi di errore contengono l'header del pacchetto IP che li
ha generati e i suoi primi 8 byte di dati. Per altre informazioni dettagliate riguardo alle opzioni di ogni tipo di struttura
ICMP è possibile consultare la pagina web http://www.iana.org/assignments/icmp-parameters/icmp-parameters.xml

Struttura del datagramma ICMP

 (32 bit) 
Type (8 bit) Code (8 bit) Checksum (16 bit)
Resto dell'header (32 bit)
Sezione dati (lunghezza variabile)

ˆ Type (8 bit): Specica il tipo di pacchetto ICMP. Sono possibili 256 tipi di pacchetto, quelli eettivamente
utilizzati sono una ventina.

ˆ Code (8 bit): È un parametro che assume un signicato dierente a seconda del type che stiamo utilizzando

ˆ Checksum (8 bit): checksum del pacchetto ICMP

ˆ Resto dell'header (32 bit): nel caso alcuni type lo richiedano si ha a disposizione un'altra parola da 32 bit per
l'intestazione (che ha lunghezza ssa)

59
Tipi di pacchetti ICMP

Codice Messaggio Signicato


0 Echo reply Risposta ad una richiesta echo
3 Destination Unreachable Il datagramma non può essere consegnato
4 Source quench Datagramma scartato
5 Redirect Avverto la sorgente di un diverso router da contattare per raggiungere l'host
8 Echo request Richiesta echo ad un host per sapere se è attivo
11 Time exceeded TTL scaduto o tempo massimo di riassemblaggio dei frammenti scaduto
12 Parameter problem Pacchetto IP ricevuto non valido al byte x
13 Timestamp request Segnala all'host che riceverà un timestamp di chi l'ha inviato
14 Timestamp reply Risposta ad una richiesta di timestamp con in allegato il timestamp ricevuto
17 Address mask request Richiesta della netmask da utilizzare
18 Address mask reply Risposta della netmask da utilizzare
... ... ...
Esistono attualmente circa 40 type ICMP standardizzati dalla IANA.

 (32 bit) 
Type (3) Code (0-12) Checksum
Destination unreachable (type 3)
Non usato (0)
Header IP + primi 64 bit dei dati che hanno causato il problema

ˆ Quando un router scarta un pacchetto per qualche motivo, normalmente genera un messaggio di errore che invia
alla sorgente del pacchetto

ˆ Il campo  code  in questo caso viene utilizzato per segnalare il motivo che ha causato l'errore. Se la destinazione
non è presente nella tabella di routing allora code è 7.

 I signicati di code:

Valore Nome
0 Net unreachable
1 Host unreachable
2 Protocol unreachable
3 Port unreachable
4 Fragmentation needed and don't fragment was set
5 Source Route failed
6 Destination Network Unknown
7 Destination Host Unknown
8 Source Host isolated
9 Communication with destination network si administratively prohibited
10 Communication with destination host is administratively prohibited
11 Destination network unreachable for Type of service
12 Destination host unreachable for type of service
13 Communication Administratively prohibited
14 Host Precedence Violation
15 Precedence cuto in eect

ˆ I messaggi standardizzati sono solo questi.

 (32 bit) 
Type (11) Code (0-1) Checksum
Time exceeded (type 11)
Non usato (0)
Header IP + primi 64 bit dei dati che hanno causato il problema

ˆ Code 0 (messaggio inviato da un router): TTL è arrivato a 0

ˆ Code 1 (messaggio inviato dalla destinazione): Non sono arrivati tutti i frammenti di un pacchetto entro un
tempo massimo.

 (32 bit) 
Type (12) Code (0-1) Checksum
Parameter problem (type 12)
Pointer Non usato (0)
Header IP + primi 64 bit dei dati che hanno causato il problema
Viene utilizzato per segnalare un problema in un byte di un pacchetto IP.

60
ˆ Code 0 : incongruenza/errore in qualche campo, pointer punta al campo errato

ˆ Code 1 : opzione non implementata o qualche parte del campo opzioni è mancante.

 (32 bit) 
Type (5) Code (0-3) Checksum
Redirect (type 5)
Indirizzo IP del router
Header IP + primi 64 bit dei dati che hanno causato il problema
La destinazione o un router avvisa la sorgente che per contattare la sua destinazione deve utilizzare un altro router,
il cui IP è passato all'interno dell'header ICMP.

 (32 bit) 
Type (8 oppure 0) Code (0) Checksum
Echo request/reply (type 8/0)
Identier sequence number
Optional data

ˆ Identier (16 bit): viene scelto a caso dal mittente della richiesta, nella risposta va ripetuto uguale.

ˆ Sequence number (16 bit): tiene traccia di pacchetti diversi relativi allo stesso identicatore.

ˆ Optional data : Una sequenza arbitraria di dati può essere inserita e deve essere ripetuta uguale dal destinatario
nella risposta.

 (32 bit) 
Type (13 o 14) Code (0) Checksum
Identier Sequence number
Timestamp request/reply (type 13/14)
Originate timestamp
Receive timestamp
Transmit timestamp

ˆ È un messaggio scambiato tra due host per conoscere qual'è la sincronia dei due clock.

ˆ Originate timestamp (32 bit): Viene riempito dalla sorgente

ˆ Receive timestamp (32 bit): Viene riempito dalla destinazione appena riceve il pacchetto

ˆ Transmit timestamp (32 bit): Viene riempito dalla destinazione immediatamente prima di inviare il pacchetto.

 (32 bit) 
Type (17 o 18) Code (0) Checksum
Address mask request/reply (type 17/18)
identier sequence number
Address mask (32 bit)
Il campo address mask viene riempito dal destinatario.

Il protocollo ARP
È un protocollo di controllo che permette a IP di funzionare. ARP è l'acronimo di Address Resolution Protocol.
Fornisce un metodo per tradurre indirizzi IP in indirizzi MAC.

ˆ Viene incapsulato dentro un pacchetto Ethernet o comunque datalink

ˆ Richiede alle stazioni di inviare dei messaggi in broadcast nella rete locale.

ˆ La tipica comunicazione è chi è X.Y.Z.W? e c'è una risposta sì sono io 00:AA:01:23:45:67!

ˆ Si utilzza una cache che viene invalidata nell'ordine dei minuti, per evitare di mandare troppe richieste

Struttura del pacchetto ARP


 (32 bit) 
Hardware Type Protocol Type
Hardware length Protocol Length Operation (1 request, 2 reply)
Sender hardware address (ex: 6 bytes per Ethernet)
Sender protocol address (ex: 4 bytes per IPv4)
Target hardware address (non riempito in una richiesta)
Target protocol address

61
ARP è un protocollo, incapsulato all'interno di trame di livello 2, che permette di scoprire l'indirizzo di livello 2 di
un host, conoscendone l'indirizzo di livello 3.
L'utilizzo classico è all'interno delle reti Ethernet quando si cerca un host a partire dal suo indirizzo IP:

ˆ Un host A vuole contattare un host B

ˆ A invia un pacchetto ARP con il proprio MAC address sorgente all'indirizzo di broadcast FF:FF:FF:FF:FF:FF
chiedendo quale sia il MAC address corrispondente all'indirizzo IP di B.

ˆ B risponde con un pacchetto ARP di risposta, iviando ad A (di cui conosce il MAC address dalla risposta
ricevuta), il proprio MAC address.

In alcune congurazioni particolari potrebbe essere utile congurare un proxy ARP, cioè un host della rete che
provvede a dare risposte ARP per conto di altri host. È tuttavia, molto spesso, sconsigliabile il suo utilizzo, preferendo
un router o altri meccanismi.

Protocollo RARP
RARP è un acronimo che sta per Reverse Address Resolution Protocol. Si tratta di un protocollo duale ad ARP, che
permette ad un host appena avviato di scoprire il proprio indirizzo IP, a partire dal proprio MAC address, inviando la
richiesta del proprio indirizzo in broadcast nella rete locale. Un server o qualche altro apparato di rete può occuparsi
di fornire una risposta con l'indirizzo IP che l'host dovrà utilizzare. Si tratta quindi di un protocollo utilizzato per
l'autocongurazione di rete.
Questo protocollo presenta alcune limitazioni, tra cui il fatto che viene inviato solo l'indirizzo IP (e nessun'altra
informazione) e che può essere utilizzato solo se il server RARP è nella stessa rete locale dell'host.
Non è un protocollo solitamente utilizzato o abilitato.

Protocollo BOOTP
A dierenza del protocollo RARP utilizza datagrammi IP e protocollo di trasporto UDP.Una stazione generica che
desidera congurare la propria interfaccia di rete per accedere ad Internet, può inviare un messaggio BOOTP (Boot-
strap ) indirizzato ad una specica porta UDP, utilizzando l'indirizzo IP broadcast di sottorete come destinazione e
l'indirizzo nullo come sorgente (sorgente: 0.0.0.0, destinazione:255.255.255.255). Il server BOOTP (che può anche
essere collocato in una LAN dierente appartenente però alla stessa sottorete, risponde all'host con un messaggio che
può contenere indirizzo IP, netmask, indirizzo IP del le server, indirizzo IP del default router,... Questa risposta viene
inviata dal server BOOTP sempre in broadcast in modo analogo a come fa il client per contattare il server.
BOOTP funziona però grazie ad una tabella installata sul server che assegna gli indirizzi, dove è presenta una
associazione di indirizzo IP da assegnare per ogni MAC address.

Protocollo DHCP
Il protocollo DHCP (Dynamic Host Conguration Protocol ), permette una riassegnazione dinamica degli indirizzi al-
l'interno della rete in modo automatico, a dierenza di BOOTP che è pensato per una assegnazione statica mantenendo
una tabella di assegnamenti ssa. Il server DHCP ha un serie di indirizzi assegnabili e ha la possibilità di concedere
un tempo di licenza dell'indirizzo, al termine del quale può decidere di riassegnare l'indirizzo se non sia più in uso.
L'host ha la possibilità di richiedere il rinnovo dell'indirizzo poco prima della sua scadenza. DHCP come BOOTP fa
uso di pacchetti UDP sopra IP, quindi il server non deve necessariamente trovarsi nella stessa rete della stazione che
richiede l'indirizzo, infatti i messaggi DHCP, che sono traposrtati dal protcollo UDP, possono attraversare anche più
router.
DHCP fa uso della porta UDP 67 come sorgente e UDP 68 come destinazione. Inizialmente l'indirizzo IP utilizzato
dal client per mandare la richiesta sarà 0.0.0.0 e il destinatario sarà indicato con l'indirizzo di broadcast 255.255.255.255
Inizialmente l'host che richiedere un indirizzo invia un messaggio DHCPDISCOVER sulla sottorete IP a cui è
collegato. Il server risponde con un DHCPOFFER (indirizzo IP, netmask, gateway e server DNS), a cui il client
risponde con un DHCPREQUEST e inne DHCPACK. Il client potrebbe riutare un indirizzo oertogli, il che ha
senso in presenza di più di un server DHCP. Per rilasciare un IP si utilizza un messaggio esplicito di DHCPRELEASE.

Il protocollo ICMPv6
È la nuova versione del protocollo ICMP, parte integrante di IPv6. In esso sono state aggiunte nuove funzionalità che
erano in precedenza gestite da altri protocolli (ARP e IGMP) e tolte altre inutilizzate del vecchio protocollo ICMP.
Neighbor Discovery Protocol (NDP ) è una parte del protocollo ICMPv6 che permette di sostituire le operazioni svolte
da ARP. Secure Neighbor Discovery Protocol (SEND ) è una estensione di NDP che permette maggiore sicurezza (vedi
ARP spoong). Multicast Router Discovery (MRD ) sostituisce le operazioni svolte dal vecchio protocollo IGMP per
il multicasting.

62
ICMPv6 è stato denito in RFC4443. Come nella versione precedente, lo scopo principale di ICMP resta comunque
monitorare lo stato della rete e inviare pacchetti di gestione o di errore.
ICMPv6 viene trasportato da datagrammi IPv6 utilizzando come Next Header il valore 58.

Struttura del pacchetto ICMPv6

 (32 bit) 
Type (8 bit) Code (8 bit) Checksum (16 bit)
Data

ˆ Type (8 bit): Specica il tipo di messaggio ICMPv6. I valori nell'intervallo 0-127 indicano un messaggio di
errore, mentre i valori 128-255 indicano un messaggio informativo.

ˆ Code (8 bit): È un valore che dipende dal type che specica il sottotipo di messaggio.

ˆ Checksum (16 bit): È un checksum per il controllo d'errore calcolato in modo simile al checksum UDP sfruttando
uno pseudo-header (vedi nel seguito o RFC).

Messaggi di errore
Type Signicato Code Signicato
0 No route to destination
1 Communication with destination administratively prohibited
2 Beyond scope of source address
3 Address unreachable
1 Destination Unreachable 4 Port Unreachable
5 Source address failed ingress/egress policy
6 Reject route to destination
7 Error in Source Routing Header
2 Packet Too Big 0
3 Time Exceeded 0 Hop limit exceeded in transit
1 Fragment reassembly time exceeded
0 Erroneous header eld encountered
4 Parameter Problem 1 Unrecognized Next Header type encountered
2 Unrecognized IPv6 option encountered
100 Private experimentation
101 Private experimentation
127 Reserved for expansion

63
Messaggi informativi
Type Signicato Code Signicato
128 Echo Request 0 RFC4443
129 Echo Reply 0 RFC4443
130 Multicast Listener Query 0 RFC2710
131 Multicast Listener Report 0 RFC2710
132 Multicast Listener Done 0 RFC2710
133 Router Solicitation (NDP) 0 RFC4861
134 Router Advertisement (NDP) 0 RFC4861
135 Neighbor Solicitation (NDP) 0 RFC4861
136 Neighbor Advertisement (NDP) 0 RFC4861
137 Redirect Message (NDP) 0 RFC4861
0 Router Renumbering Command
138 Router Renumbering 1 Router Renumbering Result
255 Sequence Number Reset
0 Data conains IPv6 address subject
139 ICMP Node Information Query 1 Data conains name of the subject
2 Data conains IPv4 address subject
0 Successful reply
140 ICMP Node Information Response 1 Responder refuses to answer
2 Qtime of the query unknown
141 Inverse Neighbor Discovery 0
Solicitation Message
142 Inverse Neighbor Discovery 0
Advertisement Message
143 Multicast Listener Discovery
reports (RFC3810)
144 Home Agent Address Discovery 0 RFC6275
Request Message
145 Home Agent Address Discovery 0 RFC6275
Reply Message
146 Mobile Prex Solicitation 0 RFC6275
147 Mobile Prex Advertisement 0 RFC6275
148 Certication Path Soliciation (SEND) RFC3971
149 Certication Path Advertisement (SEND) RFC3971
151 Multicast Router Advertisement (SEND) RFC4286
152 Multicast Router Solicitation (MRD) RFC4286
153 Multicast Router Termination (MRD) RFC4286
200 Private experimentation
201 Private experimentation
255 Reserved for exapansion
Per funzionare correttamene, un host che fa uso di IPv6 deve obbligatoriamente accettare e rispondere ai messaggi
ICMPv6 con valori type 135 e 136. Per altre informazioni sugli obblighi in ICMPv6 consultare la RFC4890.

Lo strato di trasporto (livello 4 ISO/OSI)


Protocollo UDP
Il nome UDP sta per User Datagram Protocol. Si tratta di un semplicissimo protocollo di trasporto che poco aggiunge
ai pacchetti IP.

ˆ Permette il trasferimento di semplici datagrammi (senza instaurare una connessione) all'interno dei pacchetti IP.

ˆ È un protocollo di tipo connectionless, come il sottostante IP.

ˆ Non si occupa del controllo di usso, della congestione, degli errori o della ristrasmissione dopo la ricezione
di un segmento errato.

ˆ UDP aggiunge ad IP solo il multiplexing delle porte, che permettono ai pacchetti IP di essere multiplati su più
applicazioni in ascolto.

64
ˆ Richiede meno traco di un protocollo con connessione (tipo TCP ) perché non c'è bisogno di un meccanismo
di instaurazione della connessione o di ritrasmissione.

ˆ In caso di congestione, i pacchetti persi non sono ritrasmessi.

ˆ Non ha numeri di sequenza, quindi può succedere che arrivino pacchetti duplicati o vengano consegnati fuori
sequenza.

La struttura del segmento UDP:


 32 bit 
Source Port (16 bit) Destination Port (16 bit)
UDP Lenght (16 bit) Checksum (16 bit)
Dati (facoltativi)
I campi del pacchetto sono:

ˆ Source port/Destination port (entrambi da 16 bit): indicano la porta a cui è connessa l'applicazione che
emette/riceve l'unità informativa. Il valore massimo è 232 − 1 = 65535. Le porte nel range 0 − 1023 sono le porte
 well-known . Le porte nel range 1024 − 49151 sono assegnate dall'organo di Internet  IANA, mentre le porte
49152 − 65535 sono di uso libero e assegnabili dinamicamente.

ˆ UDP length (16 bit): Lunghezza in byte dell'intero pacchetto UDP. Nel caso di pacchetto UDP vuoto (senza
dati) il minimo è 8, cioè 0000000000000100.
ˆ Checksum (16 bit): È un codice a controllo di errore opzionale. Se viene deciso di non utilizzarlo lo si imposta
tutto a 0. Non sussistono ambiguità perché il valore 0 non può essere mai utilizzato come codice di controllo.
tutto il messaggio UDP (dati compresi) e anche una parte dell'header del
Se utilizzato, serve per proteggere
5
datagramma IP precedente detto  pseudo-header  .

 Pseudo-header (caso IPv4):

 (32 bit) 
Source IP address (32 bit)
Destination IP address (32 bit)
00000000 Protocol ID (8 bit) UDP Length (16 bit)

 Pseudo-header (IPv6):

 (32 bit) 
Source IP address
(128 bit)

Destination IP address
(128 bit)

UDP Lenght (32 bit)


000000000000000000000000 Next header (8 bit)

 Il contenuto del campo di checksum UDP viene calcolato come complemento ad 1 (cioè un NOT) della
somma dei bit del segmento UDP e dello pseudo-header a blocchi di 16bit. Per questo motivo è necessario
aggiungere nello pseudo-header un byte di zeri (di modo da allinearlo a 16 bit).

 Procedura per il calcolo del checksum dal trasmettitore: Eseguiamo la somma in blocchi da 16 bit
dello pseudo-header, header UDP (con checksum impostato a 0) e i dati UDP. Se la lunghezza (in byte)
dei dati UDP (payload) è dispari, aggiungo un byte di zeri. In questo modo ho tutte parole da 16 bit. Una
volta ottenuta la somma, nego il risultato e lo imposto come valore di checksum. [immagine di esempio]

 Procedura per il calcolo del checksum dal ricevitore: Eseguiamo la somma in blocchi da 16 bit dello
pseudo-header, header UDP e i dati UDP. Se come risultato della somma (non negato) ottengo tutti  1
allora il checksum è corretto.

 Utilizzare il checksum da maggiore sicurezza che i dati ricevuti dal pacchetto UDP siano corretti, però
non ha molta utilità perché anche se trovo un errore non posso avvisare il mittente e farmi rimandare il
pacchetto. UDP non è pensato per questo e inoltre non potrei comunque farlo dato che non ha numeri di
sequenza sui pacchetti.

 In alcune applicazioni è meglio scartare il pacchetto piuttosto che leggere dati errati (ad esempio in qualche
tipo di trasferimento les tra hosts)

5 In realtà questo viola i principi di straticazione dei protocolli perché UDP non dovrebbe sapere nulla di IP..

65
 In altre applicazioni è meglio evitare di perdere tempo a calcolare il checksum e disinteressarsi se sono
presenti alcuni bit errati (ad esempio nella telefonia).

Caratteristiche di UDP
UDP è un protocollo semplice e comodo per applicazioni che richiedono di inviare dati brevi, che non hanno bisogno
di ritrasmissione o controllo di usso. Il servizio DNS ad esempio utilizza pacchetti UDP. Anche il servizio RTP fa
uso di pacchetti UDP.

Protocollo TCP
Il nome TCP sta per  Transmission Control Protocol , è il protocollo più utilizzato di Internet. È stato deni-
to inizalmente in RFC793, poi aggiornato in RFC1122 e RFC1323. È un protocollo progettato per avere diverse
caratteristiche:

ˆ Fornire un usso di byte adabile end-to-end, su un inter-network inadabile. Parliamo di  inter-network


e non di rete perché le diverse parti su cui transita TCP possono avere larghezze di banda, ritardi, dimensioni
dei pacchetti e altri parametri molto diversi tra loro. TCP è stato progettato per adattarsi dinatmicamente alle
proprietà della inter-network e continuare ad orire solide prestazioni in presenza di molti tipi di errore.

ˆ È un protocollo orientato alla connessione ( connection-oriented ).

ˆ Fornisce un servizio di trasporto adabile.

ˆ Permette multiplazione di più ussi mediante socket.

ˆ Permette la consegna in sequenza dei pacchetti.

ˆ Gestisce la perdita dei pacchetti, il controllo di usso e la congestione.

ˆ Tutte le connessioni TCP sono full-duplex (il traco può uire sulla stessa connessione in due direzioni, come
in UDP ) e punto-punto (perché ogni connessione ha esattamente due punti nali).

ˆ TCP non supporta multicasting o broadcasting.

ˆ Una connessione TCP è un usso di byte, non un usso di messaggi. Se il processo mittente fa ad esempio 4
scritture da 512 byte su un usso TCP, a destinazione i dati potrebbero essere ricevuti come 4 blocchi da 512
byte oppure 2 blocchi da 1024 byte oppure un solo blocco da 2048 byte.

ˆ Quando una applicazione passa dei dati a TCP, lui potrebbe decidere di tenerli temporaneamente in un buer
prima di inviarli.

Caratteristiche generali
ˆ L'adabilità nel trasporto si basa sulla numerazione byte per byte dei dati trasferiti nelle due dirazioni, invece
che per singola unità informativa.

ˆ Ogni byte in una connessione TCP ha il proprio numero di sequenza a 32 bit. Una volta con le linee a 54
Kbps ci voleva una settimana per esaurire i numeri di sequenza. Alle velocità attuali possono essere esauriti a
velocità preoccupanti.

ˆ TCP si basa su un meccanismo a nestra variabile. Vengono adottati solo riscontri positivi (ACK ). La
ritrasmissione dei segmenti mancanti si basa sulla scadenza di un timeout .

ˆ Le ritrasmissioni possono includere intervalli di byte diversi rispetto alla trasmissione originale.

ˆ Ogni segmento TCP, header compreso, non può superare la lunghezza di 65515 Byte (carico utile dal pacchetto
IP). In realtà ogni rete ha un MTU (Maximum Transfer Unit ) diversa a cui quindi TCP deve adattarsi. Ethernet
ad esempio ha M T U = 1500Byte (vedi paragrafo MTU in IP).

66
Struttura del segmento TCP
 (32 bit) 
Source port (16 bit) Destination port (16 bit)
Sequence number (32 bit)
Acknowledgement number (32 bit)
TCP Reserved N C E U A P R S F
HLEN (3 bit) S W C R C S S Y I Window Size (16 bit)
(4 bit) R E G K H T N N
Checksum (16 bit) Urgent pointer (16 bit)
Option + padding (0 o più parole da 32 bit)
Dati (facoltativi) (Nel caso migliore 65495 Byte)

ˆ Source port/Destination port (16 bit): Come per UDP, indica la porta a cui è connessa l'applicazione che
emette/riceve l'unità informativa.

ˆ Sequence number, SN (32 bit): Indica il numero d'ordine del primo byte dati dell'unità informativa all'interno
del usso inviato dalla sorgente. La numerazione dei byte della connessione è quindi modulo 232 .
ˆ Acknowledgement number, AN (32 bit): Indica alla destinazione il numero d'ordine del prossimo byte che
il processo si aspetta di ricevere. Quindi se AN è x, allora il processo sta riscontrando tutti i byte ricevuti no
a x−1 (in stile go-back-n )

ˆ TCP Header Lenght, HLEN (4 bit): Lunghezza dell'header in unità di 32 bit. Il valore minimo è 5. Il valore
massimo è 15.

ˆ Reserved
°
(6 bit): Campo riservato per scopi futuri. Alcuni utilizzano una funzionalità aggiuntiva ( ECN
- Explicit Congestion Notication , RFC3168) per il controllo di congestione, che fa uso del 6 bit di questo
campo. In ogni caso un destinatario che non supporta questa funzionalità può tranquillamente ignorare questo
bit.

ˆ Code bits (6 bit):

 URG urgent : Indica la presenza di dati urgenti nel payload, la cui posizione è indicata dal campo  urgent .
Permette di generare un evento che comunica a TCP di interrompere il buering dei dati e trasmettere
immediatamente tutto ciò che ha a disposizione nei dati urgenti. È un sistema di interrupt.

 ACK  acknowledgement : È impostato ad 1 per indicare che  acknowledgement number  è valido e deve
essere considerato.

 PSH  push : È impostato ad 1 per richiedere all'entità ricevente di consegnare all'entità di applicazione i
dati nel messaggio e di non archiviarli nel buer come farebbe per migliorare l'ecienza.

 RST  reset : Quando impostato da 1, indica la reimpostazione di una connessione (diventata incongurente
per qualche motivo). È anche utilizzato per riutare un segmento non valido o un tentativo di aprire una
connessione verso una porta chiusa.

 SYN syncronize: Quando impostato ad 1, viene utilizzato per instaurare una connessione e ha ruolo
diverso a seconda del valore del ag ACK:

* SYN=1, ACK=0 ⇒ CONNECTION REQUEST


* SYN=1, ACK=1 ⇒ CONNECTION ACCEPTED

 FIN  nal : Viene utilizzato per il rilascio di una connessione. Indica che chi lo manda non ha più nulla
da inviare, però questo mittente potrebbe potenzialmente continuare a ricevere dati. La chiusura della
connessione deve essere fatta da ambo i lati.

 Flags per ECN (Explicit Congestion Notication ), una recente funzionalità avanzata per segnalare la
congestione ai router invece di iniziare a scartare pacchetti:

* NS : ECN-nonce concealment protection (RFC 3540)


* CWR : Congestion Window Reduced, impostato dall'host che invia per indicare che ha ricevuto un
pacchetto con il ag ECE settato, e ha provveduto ad inuire l'algoritmo per il controllo di congestione
(added to header by RFC 3168).
* ECE : Sempre parte di ECN. Se il ag SYN è a 1, indica che il peer è ECN-capable. Se il SYN non
è settato, indica che è stato ricevuto un pacchetto con il ag Congestion Experienced nell'header IP
(RFC 3168).

ˆ Window size (16 bit): Indica quanti byte il mittente è disposto a ricevere. Solitamente corrisponde con la
quantità di spazio libera nel buer di ricezione, anche se non deve essere necessariamente così (vedi in seguito). Se
ACK = x e W SIZE = y signica che il mittente è disposto a ricevere i byte da x a x + y − 1. Se W SIZE = 0,
indica al destinatario di aspettare ad inviare nuovi dati. Successivamente mostrando W SIZE 6= 0 si
16
permette l'invio di nuovi dati. Il valore massimo della nestra è 2 − 1 = 65535Byte.

67
ˆ Checksum (16 bit): Consente la rilevazione di errori. Il calcolo del checksum viene eettuato con il complemento
ad 1 della somma di parole a 16 bit, così come già descritto nel protocollo UDP. Lo pseudo-header utilizzato è
sempre lo stesso mostrato per UDP.

 Pseudo-header (IPv4) :

 (32 bit) 
Source IP address (32 bit)
Destination IP address (32 bit)
00000000 Protocol ID (8 bit) TCP Length (16 bit)

 Pseudo-header (IPv6):

 (32 bit) 
Source IP address
(128 bit)

Destination IP address
(128 bit)

TCP Lenght (32 bit)


000000000000000000000000 Next header (8 bit)

ˆ Urgent pointer (16 bit): Indica l'oset in byte partendo dal numero di sequenza corrente in cui si trova l'ultimo
byte urgente. La posizione iniziale del primo dato urgento non è indicata, l'applicazione deve determinarsela
da sola. Per essere utilizzato questo campo, il ag PSH deve essere attivato. Questa funzionalità è spesso
utilizzata per recapitare dei byte prima di altri. Era utilizzato in passato ad esempio su telnet per inviare il
comando Ctrl+C.

ˆ Options : È un modo per aggiungere delle estensioni all'intestazione

ˆ Padding : Si garantisce che il TCP header sia multiplo di 32 bit.

 Il byte 00000001 serve come riempimento per avere un header multiplo di 32 bit (byte no-operation ).
 Il byte 00000000 serve come byte di riempimento nale (byte end-of-operation ).

Opzioni molto comuni di TCP


Maximum Segment Size (MSS)

È una opzione di TCP che permette ad ogni host di specicare il carico utile massimo che TCP potrà accettare. Ogni
host annuncia il proprio MSS e guarda quello del partner. Se non si utilizza questa opzione, si assume di default che il
carico utile sia pari a 536 Byte. Tutti gli host di Internet devono accettare segmenti TCP di 536+20 = 556Byte.
Il valore massimo è 65535 Byte.
Code Length MSS (16 bit)
00000010 00000100 .............................................................

Window scale

È una opzione di TCP (denita in RFC1323) che permette agli host di negoziare un fattore di scala per la dimensione
della nestra di ricezione. Su una linea T3 (44,736 Mbps) bastano 12 millisecondi per spedire una intera nestra di
3
dati da 64KB. Se il ritardo andata-ritorno (RTT) è 50 millisecondi, il mittente resta in attesa per
4 del tempo di una
risposta. Per evitare questa situazione di inecienza, viene allargata la nestra con questo fattore di scala. La nestra
vine aumentata di un fattore pari a 2 elevato al valore contenuto nel campo scale factor:
Code Length Scale factor (8 bit)
00000010 00000100 .............................................................

Selective repeat

In RFC2581 viene denita una opzione di TCP che permette ad un host di utilizzare un messaggio di riscontro negativo
 NACK per avvisare il mittente di rinviare solo un certo pacchetto, riducendo la quantità di dati trasmessi .
6

6 Nei sistemi GNU/Linux questa funzionalità viene abilitata agendo sul le /proc/sys/net/ipv4/tcp_sack

68
Setup delle connessioni,  Three-way handshake
ˆ Il server eettua una LISTEN (o anche detta  passive open ) per indicare a TCP che è pronto a ricevere
connessioni.

ˆ Il client eettua una CONNECT (o anche detta  active open ) per indicare a TCP la volontà di instaurare
una connessione con il server.

1. Il client sceglie a caso un numero di sequenza iniziale (ISN - Initial Sequence Number ) e invia un pacchetto con
il numero di sequenza scelto (SN = ISN ) e SY N = 1. Eventualmente comunica anche MSS, Window scale,...
nello stesso pacchetto. La scelta di un ISN casuale evita problemi nel dover distinguere due richieste dallo stesso
host (ad esempio nel caso in cui i pacchetti della richiesta arrivino in seguito alla chiusura e riapertura di una
connessione).

2. Il server riceve il SYN, estrae un altro ISN casuale e manda un segmento con SN = ISN , SY N = 1, ACK = 1
contenente come acknowledgement number il sequence number ricevuto dal client incrementato di una unità .
7
Se il server non fosse in ascolto su quella porta, risponderà invece con un pacchetto RST.

3. Il client riceve il SYN/ACK del server e invia un ACK = 1 con acknowledgement number pari al sequence
number inviato dal server incrementato di una unità. Inseriesce inoltre nel payload i primi byte di dati.

ˆ Se le due richieste di connessione dovessero arrivare nello stesso momento, il meccanismo funziona comunque.

ˆ Di seguito una gura con tutti gli stati e le transizioni:

7I messaggi SYN e FIN consumano convenzionalmente un byte

69
Gli stati del diagramma hanno i seguenti signicati:
Stato Descrizione
CLOSED Nessuna connessione è attiva o in sospeso
LISTEN Il server è in attesa di una chiamata in ingresso
SYN RCVD È arrivata una richiesta di connessione; attesa di ACK
SYN SENT L'applicazione ha iniziato ad aprire una connessione
ESTABLISHED Il normale stato di trasferimento dei dati
FIN WAIT 1 L'applicazione aerma di avere terminato
FIN WAIT 2 L'altro lato accetta il rilascio
TIMED WAIT Attende la scadenza di tutti i pacchetti
CLOSING Entrambi i lati hanno cercato di chiudere contemporaneamente
CLOSE WAIT L'altro lato ha iniziato il rilascio
LAST ACK Attende la scadenza di tutti i pacchetti

Generazione degli ISN (Initial Sequence Numer)

ˆ Ogni host possiede un contatore che conta ciclicamente in modulo 232 con passi di 4µs (ciclo completo in 4,77
ore)

ˆ Al momento dell'instaurazione della connessione viene scelto l'ISN attuale.

70
ˆ In realtà ci sono problemi di sicurezza poiché un eventuale attaccante potrebbe identicare i numeri di sequenza
e sfruttarli per inserirsi in connessioni esistenti. L'implementazione reale della generazione degli ISN dipende dal
sistema operativo, ma non è (solitamente) come quella qui descritta teoricamente. I problemi di sicurezza legati
alla scelta dell'ISN sono trattati nella RFC1948.

Gestione della connessione

ˆ I numeri di sequenza in transito devono essere univoci, perché ogni byte di una connessione di rete deve essere
univoco. Vogliamo evitare ambiguità di due byte con dati diversi e stesso sequence number.

ˆ Per evitare ambiguità si ssa un tempo di vita massimo dei pacchetti che varia a seconda di quanto velocemente
consumo i sequence number, cioè in base alla velocità della connessione.

ˆ Stabiliamo quindi che il Maximum Segment Life (MSL) sia

232 · 8
M SL <
B
 bit 
dove B è la capacità della connessione espressa in
s . Cioè il MSL deve essere minore dell'intervallo massimo
tra due sequence number uguali .
8

ˆ Normalmente si stabilisce di default M SL = 2min = 120s , che se abbiamo una connessione a 10M bps è un valore
accettabile (se B = 10M bps 100M bps abbiamo 5
l'intervallo tra due sequence number uguali è circa 1 ora), se
minuti tra due sequence number uguali.

ˆ Per tenere traccia della scadenza di un pacchetto nel caso di reti molto veloci (ad esempio in una rete 10 Gbit/s i
numeri di sequenza si esauriscono in 3, 43 secondi) si utilizza l'opzione timestamp di TCP (vedi RFC1323)
che pur utilizzando anch'essa un contatore a 32 bit, lo incrementa con passo più ampio .
9

Rilascio della connessione TCP ( Tear down) :


ˆ Per rilasciare una connessione sono richiesti 4 segmenti (FIN e ACK da entrambi i lati). In realtà è possibile
inserire il primo ACK e il secondo FIN nello stesso segmento riducendo il totale a 3.

ˆ L'invio di una trama FIN da parte di un host signica non ho più nulla da inviarti, comunque continuo ad
ascoltarti, il destinario deve rispondere con ok, confermo e poi con anche io smetto di inviare, ma comunque
resto in ascolto, quendi il mittente conferma ok e la connessione è stata chiusa. Se uno di questi ACK viene
perso, la connessione è chiusa per timeout.

Criterio di trasmissione/ricezione di TCP


ˆ Segmenti ricevuti correttamente, anche se fuori sequenza, sono accettati e immagazzinati nel buer, perchè
all'interno della nestra di ricezione (come nei protocolli selective-repeat classici)

ˆ I riscontri inviati sono solo positivi (ACK ) e sono di tipo cumulativo (come nei protocolli go-back-n )

ˆ I segmenti ricevuti correttamente vengono riscontrati singolarmente o con la tecnica del  Delayed ACK , cioè
ogni due segmenti e comunque entro un certo intervallo di tempo.

ˆ La tecnica di piggybacking viene utilizzata.

Una precisazione In realtà nella implementazione base di TCP,  TCP Tahoe , si prevede che i segmenti fuori
sequenza siano scartati (come nei protocolli go-back-n ), mentre nella implementazione più avanzata di TCP,  TCP
Reno , si prevede che i segmenti fuori sequenza (ma all'interno della nestra di ricezione) siano accettati e memorizzati.

Controllo di usso in TCP - Silly Window Syndrome


Il controllo di usso consiste nel problema di una sorgente molto veloce che manda dati rapidamente ad una sorgente
lenta, che fatica quindi a rispondere.
In particolare vediamo un problema specico del controllo di usso che genera insucienza del protocollo se non
viene gestito correttamente.

8 Si noti che questo calcolo non è del tutto corretto, perché si trascura la presenza dell'header IP. Resta quindi un caso pessimo limite.
9 Nel sistema operativo GNU/Linux l'opzione timestamp è abilitata di default su tutti i pacchetti TCP in uscita mediante il procle
/proc/sys/net/ipv4/tcp_timestamps che, nonostante il nome, gestisce le opzioni timestamp di TCP sia su IPv4 che su IPv6. L'opzione
timestamp di TCP è ormai adottata come una delle opzioni standard

71
Lato ricevitore (algoritmo di Clark)

Svuoto letamente il buer di ricezione (che è già pieno), appena libero un posto mando un ACK alla sorgente, che mi
manda subito un nuovo pacchetto e il buer è nuovamente pieno e devo avvertire la sorgente di aspettare ad inviare
altro (inviandole una dimensione della nestra nulla). In questo modo c'è alto overhead, segmenti corti, pessima
ecienza del protocollo. La soluzione nel ricevitore consiste nell'utilizzare l'algoritmo di Clark.
Utilizzando questo algoritmo, il ricevitore mente al trasmettitore, indicando una nestra nulla no a quando il
suo buer in ricezione non si è svuotato per metà o per una porzione almeno pari a MSS. Cioè indico W SIZE = 0
no a quando
 
Buer size
Busy buer size 6= min , M SS
2
Inoltre il mittente può essere d'aiuto se evita di inviare segmenti di piccole dimensioni.

Lato trasmettitore (algoritmo di Nagle)

Il problema complementare si può presentare sul lato del trasmettitore. È questo il caso di un trasmettitore che
genera pochi dati molto lentamente e il buer d'invio è quasi sempre vuoto. Invio segmenti molto piccoli man mano
che vengono prodotti, c'è alto overhead e inecienza del protocollo. La soluzione adottata è chiamato algoritmo di
Nagle.
Questo algoritmo consiste nell'invio della prima porzione di dati, anche se corta, e in una successiva attesa. Se ricevo
l'ACK, allora invio un altro segmento, altrimenti aspetto che il buer di uscita si riempia di almeno una dimensione
pari ad un MSS e quindi invio il pacchetto.

La gestione dei timer e dei timeout di TCP


ˆ TCP utilizza vari timer, il più importante è il timer di ritrasmissione : quando viene inviato un segmento
si avvia un timer di ritrasmissione, quando scade si rimanda il pacchetto, ma quanto deve essere lungo questo
intervallo di tempo?

ˆ Il problema qui non è come nei protocolli datalink in cui il tempo massimo di andata e ritorno massimo è ssato
(ad esempio 2τ ). In Internet ogni rete ha un diverso tempo di transito ed è necessario adattarsi a ciascuna
connessione.

ˆ La soluzione è adottare un algoritmo altamente dinamico che regola costantemente l'intervallo di timeout in base
a continue misurazioni delle prestazioni di rete.

Algoritmo di Jacobson (1988)

ˆ Per ogni connessione, TCP tiene una variabile, RTT (Round Trip Time), che rappresenta la migliore stima
attuale del tempo di andata e ritorno per la destinazione in questione.

ˆ Quando si avvia un segmento parte anche un timer che serve a due scopi:

 Per misurare quanto tempo richiede l'acknowledgement


 Per innescare un'eventuale ristrasmissione

ˆ Se l'acknowledgement torna indietro prima della scadenza del timer, TCP misura il tempo trascorso M.
ˆ RT T viene dunque aggiornato con un ltro a media mobile :

RT T = α · RT T + (1 − α) · M

con 0 < α ≤ 1, dove α è un fattore che determina il peso dato al vecchio valore rispetto a quello nuovo.
Solitamente α = 87 .
ˆ Ora anche conoscendo un RT T valido, la scelta di un timeout di ritrasmissione adatto è una questione complessa.

ˆ Una volta veniva utilizzato T imeout = β · RT T con β = 2, poi ci si è accorti che un valore costante non era
adatto.

ˆ Jacobson ha proposto di rendere β proporzionale alla deviazione standard della funzione densità di probabilità
del tempo di arrivo di un acknowledgement. In paritcolare Jacobson ha suggerito di utilizzare la deviazione
media D come stima approssimata della deviazione standard.

72
ˆ Alla ricezione di un acknowledgement è elaborata la dierenza tra il valore previsto e il valore osservato e viene
aggiornata la deviazione media in questo modo:

D = β · D + (1 − β) · |RT T − M |

con 0<β≤1 e solitamente β=α 10 oppure β= 1 11


4

ˆ Questo calcolo può essere eettuato in un calcolatore con poche istruzioni elementari.

ˆ I valori iniziali sono solitamente M =0 e RT T = 1, 5


ˆ Solitamente è impostato anche un valore massimo che
12 .
RT T può raggiungere. Nei sistemi GNU/Linux è 120
secondi

ˆ La maggior parte delle implementazioni di TCP utilizza l'algoritmo di Jacobson e impostano il timeout a:

T imeout = RT T + n · D

dove solitamente n=4 .

ˆ Si utilizza per vari motivi 4. Sia perché si implementa con un solo shift nei registri, sia perchè meno dell'1% dei
pacchetti giunge in un tempo superariore a 4 volte la deviazione standard.

ˆ Spesso, ma non obbligatoriamente, in alcune implementazioni di TCP se arriva un pacchetto ICMP  source
squence , viene trattato dall'algoritmo in modo molto simile ad un Timeout.

Algoritmo di Karn

Un problema che si verica nella stima dinamica di RTT è la scelta delle azioni da compiere quando un segmento
subisce un timeout e viene inviato nuovamente. Quando giunge l'acknowledgement, non è chiaro se fa riferimento alla
prima trasmissione o alla successiva. Un errore di valutazione potrebbe seriamente contaminare la stima di RTT.
Phil Karn, un radioamatore, ha scoperto questo problema nel modo peggiore. È un radioamatore interessato alla
trasmissione di pacchetti TCP/IP su ham radio, un mezzo molto inadabile (metà dei pacchetti vengono persi).
La proposta fatta da Karn è molto semplice: evitare di aggiornare RTT per ogni segmento ritrasmesso.
Al contrario, il Timeout viene raddoppiato a ogni errore no a quando non arriva l'acknowledgement di un
segmento.
Questo signica che ogni volta che scatta il timeout si eettua l'operazione:

T imeout = T imeout · 2

Timer di persistenza

Viene utilizzato per evitare una particolare situazione di deadlock: se il destinatario risponde al mittente avvertendolo
che la sua nestra è larga 0, il mittente smette di trasmettere. Quando il destinatario è pronto a ricevere, avverte il
mittente che la nestra è cambiata. Se questo pacchetto di avviso viene però perso, il mittente aspetterà all'innito.
Per questo motivo il mittente, ogni volta che scade il timer di persistenza, chiede al destinatario qual'è la situazione
della nestra. Questo timer viene utilizzato solo nel caso di nestra larga 0 ovviamente.

Timer keepalive

In alcune implementazioni viene utilizzato un timer di keep-alive che invia dei pacchetti su delle connessioni aperte
da molto tempo, per controllare che il destinatario sia ancora in ascolto
13 . Alcuni considerano questa funzionalità è
un po' controversa perché potrebbe rischiare di far cadere una connessione stabilita solo per un problema temporaneo
sulla rete.
Questa funzionalità può essere utile per mantenere attiva una connessione con un host dietro un NAPT. I NAPT
infatti solitamente chiudono le connessioni prive di attività dopo un po' di tempo per evitare di occupare porte.

10 Secondo A.Tanenbaum in Reti di calcolatori


11 Secondo altre fonti
12 In un commento scherzoso all'interno dei sorgenti del kernel Linux, qualcuno scrive che questa limitazione sull'RTT massimo non potrà
permettere la comunicazione con TCP verso una ipotetica università su Marte, dato che l'RTT minimo verso marte è circa 900 secondi...
13 Nei sistemi GNU/Linux è possibile abilitare questa funzionalità passando uno specico parametro con setsocketopt (SO_KEEPALIVE )
durante l'inizializzazione di un socket TCP. I valori relativi alle tempistiche per questo timer sono regolati tramite i les:
/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_probes
/proc/sys/net/ipv4/tcp_keepalive_intvl
Per altre informazioni consultare http://tldp.org/HOWTO/html_single/TCP-Keepalive-HOWTO/

73
Timeout di TIMED_WAIT

Anche dopo la chiusura di una connessione TCP con uno scambio completo di FIN/ACK da entrambi i lati, la
connessione resta in stato di TIMED_WAIT per un tempo pari dal doppio del tempo di vita del pacchetto (MSL)
per garantire che alla chiusura di una connessione tutti i pacchetti correlati siano stati rimossi.

Fast retransmit e Fast recovery


Se il mittente vede tornare dal destinatario 3 ACK consecutivi con lo stesso acknowledge number, suppone che un
pacchetto inviato sia stato perso. In particolare se AN = x si suppone che il pacchetto inviato con SN = x sia stato
perso. Molto spesso è così, quindi questo metodo evita di dover aspettare il timeout del pacchetto x per ritrasmettere,
guadagnando un po' di tempo. Viene ritrasmesso solo il pacchetto mancante, non si rinizia a trasmettere tutto.
Comunque non è detto che sia così. Ad esempio il pacchetto perso potrebbe aver semplicemente seguito una
strada diversa dei precedenti, tuttavia questo caso è molto raro. Questa funzionalità evita di dover aspettare un
intero intervallo di timeout, che alle volte può essere costoso un ordine di grandezza in più (in termini di tempo). Per
utilizzare questo metodo è necessario disabilitare la funzionalità di  Delayed ACK per la ricezione di segmenti fuori
sequenza.
Questa funzionalità non è implementata in TCP Tahoe ma è presente in più recenti implementazioni come ad
esempio TCP Reno.

Controllo della congestione


ˆ Agli strati inferiori (IP, datalink) il controllo di congestione non è implementato. Deve occuparsene TCP.

ˆ Essendo TCP implementato solo negli host nali, sono loro a doversi occupare del controllo di congestione.

ˆ La vera soluzione alle congestioni è la diminuzione della velocità dei dati.

ˆ L'idea è impedire l'inserimento di un pacchetto nella rete no a quando uno vecchio non la lascia (cioè viene
consegnato). Una sorta di legge di conservazione dei pacchetti.

ˆ TCP raggiunge questo scopo manipolando in modo dinamico la dimensione della nestra di ricezione che
comunica all'altro interlocutore.

ˆ Oggi la perdita di un pacchetto (a parte le reti wi che sono un caso particolare) è praticamente sempre dovuta
a congestioni. Gli errori di trasmissione sono abbastanza rari.

ˆ Quando si instaura una connessione viene scelta una dimensione della nestra adatta alle due parti e gli host
iniziano a comunicare. Il problema è che questa nestra potrebbe non essere adatta per la rete sottostante. I
due host devono rendersene conto ascoltando i timeout che scattano.

ˆ Ogni mittente tiene traccia di due nestre: quella che il ricevente gli ha garantito (RWND - Recive Window ) e
una nestra di congestione (CWND - Congestion Window ).

ˆ Il numero di byte che è possibile trasmettere corrisponde alla più piccola delle due nestre
14 :

WS = min (RW N D, CW N D)

ˆ NB: Nelle prossime formule, per le nestre utilizzeremo come unità la M SS

Avvio lento - Slow start

ˆ Inizialmente il mittente pone la nestra di congestione alla dimensione del segmento massimo usato sulla connes-
sione (MSS ), poi invia un segmento massimo (CW N D = 1, cioè in realtà 1 MSS). (In alcune implementazioni
più recenti di TCP si parte con un CW N D = 4)
ˆ Se il segmento riceve ACK prima della scadenza del timeout, aggiunge alla nestra di congestione un numero
pari alla dimensione del segmento appena riscontrato, di modo che la nestra di congestione raddoppia. Quin-
diCW N D raddoppia e mando due segmenti di lunghezza MSS. (Questo accade solo quando CW N D <
SST HRESH come spieghermo tra breve). Abbiamo quindi che, per ogni segmento riscontrato la CW N D viene
incrementata di 1

ˆ Possiamo scriverlo in modo più formale (non sono le formule così come appaiono nelle implementazioni) come:

CW N Di+1 = CW N Di + ACKi
14 Su alcuni testi e programmi la WS viene solitamente chiamata SN DW N D

74
ˆ Nel caso in cui abbiamo 1 ACK per ogni pacchetto inviato avremo:

CW N Di+1 = CW N Di + CW N Di

ˆ Nel caso in cui abbiamo 1 ACK ogni 2 pacchetti:

1
CW N Di+1 = CW N Di + · CW N Di
2

ˆ Quindi in generale:
 
1
CW N Di+1 = 1+ · CW N Di = r · CW N Di
b
1

 Dove b=1 signica 1 ACK ogni pacchetto, b=2 signica 1 ACK ogni 2 pacchetti. Inoltre 1+ b =r per
semplicità di scrittura

ˆ Possiamo poi ricavare CW N Di con un semplice ragionamento deduttivo:

CW N D1 = nestra iniziale

CW N D2 = r · CW N D1
CW N D3 = r · r · CW N D1
CW N D4 = r · r · r · CW N D1
...
CW N Di = ri−1 · CW N D1

 Dove CW N D1 è la nestra di congestione iniziale. Dipende dall'implementazione.

ˆ Nonostante sia una somma, la CW N D aumenta in modo esponenziale, perché i pacchetti che la vanno ad
incrementare aumentano sempre di più.

ˆ Il nome  slow start  trae un po' in inganno, infatti la crescita della


15
CW N D è tutt'altro che lenta, è esponen-
ziale!

ˆ Volendo, possiamo calcolare il numero di segmenti dati scambiati no al passo i-esimo dello slow start:

i
X ri − 1
datai = rk−1 · CW N D1 = · CW N D1
r−1
k=1

ˆ Se invece, data la quantità di segmenti scambiati data, vogliamo sapere a che iterazione dello slow start siamo
arrivati:  
(r − 1) · data
i = logr +1
CW N D1

ˆ Se vogliamo lavorare con la quantità di dati d espressa in bits possiamo sostituire sapendo che

d
data =
M SS
 E quindi
 
(r − 1) · d
i = logr +1
M SS · CW N D1

ˆ Possiamo anche calcolare il tempo totale necessario per trasferire d dati restando all'interno dello slow start e
tenendo conto anche del tempo necessario per l'handshake e l'ACK nale:

ttot = i · RT T + RT T + tACK
15 In realtà l'incremento della CW N D potrebbe essere più lento nel caso in cui il ricevitore decida di adottare la tecnica del Delayed
ACK (vedi i paragra precedenti).

75
Congestion avoidance

ˆ Quando l'apertura della congestion window supera la soglia SST HRESH (cioè quando CW N D ≥ SST HRESH ),
si entra nella regione di  congestion avoidance , dove la crescita della congestion window diventa lineare:
CW N D aumenta linearmente di un MSS per ogni intervallo di tempo RTT, indipendentemente dai pacchetti
riscontrati. Si eettua cioè ancora
CW N D = CW N D + 1
ma solo ogni intervallo di tempo RTT, non per ogni riscontro.

ˆ Inizialmente SST HRESH = 64KB = 65535 . Questa soglia iniziale viene decisa dal sistema operativo. Può
essere maggiore se si fa uso dell'opzione window scale.

ˆ Per ovvi motivi SST HRESH ≥ 2

Timeout

ˆ Nel caso in cui invece scatta un timeout oppure 3 ACK duplicati :

 Se si sta utilizzando l'implementazione classica TCP Tahoe : La nuova soglia diventa


 
WS
SST HRESH = max 2,
2
e CW N D = 1 (a meno di trattative iniziali sul numero minimo di CW N D). WS possiamo vederlo come il
numero di pacchetti in giro. TCP Tahoe non ha la funzionalità di Fast Retransmit, quindi non gestisce il
caso dei 3 ACK duplicati.

 Se si sta utilizzando l'implementazione avanzata TCP Reno : La nuova soglia diventa


 
CW N D
SST HRESH = max 2,
2
se c'è stato eettivamente un timeout allora CW N D = 1, se ci sono stati 3 ACK duplicati invece
CW N D = SST HRESH
ˆ Ovviamente CWND cresce no a raggiungere la dimensione della nestra del ricevente, a quel punto smetterà
di crescere.

ˆ Insieme alla nestra, aumenta anche il rate di trasmissione stimato come


 
CW N D · M SS bit
R =
RT T s
(ricordiamo che CWND è misurato in unità di MSS)

ˆ Ovviamente se non ho M SS dati da mandare: aspetto di averne, altrimenti mi tocca mandarne meno.

Esempio

76
Rivelazione d'errore
Ci sono diversi tipi di errore all'interno di una comunicazione TCP:

ˆ Segmenti corrotti : sono dei segmenti per i quali il checksum risulta errato. Il checksum TCP sono abbastanza
deboli, ma si continua ad utilizzarli comunque.

ˆ Segmenti persi : sono i segmenti che ci accorgiamo di aver perso osservando gli acknowledgment.

ˆ Segmenti duplicati : sono i segmenti che arrivano doppi

ˆ Segmenti fuori sequenza : sono segmenti recapitati correttamente ma arrivati prima di altri che mi stavo
aspettando di ricevere.

Correzione d'errore
ˆ Ritrasmissione dei segmenti corrotti o persi.

ˆ Scarto dei segmenti duplicati.

ˆ Riordino dei segmenti fuori sequenza.

Modello per connessioni TCP Long Lived (approfondimento)

ˆ Ammettiamo di avere una connessione attiva da molto tempo, che è quindi sempre in fase di congestion avoidance.

 Non consideriamo l'eetto dei timeouts per perdita di pacchetti.


 Assumiamo che tutte le perdite di pacchetti vengano identicate con 3 ACK duplicati.
 Assumiamo l'RTT costante.
1
 Probabilità di perdere pacchetti sulla linea pari a p. Quindi ogni
p pacchetti trasmessi ne perdiamo 1.
 Quando c'è una perdita di pacchetto, la CWND è pari a W.

ˆ Osserviamo il disegno sopra riportato e ricordiamoci che il numero di segmenti trasmesso in un ciclo è pari
all'area sottesa, quindi:
3W 2
8
ˆ Considerando l'assunzione sulla probabilità di perdita abbiamo:

1 3
= · W2
p 8

ˆ Otteniamo quindi che il throughput eettivo della connessione è:

dati trasmessi in un ciclo M SS C


Goodput = = ·√
tempo di 1 ciclo RT T p
q q
3 3
 Dove C= 2 in condizioni normali, mentre C= 4 se utilizziamo la tecnica del delayed ack.

77
TCP e UDP su reti wireless (approfondimento )
ˆ In base alla gerarchia ISO/OSI o Internet, UDP e TCP non dovrebbero preoccuparsi del fatto che ip sia in
esecuzione su bra ottica oppure su onde radio. Nella realtà però l'informazione è importante perchè TCP so-
pratutto, nella maggior parte delle sue implementazioni, è stato fortemente ottimizzato sulla base di supposizioni
vere per le reti cablate ma non per quelle wireless.

ˆ Il problema principale è il controllo di congestione: quasi tutte le implementazioni di TCP suppongono che
i timeout siano provocati dalla congestione, non da pacchetti realmente persi.

ˆ Sfortunatamente i collegamenti wireless sono altamente inadabili, perdono pacchetti in continuazione.

ˆ Quando viene perso un pacchetto su una rete cablata il mittente dovrebbe rallentare, quando invece viene perso
un pacchetto su una rete wireless il mittente dovrebbe ritentare con determinazione. Se il mittente non sa su
che rete sta lavorando, prendere la decisione è dicile.

ˆ Spesso il percorso è eterogeneo: una rete cablata seguita da una rete wireless.

ˆ Una delle soluzioni è modicare il codice dello strato network nella stazione wireless base. Una delle modiche
è l'aggiunta di un agente di snooping (agente di indagine) che osserva e archivia nella cache i segmenti TCP
in uscita dall'host mobile e gli acknowledgement provenienti da esso.

ˆ Quando l'agente di snooping vede passare un segmento diretto all'host mobile, ma non vede tornare l'acknowl-
edgment, ritrasmette il pacchetto all'host mobile senza avvertire l'origine.

ˆ Anche nel caso in cui l'agente di snooping vede acknowledgement duplicati provenienti dall'host mobile, capisce
che si è perso qualcosa.

ˆ L'agente di snooping intercetta eventuali acknowledgement duplicati provenienti dall'host mobile e non li manda
alla sorgente, per evitare che essa pensi ad una congestione nella rete.

ˆ Quando l'agente di snooping osserva una lacuna nei numeri di sequenza genera un richiesta di ripetizione selettiva
dei byte mancanti.

Algoritmi e protocolli di instradamento


Requisiti degli algoritmi di instradamento
ˆ Semplicità - KISS (Keep It Simple Stupid!)
ˆ Robustezza : più guasti ci sono, più intervento umano è necessario, meno la rete è scalabile.

ˆ Stabilità : l'instradamento deve essere il più possibile coerente con la forma originale al passare del tempo.

ˆ Ottimalità : riuscire a sfruttare meno collegamenti possibili e prediligere collegamenti veloci ad altri lenti.

Pacchetti da instradare
ˆ I pacchetti utente in un circuito virtuale seguono lo stesso percorso, è solo necessario instradare la segnalazione
iniziale

ˆ I pacchetti utente di una rete a datagramma devono essere instradati ciascuno indipendentemente

Decisione dell'instradamento
Algoritmi centralizzati

Un nodo prende le decisioni e le invia a tutti gli altri nodi per farlo sapere.

Algoritmi distribuiti

Tutti i nodi della rete si scambiano delle informazioni e collaborano per raggiungere la soluzione ottima da qualche
punto di vista

Algoritmi isolati

Ogni nodo prende le decisioni in modo autonomo e indipendente dagli altri

78
Tipi di algoritmi di instradamento16
ˆ Algoritmi di instradamento senza tabella (non c'è nessuna tabella sui nodi che eettuano il routing):

 Random: Detto anche  hot potato , invio il pacchetto al primo posto che capita. È utilizzabile per reti
molto piccole e semplici. Solitamente la scelta è casuale ma non uniforme sui collegamenti uscenti da
un nodo. Un collegamento con capacità maggiore ha più probabilità di essere scelto. La probabilità di
Ci
selezionare un generico link i è data da: pi = H
P
Cj

* Selective random
j=1

: Una piccola variante nella quale si tiene una tabella solo per i nodi adiacenti.
Se il pacchetto è diretto ad un nodo adiacente lo inoltro direttamente, altrimenti utilizzo la modalità
random.

 Flooding: Invio il pacchetto su tutte le interfacce eccetto quella su cui l'ho ricevuto. Rischio di generare
 tempeste  e sfrutto male le risorse che ho. Questa tecnica implica una moltiplicazione del traco uscente
dal nodo, rispetto a quello entrante. Come vantaggio di sicuro raggiungo la destinazione. È una tecnica
ineciente che può essere utile in alcuni contesti particolari: vedi ad esempio reti militari dove un nodo
intermedio può saltare per aria da un momento all'altro.

* Controllo del traco interno : Al ne di evitare pacchetti che circolano all'interno della rete al-
l'innito, solitamente ogni pacchetto che sfrutta questa tecnica di instradamento deve essere dotato di
un contatore che indica il numero di  hop  (salti, nodi intermedi) che può ancora attraversare. Ogni
nodo che riceve il pacchetto decrementa questo valore. Al primo invio del pacchetto bisogna quindi
assicurarsi che il valore iniziale di questo contatore sia pari al diametro dell'intera rete.

* Selective ooding : È possibile migliorare l'ecienza di questo algoritmo, ad esempio tenendo una
tabella che permette di capire su quale gruppo di collegamenti ha senso inviare dati. Facendo questo
perdiamo però i principali vantaggi di assoluta robustezza del ooding puro.

 Source routing: La scelta del percorso viene fatta dalla sorgente del pacchetto scrivendola all'interno
del pacchetto. I nodi intermedi non devono processare niente. La sorgente deve avere una mappa sempre
costantemente aggiornata della rete e deve inviare pacchetti molto grandi. Per scegliere il percorso, il nodo
sorgente può utilizzare algoritmi di routing centralizzati (un path server) o isolati (con path discovery ).
* Path server : Il nodo sorgente consulta un server esterno per sapere quale percorso seguire. Questo
metodo ha bassa adabilità, se ci sono guasti al path server non funziona più nulla.

* Path discovery : Il nodo sorgente invia in ooding un pacchetto alla destinazione; ogni nodo su cui
transita il pacchetto aggiunge un proprio identicatore. Quando il pacchetto arriva a destinazione, la
destinazione risponde alla sorgente (ripercorrendo al contrario il percorso) e comunicando la strada che
ha seguito il pacchetto per riuscire ad arrivare. La sorgente riceverà varie risposte e si preoccuperà di
scegliere quella con percorso minore.

* In ogni caso con un algoritmo source routing dobbiamo decidere se mantenere un instradamento statico
o dinamico. Nel caso in cui scegliamo di renderlo dinamico, la frequenza di interrogazione del path
server o dell'utilizzo del path discovery diventano un parametro critico del sistema.

ˆ Algoritmi di instradamento con tabella:

 Fisso: quando si seguono procedure di modica lente e spesso manuali. In reti con instradamento sso
il servizio a datagramma degenera in quello a circuito virtuale, dato che i pacchetti seguono praticamente
sempre lo stesso percorso (a meno di rare modiche manuali sulle tabelle di instradamento). Si tratta di
un algoritmo poco essibile e sensibile ai guasti.

 Dinamico: consentono di ottimizzare continuamente l'utilizzo delle risorse, facendo continue considerazioni
sulle condizioni operative. I due principali motivi che causano la variazione delle condizioni operative sono:
variazione del traco oerto alla rete e gli eventi di guasto. L'algoritmo di routing dinamico deve
evitare un sovraccarico dei nodi della rete (con conseguente riempimento dei buer ed aumento dei ritardi
o perdita dei pacchetti) e deve reagire ai guasti modicano la topologia di rete. L'algoritmo deve quindi
aggiornare con adeguata periodicità i percorsi e quindi le tabelle di instradamento. I due algoritmi di
instradamento dinamico più utilizzati a livello di reti regionali sono:

* Distance vector
* Link state
ˆ Algoritmi di instradamento gerarchici: È la strategia che si usa di fronte ad una rete molto grande, suddivissa
in regioni con amministrazioni diverse tra loro. Le decisioni di instradamento vengono prese sulle informazioni
complete relative ad una singola regione, mentre per quanto riguarda il resto della rete, le informazioni vengono
prese su delle informazioni riassunte o semplicate.

In Internet si utilizzano instradamenti di tipo gerarchico sso o dinamico.


16 Nel seguito potrebbe apparire a volte la parola intradamento o la sua traduzione inglese routing

79
Metriche
Per ogni coppia sorgente-destinazione si seleziona solitamente la via a costo minimo per raggiungere la destinazione,
cioè quella che impiega il minor numero di risorse. Il costo del percorso può però essere denito a seconda di varie
metriche:

ˆ Il numero di salti, cioè il numero di nodi che bisogna attraversare lungo il percorso.

ˆ Il traco smaltito lungo la via.

ˆ Il livello di riempimento dei buer dei nodi attraversati.

ˆ Il ritardo totale di trasferimento sorgente-destinazione.

Nella prima metrica il costo di ciascun ramo è naturalmente unitario, mentre nelle altre metriche il costo di un
collegamento varia a seconda della direzione in cui lo si percorre.

Algoritmo distance vector


Nell'algoritmo di tipo distance vector, ogni nodo dispone di una tabella (la tabella di instradamento ), che mantiene
continuamente aggiornata. Questa tabella specica per ogni destinazione la distanza (attualmente) stimata e il  next-
hop , cioè il prossimo nodo da contattare. In questo caso consideriamo il termine distanza come sinonimo di costo.
Si noti che per questo algoritmo è possibile scegliere una metrica qualunque tra quelle prima citate.
La struttura della tabella è quindi fatta in questo modo
17 :
Destination Distance Next-hop
A 1 G
B 0 -
C 3 F
D ∞
... ... ...

ˆ Ogni nodo comunica periodicamente il  vettore delle distanze  (distance vector ) a tutti i nodi adiacenti ad esso.
Il  vettore delle distanze  è una tabella come quella sopra rappresentata, ma privata del campo next-hop.

ˆ Ogni nodo conosce la distanza che lo separa da ognuno dei nodi adiacenti e riceve il vettore delle distanze dai
nodi adiacenti, che provvede ad aggiornare sommando le distanze per raggiungerli. La tabella viene aggiornata
con nuovi dati solo se le nuove distanze per certe destinazioni sono inferiori a quelle precedenti.

ˆ Se la nuova distanza ricevuta non è minore di quella precedente, ma arriva dal nodo utilizzato come next-hop
per quella destinazione, la riga nella tabella viene comunque aggiornata.

ˆ Se si ottiene una nuova stima di distanza verso un'altro next-hop uguale a quella attualmente in tabella, si
aggiorna comunque la voce, in quanto si preferiscono sempre stime più recenti nell'instradamento dinamico.

ˆ I nodi di cui non si conosce la distanza vengono marcati come a distanza innita nella tabella.

Algoritmo di Bellman-Ford

È l'algoritmo alla base dell'instradamento distance vector, che viene utilizzato da un generico nodo s per calcolare
l'albero dei cammini minimi verso tutte le destinazioni come informalmente descritto prima.

ˆD h
j : Costo della via a costo minimo dal nodo sorgente s al nodo j con un numero massimo di h salti.

ˆd ij : Costo del collegamento diretto tra i e j ; dij = ∞ se i due nodi non sono connessi direttamente.

1. h=0
2. Djh = ∞ ∀j 6= s
3. h=h+1
Djh = mini Dih−1 + dij , Djh−1

4.

5. if Djh = Djh−1 ∀j 6= s
(a) hmax = h − 1
6. else

(a) goto 3

7. stop
17 In questo esempio assumiamo il nodo B collegato direttamente al nostro nodo, quindi non c'è next-hop. La distanza non è però detto
che sia 0 per tutti i nodi direttamente collegati, dipende dalla metrica scelta.

80
Count to innity

In generale l'algoritmo distance vector registra con ecienza l'inserimento di nuovi nodi nella topologia di rete, mente
in alcuni casi la rimozione di nodi può dare luogo a problemi. L'esempio classico è quello di una rete lineare: una
catena di nodi collegati uno dopo l'altro in successione. Se l'ultimo della catena si spegne la notizia impiega tanti
cicli di avviso quanti sono i nodi della rete per propagare il messaggio, questo è legato al fatto che il nodo adiacente a
quello spento, pensa di poterlo raggiungere tramite quello successivo, senza sapere che il percorso scelto lo attraversa.
Il costo per contattare il nodo spento aumenta sempre di più no a quanto raggiunge il valore massimo rappre-
sentabile. Questa situazione va sotto il nome di  count to innity  dato che risulta evidente il crescere continuo delle
distanze stimate dei nodi della rete verso il nodo non più raggiungibile.

Split horizon

È la tecnica che permette di fronteggiare l'evento di count to innity. Sostanzialmente l'idea è di impedire che una stima
di distanza verso un nodo di destinazione sia inviata sul collegamento utilizzato per realizzare quell'instradamento.
C'è anche una ulteriore variante  split horizon with poisoned reverse  che consiste nel consentire l'aggiornamento
senza vincoli a tutti i vicini, ponendo però il costo a innito se il vicino a cui si invia l'informazione è proprio il nodo
successivo lungo la via a costo minimo per raggiungere la destinazione in questione.
Ha il problema di funzionare solo con reti lineari (reti con nodi in cascata uno dopo l'altro) e non in reti con cicli.

Algoritmo distance vector in Arpanet

L'algoritmo distance vector è stato utilizzato no al 1979 per la gestione della rete Arpanet (l'antenata di Internet), con
un periodo di aggiornamento di circa 100 millisecondi. La metrica di costo utilizzata era il livello di riempimento dei
buer, cosa che si rivelò non accurata, poiché trascurava la capacità dei collegamenti (dettaglio abbastanza importante
in molti casi).

Algoritmo link state


Rivelò anche una certa lentezza a convergere in situazioni dinamiche e per questo è stato poi sostituito con l'algoritmo
di tipo link state.
Ogni nodo misura periodicamente la distanza dai propri vicini e comunica queste misure in modo ooding a tutti
gli altri nodi utilizzando una unità informativa chiamata link state packet (LSP). L'algoritmo link state è utilizzato
attualmente su Internet, adottando come metrica di costo il ritardo medio rilevato sul percorso, con un periodo di
aggiornamento nell'ordine di 10 secondi.
Riassumendo, ogni nodo:

1. Scopre i propri vicini e relativi indirizzi di rete

2. Misura il costo verso ogni vicino

3. Costruisce un pacchetto (LSP) che contiene tutte le informazioni raccolte

4. Invia questo pacchetto a tutti gli altri router in modalità ooding

5. Elabora il percorso più breve verso tutti gli altri router (utilizzando i dati ricevuti dagli altri)

Misurazione del costo della linea

L'algoritmo di routing di tipo link state richiede che ogni nodo abbia una stima ragionevole del ritardo verso ciascuno
dei suoi vicini. Questo può essere ottenuto inviando uno speciale pacchetto ECHO, al quale dall'altra parte devono
rispondere il più velocemente possibile. Quando arriva la risposta si misura il tempo trascorso e si divide per due. Per
ottenere risultati ancora più precisi si può mediare il risultato inviando in continuazione.
È lecito domandarsi se abbia senso tenere conto del carico dei collegamenti all'interno della metrica di costo. C'è
un aspetto neagativo che sconsiglia di fare questa scelta, infatti si considerino due nodi collegati da due collegamenti
diretti: iniziamo a trasmettere dati solo sul primo collegamento, a un certo punto diventa sovraccarico e iniziamo a
instradare pacchetti sul secondo collegamento, allora il secondo diventa sovraccarico e si torna ad utilizzare il primo.
Ci accorgiamo quindi che può venirsi a formare un ciclo che provoca instradamenti irregolari e altri potenziali
problemi. Una scelta migliore può essere quella di distribuire il carico su più linee, attribuendone frazioni ben denite
per ciascuna.

Costruzione dei pacchetti LSP

Dopo aver raccolto tutte le informazioni necessarie, ogni nodo deve costruire un pacchetto contenente tutti i dati. Il
pacchetto contiene:

ˆ L'identità del mittente


81
ˆ Un numero di sequenza : dato che l'invio viene fatto in ooding si vogliono evitare tempeste di pacchetti e
duplicati come già discusso prima.

ˆ L'età del pacchetto

ˆ La lista dei vicini : con relativi indirizzi e costo per raggiungerli

Distribuzione dei pacchetti LSP

Come già detto, viene utilizzato il ooding per distribuire i pacchetti. Per tenere sotto controllo il usso di dati, viene
inserito un numero di sequenza in ogni pacchetto che è incrementato per ogni nuovo pacchetto inviato. I nodi tengono
tracca di tutti i pacchetti (sorgente, numero di sequenza) ricevuti. Quando arriva un nuovo pacchetto da un nodo, si
verica se per quella sorgente è già stato ricevuto un pacchetto con numero di sequenza maggiore. In caso aermativo
il pacchetto ricevuto viene scartato, in caso contrario viene letto.
Numeri di sequenza ripetitivi potrebbero generare il caos. Per evitare questo problema si utilizzano numeri di
sequenza a 32 bit; nell'ipotesi di trasmettere un pacchetto al secondo, i numeri di sequenza impiegano 137 anni ad
esaurirsi, quindi è possibile tralasciare questa possibilità.
Quando un router si blocca perde traccia dei suoi numeri di sequenza e il conteggio ricomincia da zero. Inoltre se
un numero di sequenza dovesse arrivare danneggiato e il ricevitore legge 65535 al posto di 1, tutti i pacchetti 2,3,4
successivi saranno ignorati poiché obsoleti.
Per risolvere questi problemi si utilizza un campo età all'interno di ogni pacchetto e se ne decrementa il valore
una volta al secondo. In questo modo le informazioni ricevute dopo un po' di tempo scadono inevitabilmente.

Algoritmo di Dijkstra

È l'algoritmo distributo utilizzato per la ricerca dei cammini minimi all'interno di un grafo. Con questo algoritmo si
costruisce l'albero a partire da un generico nodo sorgente s denendo le seguenti quantità:

ˆD j : Costo della via a costo minimo dal nodo sorgente s al nodo j


ˆd ij : Costo del collegamento diretto tra i e j ; d=∞ se i due nodi non sono connessi direttamente

ˆN : insieme dei nodi della rete

ˆM : insieme dei nodi dell'albero corrente

ˆ V (M ) : insieme dei nodi adiacenti all'insieme M , raggiungibili cioè in un solo salto da un nodo qualunque di
M

L'algoritmo di compone dei seguenti passi:

1. M = {s}

2. Dj = dsj , ∀j ∈ V (s) altrimenti Dj = ∞


3. Scegli k ∈ V (M ) | Dk = mini∈V (M ) {Di }

(a) M = M + {k}
(b) Dj = min {Dj , Dk + dkj } , ∀j ∈ V (M )

4. if M =N stop

5. else goto 3

Intradamento gerarchico
Le tabelle di instradamento hanno una dimensione che dipende dal numero di nodi della rete. Quando la rete diventa
molto vasta la dimensione eccessiva delle tabelle può creare problemi di allocazione di memoria nei nodi e un carico
eccessivo per la distribuzione di tutte le informazioni. Un instradamento gerarchico risolve questo problema raggrup-
pando i nodi in regioni, così che ogni nodo conosce la topologia della propria regione ma ignora quella delle altre. Se i
nodi della rete sono N e sono organizzati in M regioni con K nodi ciascuna, senza l'instradamento gerarchico abbiamo
bisogno di tabelle da N elementi. Se invece sono organizzati con instradamento gerarchico in regioni abbiamo bisogno
solo di K +M −1 voci.
La strutturazione gerarchica può essere estesa denendo più livelli di gerarchia, in modo da garantire una gestione
ottimale delle tabelle di instradamento.

82
Instradamento sulla rete Internet
Struttura generale della rete Internet
La connettività alla rete Internet è oerta dagli ISP (Internet Service Provider ), che ortono connettività agli utenti
nali. I vari ISP sono interconnessi tra loro e si suddividono in modo gerarchico in:

ˆ International ISP (Tier-1)


ˆ National ISP (Tier-1)
ˆ Regional ISP (Tier-2)
ˆ Local ISP (Tier-3)
ˆ Intranet : termine a volte adottato per reti aziendali o campus universitari

Un ISP internazionale è naturalmente collegato con altri ISP internazionali mediante vari collegamenti, ISP nazionali
e regionali sono di norma collegati a ISP internazionali, ma sono anche collegati tra loro (per scambiarsi il traco
interno al paese). Allo stesso modo gli ISP locali.

Tassonomia
ˆ BSP (Backbone Service Provider ) e NAP (Network Access Point ): forniscono solamente servizi di connettività
tra ISP.

ˆ CN (Customer Network ): rete del cliente.

ˆ POP (Point Of Presence ): punto di interconnessione tra le CN.

ˆ AS (Autonomous System )
18 : È una rete indipendente da tutte le altre, solitamente gestita da una organizzazione
o uno stato, al cui interno è possibile utilizzare protocolli di routing interni.

ˆ IG (Interior Gateway ): Router interni ad un Autonomous System

ˆ EG (Exterior Gateway ): Router esterni ad un Autonomous System, che devono permettere la connessione
dell'Autonomous System con tutti gli altri. Sono il punto di transito per tutte le connessioni uscenti dagli
Autonomous System.

Internet viene gestito da ISOC (Internet SOCiety ) divisa in IETF (Internet Engineering Task Force ) e la IRTF
(Internet Research Task Force ). Tutti gli standard vengono rilasciati mediante documenti RFC (Request For Com-
ments ), come già visto.

Tipi di protocolli di routing

In Internet vengono utilizzati due tipi di protocolli di routing:

ˆ IGP (Interior Gateway Protocol ): Protocolli di routing utilizzati all'interno degli Autonomous System. I più
noti sono RIP e OSPF .

ˆ EGP (Exterior Gateway Protocol ): Protocolli di routing utilizzati per l'instradamento tra Autonomous System
diversi. Il protocollo EGP utilizzato in internet è chiamato BGP (Border Gateway Protocol ) e sarà descritto
nel seguito.

I protocolli di routing stabiliscono essenzialmente:

ˆ Un algoritmo per selezionare il percorso

ˆ La scelta di una metrica per decidere il peso di un collegamento

ˆ La modalità di trasferimento delle informazioni e la frequenza di aggiornamento

Vediamo prima due protocolli di routing di tipo IGP e poi un protocollo EGP.

18 Nel seguito, spesso si utilizzerà la forma compatta  AS 

83
RIP - Routing Information Protocol
È stato il primo protocollo di routing IGP (denito in RFC1058), utilizzato in ARPANET e in alcune reti geograche
no al 1979, viene tutt'ora utilizzato in alcune reti. La metrica in ARPANET era basata sulla lunghezza delle code
(e non sulla velocità dei link), come già discusso precedentemente. Anche con metriche diverse (numero di hop) si è
notato che era troppo lento a convergere in un contesto dinamico.

ˆ I pacchetti RIP vengono incapsulati all'interno di datagrammi UDP (sulla porta 520). La metrica utilizzata è il
numero di hop (il cui massimo è 16).

ˆ La valutazione della rotta migliore viene fatta per ogni destinazione.

ˆ Un valore di distanza uguale a 16 corrisponde ad una distanza innita, quindi RIP non può essere adottato
all'interno di un AS di grandi dimensioni che richiede l'attraversamento di più di 15 router.

ˆ Ogni router comunica la propria tabella delle distanze ai router direttamente raggiungibili. Il messaggio RIP
contiene una coppia <Network address, distance>.

ˆ I messaggi RIP sono inviati ogni 30 secondi per garantire la dinamicità ai cambiamenti della rete.

ˆ Il meccasimo per l'aggiornamento della tabella di routing è lo stesso descritto precedentemente per gli algoritmi
di routing di tipo distance vector.

ˆ In assenza di messaggi periodici ricevuti, si considera il router remoto non più raggiungibile e viene quindi
dichiarato a distanza innita. I successivi messaggi scambiati permetteranno di aggiornare l'instradamento.

Struttura della trama RIP


 (32 bit) 
Command (8 bit) Version (8 bit) 0000000000000000
Address family identier net 1 (16 bit) Field A (16 bit)
IP address net 1 (32 bit)
Field B (32 bit)
Field C (32 bit)
Distance net 1 (32 bit)
...
Il messaggio RIP può trasportare no a 25 coppie <Network address, distance>. Il formato del messaggio sopra
rappresentato contiene solo una di queste coppie (riferita ad una generica net 1). I campi del messaggio sono:

ˆ Command (8 bit): Identica il tipo di messaggio (di richiesta o di risposta)

ˆ Version (8 bit): specica la versione del protocollo RIP utilizzata.

ˆ Address family identier net 1 (16 bit): Specica qual'è la classe di indirizzi di rete adottata

ˆ IP address net 1 (32 bit): Indica l'indirizzo di rete a cui si riferisce l'informazione di distanza successiva.

ˆ Distance net 1 (32 bit): Specica la distanza (in numero di salti) del router che origina il messaggio alla rete
specicata.

La prima versione del protcollo (con version=1) pone tutti i campi A,B,C a 0. È stata creata una seconda versione
del protocollo RIP, denominata RIPv2 (RFC1723) che resta retrocompatibile con la prima versione pur aggiungendo
nuove funzionalità, tra cui: un meccanismo di autenticazione, l'informazione relativa alla subnet mask e il next-hop
router utilizzato. Se si utilizza la versione 2 di RIP abbiamo questi altri campi:

ˆ Field A (16 bit): Assume il valore route tag net 1, cioè identica il sistema autonomo che ha originato
l'informazione di distanza verso la rete  net 1 

ˆ Field B (16 bit): Assume il valore netmask net 1, cioè indica la subnet mask da utilizzare insieme all'indirizzo
IP della rete.

ˆ Field C (16 bit): Assume il valore next hop net 1, cioè indica il router successivo relativo alla distanza
comunicata.

Con la versione 2 di RIP e l'introduzione del Field A e C, si prevengono situazioni di loop intrinseche degli algoritmi
di tipo distance vector.

84
OSPF - Open Shortest Path First
Protocollo di routing IGP di tipo link state, che fa uso dell'algoritmo di Dijkstra, utilizzato all'interno di molti
Autonomous System.
È diventato uno standard nel 1990 (RFC2328). Oggi è supportato dalla maggior parte dei produttori di router ed
è il principale protocollo di routing per gateway interni. OSPF è stato successivamente esteso in OSPF-TE (Trac
Engineering Extensions to OSPF) per tenere conto del traco per il costo di ogni link.
I pacchetti OSPF vengono incapsulati direttamente dentro i datagrammi IP (impostando come identicatore di
protocollo all'interno del datagramma IP il numero 89).
Quando fu ideato venne stilata una lista di requisiti che il protocollo doveva avere:

ˆ Doveva essere pubblicato senza vincoli di brevetto, motivo della parola  Open  nel nome, che è l'opposto
di proprietario.

ˆ Doveva supportare diverse metriche di distanza (distanza sica, ritardo, ...)

ˆ Doveva essere un algoritmo dinamico, in grado di modicarsi rapidamente e automaticamente in base alla
topologia.

ˆ Supportare routing basato sul tipo di servizio. OSPF doveva essere in grado di instradare il traco in
tempo reale in modo diverso dal resto. Questo campo fu incluso in OSPF ma alla ne venne rimosso perchè
(come nei datagrammi IP) non veniva utilizzato mai da nessuno.

ˆ Doveva eettuare il bilanciamento del carico, cioè suddividere il carico su più linee. Suddividendo il carico
in molti casi si ottengono prestazioni migliori.

ˆ Supportare sistemi gerarchici

ˆ Gestire la sicurezza per evitare che utenti possano imbogliare i router, inviando false informazioni.

Tipi di connessioni e reti gestite da OSPF

ˆ Linee punto-punto tra due router

ˆ Reti multiaccesso con trasmissione broadcast (la maggior parte delle LAN)

ˆ Reti multiaccesso senza trasmissione broadcast (la maggior parte delle WAN a commutazione di pacchetto)

Nel caso di reti multiaccesso dove sono presenti due router OSPF, solo uno di essi denominato  designated router 
viene autorizzato ad inviare messaggi agli altri. La procedura di elezione del designated router avviene mediante
scambio di messaggi OSPF di tipo  Hello , con cui viene anche scelto un router di backup.

Gerarchia in OSPF

Molti AS di Internet sono grandi e dicili da gestire, quindi vengono suddivisi in più aree. Ogni area è una rete o
un insieme di reti contigue. Alcuni router possono comunque non appartenere a nessuna area. Ogni AS ha un'area
dorsale chiamata  Area 0 (solitamente identicata dall'indirizzo 0.0.0.0). Tutte le aree sono collegate alla dorsale,
perciò è possibile passare da un'area qualunque ad un'altra dello stesso AS passando per la dorsale. Ogni area viene
identicata da un indirizzo a 32 bit, mentre i router sono identicati dal proprio indirizzo IP su una delle interfacce.
I router all'interno dell'area hanno il compito principale di calcolare il percorso più breve verso ogni altro router
nell'area. Un router che collega due aree ha bisogno dei database di antrambe le aree e deve eseguire separatamente
un diverso algoritmo di ricerca del percorso più breve per ogni area.
I router in OSPF si suddividono in:

ˆ Interal routers : tutte le loro interfacce appartengono alla stessa area

ˆ AS boundary routers : sono collegati ad almeno un router fuori dall'AS

ˆ Area border routers : hanno interfacce che appartengono ad aree dierenti. Almeno una delle loro interfacce
deve essere nell'area 0 di backbone.

Funzionamento del protocollo

ˆ All'avvio, un router trasmette un messaggio  Hello  a tutti i router vicini attraverso tutte le sue linee punto-punto
e comunica questi messaggi in modalità multicast sulle LAN.

ˆ Durante le normali operazioni, ogni router invia periodicamente in selective ooding messaggi di tipo LSU (Link
State Update ) a ognuno dei suoi router adiacenti. Questo messaggio comunica lo stato del dispositivo e i costi
utilizzati nel database della topologia di rete.

85
ˆ I router che ricevono questo messaggio rispondono con un messaggio di acknowledgement Link State Acknowl-
edgement, che rende questi messaggi adabili. Ogni messaggio ha un numero di sequenza, quindi un router può
scoprire se un LSU appena arrivato è nuovo o vecchio.

ˆ I router inviano i messaggi LSU anche nel caso in cui un collegamento si attiva, si disattiva o cambia il suo
costo.

ˆ I messaggi di tipo Database Description vengono utilizzati dal router, al momento di cambio della topologia di
rete, per concordare una regola di numerazione dei collegamenti. Questi messaggi sono utilizzati quando una
linea viene attivata.

ˆ Tutti i router conservano una sopia di tutti i pacchetti LSU ricevuti e li comparano con i nuovi in arrivo. Se
contengono nuove informazioni (diverse dalle precedenti), vengono inviate le nuove informazioni ricevute in modo
selective ooding (su tutte le interfacce tranne quella su cui è stato ricevuto il pacchetto).

ˆ Ognuno dei partner può richiedere all'altro alcune informazioni sullo stato dei collegamenti utilizzando i pacchetti
Link State Request. In questo modo si può controllare chi ha i dati più recenti e propagare le informazioni
attraverso l'area.

ˆ Le informazioni raccolte, permettono ad ogni router di calcolare il percorso più breve verso ogni altra destinazione
utilizzando l'algoritmo di Dijkstra.

ˆ Ogni pacchetto LSU contiene un insieme di dati LSA (Link State Advertisement) che possono essere dati di
svariato tipo:

 Router LSA: Distanza tra un router e le destinazioni adiacenti all'interno dell'area


 Network LSA: La distanza tra il router centrale e le destinazioni su una LAN
 Summary LSA: La distanza tra un router di tipo border area router e le destinazioni adiacenti fuori
dall'area (ma sempre all'interno dell'AS)

 AS boundary router summary LSA: Distanza tra un border area router e un AS boundary router .
 AS external LSA: Distanza tra un AS boundary router e una destinazione esterna.

Struttura della trama OSPF

 
Come già accennato, OSPF viene incapsulato direttamente all'interno dei datagrammi IP.
(32 bit)
Version (8 bit) Type (8 bit) Message Lenght (16 bit)
Source router IP address (32 bit)
Area ID (32 bit)
Checksum (16 bit) Authentication type (16 bit)
Authentication (Byte 0-3)
Authentication (Byte 4-7)
Viene indicata, oltre alla versione del protocollo anche il tipo di messaggio, i più importanti sono:
Tipo Messaggio
1 Hello
2 Database description
3 Link state request
4 Link state update
5 Link state acknowledgement

ˆ L'header riporta l'indirizzo IP del router che ha generato il messaggio e l'identicazione dell'area a cui appartiene
(assume valore 0 se non ci sono aree o è un router del backbone).

ˆ C'è un campo di controllo di errore e un meccanismo di autenticazione

BGP - Border Gateway Protocol


È un protocollo di routing di tipo EGP, attualmente utilizzato in Internet nella sua versione 4 (che ha aggiunto il
supporto a CIDR e altre novità importanti). È stato denito in RFC1771-RFC1774. Esso permette a router di AS
dierenti di scambiarsi le informazioni necessarie a realizzare l'instradamento, indipemendentemente dal protocollo di
routing interno utilizzato.
Ci si potrebbe chiedere perché inventare ancora un altro protocollo. Il motivo è dovuto al fatto che nella comuni-
cazione tra AS diversi ci sono obbiettivi dierenti e principalmente ci si preoccupa della politica di instrademento .
Per esempio un AS aziendale potrebbe voler inviare e ricevere pacchetti da Internet ma non vorrebbe che pacchetti da
un qualunque altro AS e diretti ad un altro AS transitino sui propri router. Oppure l'azienda potrebbe essere pronta

86
ad accettare la cosa solo per chi ha pagato per questo servizio. Allo stesso modo si potrebbe voler evitare il transito
dei pacchetti originati dal Pentagono attraverso l'Iraq... Questi criteri sono solitamente congurati manualmente in
ogni router BGP.
BGP è stato quindi progettato per gestire il rispetto di molti tipi di criteri di routing nel traco tra AS dierenti.

ˆ A causa dell'interesse di BGP per il traco di passaggio, le reti vengono suddivise in tre categorie:

 Stub networks (reti terminali): hanno una solo connessione al grafo BGP. Non possono essere utilizzate
come reti di passaggio perchè solo collegate al resto della rete con una sola interfaccia.

 Multiconnected networks (reti multicollegate): possono essere utilizzate per il traco di passaggio, a
meno che si riutino di farlo.

 Tansit networks (reti di transito): Sono le dorsali di Internet, reti predisposte appositamente per gestire
pacchetti di terze parti, a volte con alcune restrizioni inserite a pagamento.

ˆ BGP trasmette i propri pacchetti incapsulati all'interno di pacchetti TCP. In questo modo viene garantia la
adabilità nella consegna e vengono nascosti tutti i dettagli della rete attraversata.

ˆ BGP utilizza una versione di algoritmo di routing di tipo distance vector leggermente modicata, chiamata path
vector, implementata in modo da evitare la presenza di cicli (e il problema del count-to-innity). Ogni router
BGP, al posto di conservare solo il costo per ogni destinazione, tiene traccia del percorso utilizzato. Al posto
di comunicare ai vicini la distanza da ogni destinazione, il router BGP comunica l'esatto percorso in uso. In
questo modo gli altri router che ricevono questa informazione possono accorgersi se sono parte di quel percorso
ed evitare il problema del count-to-innity.

ˆ Ogni percorso che viola uno dei criteri di vincolo discussi prima, riceve un costo innito

Lo strato applicativo (livello 7 ISO/OSI)


Architettura client-server
La maggior parte delle applicazioni e protocolli a livello applicativo si basano sull'architettura client-server. Si stabilisce
cioè la presenza di un host centrale sempre attivo (il server ), con indirizzo IP sso, che serve un certo tipo di richieste
a degli host che vi si collegano (i client ). I client sono macchine che solitamente si collegano ai server in modo
discontinuo, non sono sempre attivi e spesso hanno un indirizzo IP dinamico.

Architettura peer-to-peer
Sono quelle applicazioni e protocolli che realizzano delle connessioni tra di loro senza la necessità di un server centrale.
In questo caso i client prendono il nome di  peers. Esempi classici di protocolli peer-to-peer sono quelli per il
le-sharing.

Protocollo HTTP
Il protocollo HTTP (HyperText Transfer Protocol) è il protocollo utilizzato su internet per scaricare les e soprattutto
pagine web (documenti HTML) da dei server.
La prima versione del protocollo, HTTP/1.0 (RFC1945) risale al Maggio 1996. Successivamente ad alcune piccole
modiche è stata rilasciata la successiva versione HTTP/1.1 (RFC2068) che è, a distanza di 16 anni, tutt'oggi utilizzata.

ˆ Il protocollo HTTP si basa sulla architettura classica client-server e funziona tramite pacchetti TCP ed è
solitamente in ascolto con LISTEN sulla porta 80.

ˆ I client richiedono al server HTTP dei les identicati da un URL (Uniform Resouce Locator).

ˆ Si dice che HTTP è un protocollo di tipo stateless, perché non tiene memoria dello stato della comunicazione
o delle richieste di ciascun client.

Uniform Resource Locator


È un indirizzo alfanumerico (ASCII) strutturato come segue:
[Method] :// [Host] : [Port] / [Path]

ˆ Method : È un identicatore del tipo di protocollo utilizzato. Per le pagine web è sempre  http , però la struttura
degli URL può essere utilizzata anche in altri protocolli sfruttando nomi diversi ( ftp ,sftp,rtp ).

87
ˆ Host : È l'indirizzo IP o l'hostname DNS che identica il server da contattare.

ˆ Port : Specica la porta TCP destinazione da utilizzare per la connessione. Solitamente HTTP sfrutta la porta
80 e se non viene indicato un valore port viene assunto questo come default.

ˆ Path : Indica un percorso che identica un le da reperire su quel server. È possibile anche non indicare nessun
path.

Struttura delle richieste HTTP


Quando un client vuole eettuare una richiesta verso un server HTTP deve strutturarla in questo modo:

[Method] [Url] [Version] \r\n


[Header Field name] :[Value] \r\n
...
\r\n
[Entity Body]

Dunque abbiamo inizialmente una prima riga di richiesta dove viene specicato al server cosa vogliamo fare.

ˆ Method indica appunto il tipo di operazione HTTP. I vari tipi più noti sono:

 GET : È utilizzato per richiedere al server un le/documento. Il percorso del documento è specicato
subito dopo il method.

 HEAD : È utilizzato per richiedere al server solo alcune informazioni generali sul documento (ad esempio
la data dell'ultima modica), senza scaricarlo. Nella risposta il server inserisce quindi solo le informazioni
generali.

  POST : È utilizzato per inviare al server alcune informazioni da utilizzare su una particolare pagina tramite
l'entity body. Viene soprattutto utilizzato per passare parametri ad applicazioni web.

  PUT : È utilizzato per memorizzare un documento all'interno del server. Il percorso dove memorizzare è
l'URL seguente e il contenuto è nel seguito della richiesta

 Ci sono poi tutta una serie di method poco utilizzati o implementati per scopi particolari come PATCH,
COPY, MOVE, DELETE, LINK, UNLINK, OPTIONS.

ˆ Gli Header eld name sono una serie di parametri che possono essere impostati nella richiesta inviata al server.
Esempi noti di valori header sono:

 Host : Si specica come valore l'hostname (se presente) attraverso cui è stato contattato il server. Alcuni
server HTTP ospitano decine di sotto-server diversi sullo stesso indirizzo IP. Il modo per distinguere le
richieste è questo campo header.

  Cache-control: Fornisce alcune informazioni sulla cache


  Accept : Specica una lista di formati di les che vengono accettati dal client, ad esempio text/html,
image/gif, image/jpeg

  Accept-language : Specica il linguaggio preferito per ricevere le pagine: italiano (it), inglese (en),...
  Authorization : Invia al server alcune informazioni realtive alle credenziali necessarie per visitare una certa
pagina. HTTP implementa infatti un meccanismo elementare di autenticazione per alcune pagine.

  If-modied-since : Indica una data al server dell'ultima volta che è stato scaricato il documento. Se il
documento non è cambiato il server non lo reinvierà nuovamente.

  User-agent : Indica una stringa che identica il programma browser utilizzato per richiedere il documento.

ˆ Version è solitamente la stringa  HTTP/1.1  per la nuova versione.

ˆ Ogni riga della richiesta HTTP deve terminare con i due caratteri nuova riga e a capo, qui indicati con \r
e \n.

Struttura delle risposte HTTP


[Version] [Status code] [phrase] \r\n
[Header Field name] :[Value] \r\n
...
\r\n
[Entity Body]

88
ˆ Status code e Phase : è un codice numerico a tre cifre che identica il tipo di risposta seguito da una descrizione
testuale. I più noti sono:

 1xx : Messaggi informativi

*  100 Continue per indicare che la prima parte di una richiesta è stata accettata.

 2xx : Messaggi di successo

*  200 OK  signica che la richiesta ha avuto successo e l'informazione è inclusa di seguito

 3xx : Messaggi di redirezione

*  302 Moved Permanenty o  304 Moved Temporalily , che indicano l'url nella nuova posizione della
pagina che si sta cercando.

 4xx : Sono messaggi di tipo  client error , che si riferiscono cioè a richieste errate.

*  400 Bad Request si riferisce ad un errore generale sulla richiesta (solitamente perché è malformata).

*  401 Unauthorized  indica al client che per visitare questa pagina è necessario l'utilizzo di credenziali.

*  403 Forbidden  indica al client che non gli è permesso visitare quella pagina.

*  404 Not Found  indica al client che il documento che si sta cercando non esiste sul server.

 5xx : Sono messaggi di errore di tipo  server error , relativi cioè a problemi del server.

*  500 Internal server error  indica un errore nel server che impedisce di servire la pagina

*  501 Not implemented  indica una funzione non implementata

*  503 Service unavailable  indica un servizio non disponibile

Persistenza della connessione


Da HTTP 1.1 le connessioni sono persistenti, cioè restano aperte anche dopo una richiesta e una risposta dal server.
Il motivo è che praticamente qualunque pagina continiene al suo interno collegamenti relativi ad altri documenti da
caricare (immagini, video, frame che contengono altre pagine, etc ...), si permette quindi di eettuare la richiesta di
una pagina e subito dopo proseguire a chiedere tutti gli elementi in essa contenuta nella stessa connessione.
Se si utilizza invece una connessione non persistente, sarebbe necessario scaricare la pagina in una connessione e
successivamente aprirne altre, una per ogni oggetto da caricare. Solitamente queste connessioni vengono aperte in
parallelo per minimizzare il ritardo.
I browser moderni utilizzano una combinazione di connessioni persistenti e non persistenti, cioè alcuni oggetti
vengono richiesti all'interno della stessa connessione, mentre altri scaricati in parallelo su nuove connessioni. Il numero
di connessioni aperte e oggetti per ogni connessione sono dei parametri interni al browser.
Quando si utilizza la modalità persistente è inoltre possibile eettuare pipelining, cioè fare più richieste consecutive
senza aspettare di ricevere la risposta dal server.

Cache mediante l'utilizzo di proxy


In alcune reti dove l'utilizzo di banda è un fattore critico, vengono implementati dei proxy applicativi. Un proxy
HTTP è un programma su cui transitano tutte le richieste dei client verso le pagine web. Quando il proxy si accorge
che ci sono molte richieste continue verso uno stesso sito, ne eettua una copia di Cache. Successivamente quando i
client richiedono nuovamente quella pagina, il proxy (che la ha già in memoria) la fornirà direttamente, controllando
eventualmente solo se è stata modicata sul server. In questo modo si evita di fare tante connessioni verso lo stesso
server per ottenere la stessa pagina.
È infatti possibile fare quello che viene chiamato  get condizionato , cioè fare una richiesta al server includendo
l'header  If-modied-since  , di modo che il server risponda solo se la pagina è stata modicata in quel lasso temporale.
La stessa cosa può anche essere fatta utilizzando il method HEAD e controllando la data restituita dal server (in
questo caso è richiesto fare un passaggio in più però).

Autenticazione
Poiché HTTP è un protocollo stateless, non è possibile riconoscere le richieste successive fatte da uno stesso utente.
In HTTP esiste un meccanismo elementare di autenticazione con credenziali (username e password) che serve a
identicare gli utenti che vogliono visitare una pagina.
Normalmente il browser memorizza le credenziali di modo che non siano richieste per ogni pagina successiva.

ˆ Il client eettua una normale richiesta con method GET

ˆ Il server risponde con codice  401 Authorization Required  aggiungendo nell'header di risposta il valore  WWW-
Authenticate: [tipo di autenticazione] 

89
ˆ Il client eettua nuovamente una richiesta con method GET aggiungendo questa volta negli headers la riga
 Authorization: [account],[password]

ˆ Il client prosegue ad eettuare tutte le richieste aggiungendo la riga di autorizzazione per ogni pagina

Cookie
Esiste un modo per riconoscere richieste successive di uno stesso utente (senza usare credenziali) anche se HTTP è
un protocollo stateless. Per farlo si utilizza un codice inviato dal server al client, che il client deve reinserire in ogni
risposta: il cookie.

ˆ Il client eettua una richiesta GET

ˆ Il server risponde  200 OK  e prima della pagina inserisce negli headers il campo  Set-cookie: [codice] 

ˆ Il client eettua le successive GET includendo nel'header  Cookie: [codice]

In questo modo è possibile tenere traccia degli utenti sui siti e mostrare pagine dierenti a seconda delle operazioni che
stanno facendo. Un esempio tipico è un sito di e-commerce dove un utente sceglie una serie di prodotti da acquistare
e può poi vederli nel proprio carrello. Per tenere traccia di cosa ha comprato ciascun utente e mostrare carrelli
diversi si utilizzano solitamente i cookie.
I cookie sono utilizzati anche su altri siti che eettuano l'autenticazione in modo diverso per tenere traccia della
sessione autenticata. In questo caso il cookie funge da token di autenticazione.

FTP - File Transfer Protocol


Denito inizialmente in RFC959 nel 1985 è un protocollo utilizzato per il trasferimento di les a livello di lesystem
tra due host remoti. Fa uso di TCP per il trasporto dei dati.
FTP fa solitamente uso di due connessioni. Una è la connessione di controllo, dove vengono impartiti i comandi
delle operazioni da eettuare (scaricare un le, caricare un le, mostrare la lista dei les...) mentre l'altra è una
connessione dove eettivamente vengono scambiati i dati.
Il server FTP è solitamente in ascolto per le connessioni di controllo sulla porta 21 TCP. La connessione di controllo
è di tipo persistente, cioè rimane aperta durante tutta la durata della sessione di trasferimento e può essere usata per
più operazioni. Le connessioni dati, invece, sono di tipo non persistente, sono cioè aperte solo per trasferire un le o
delle informazioni e sono immediatamente chiuse.

Connessione di tipo attivo


Nella modalità attiva le operazioni vengono svolte in questo modo:

ˆ Il client avverte il server, sulla connessione di controllo che desidera iniziare un trasferimento dati e eettua una
LISTEN (passive open) su una porta a sua scelta

ˆ Il client comunica la porta aperta al server sulla connessione di controllo mediante il comanndo PORT

ˆ Il server eettua una CONNECT (active open) verso la porta del client utilizzando come porta sorgente la 20
(o se è occupata un'altra porta a caso).

Connessione di tipo passivo


ˆ Il client invia il comando PASV al server per annunciare l'intenzione di utilizzare la modalità passiva.

ˆ Il server sceglie un numero di porta a caso, fa una LISTEN (passive open) e comunica il numero di porta al
client mediante il comando PORT.

ˆ Il client fa una CONNECT (active open) verso la porta comunicata dal server.

La modalità attiva ha iniziato ad essere inutilizzata man mano che passano gli anni a causa dell'utilizzo delle NAT
(che non permettono di esporre porte aperte verso il pubblico) e dei rewalls sulle macchine utente.
Alcuni NAT tuttavia intercettano le connessioni dirette alla porta 21 di altri server e aprono alcune porte in ingresso
verso un host dietro NAT quando vedono il comando PORT passare all'interno della connessione per garantire il
funzionamento anche della modalità attiva.
Diversi anni fa alcuni gruppi di utenti scontenti dietro NAT gestiti da ISP hanno iniziato a aprire connessioni FTP
ttizie per aprire porte del NAT ed esporre servizi pubblici.

90
Tipo di trasferimento dati
Il trasferimento dati può avvenire in varie modalità.
Il le può essere trasferito come tipo:

ˆ ASCII : le di caratteri

ˆ Binary : formato generale per tutti i les non testuali

La modalità di trasmissione può essere:

ˆ Stream mode : il le viene trasferito via TCP senza nessuna struttura

ˆ Block mode : il le viene trasferito in blocchi i cui primi 3 byte rappresentano l'header

Comandi FTP
ˆ Comandi di accesso

 USER
 PASS
 QUIT

ˆ Gestione les

 CWD: cambio cartella


 DELE: cancella un le
 LIST: mostra la lista dei les
 RETR: scarica un le
 STOR: carica un le

ˆ Modalità di trasferimento

 TYPE
 MODE

ˆ Meccanismo di apertura delle porte

 PORT
 PASV

Sono poi presenti dei messaggi di risposta con codici numerici in modo molto simile ad HTTP.

SMTP - Simple Mail Transfer Protocol


È il protocollo ideato per lo scambio di e-mail attraverso Internet. Fu denito inizialmente in RFC821 nel 1982.
Il meccanismo su cui si basano è il seguente:

ˆ Degli  user agent si collegano e comunicano ai server SMTP messaggi che desiderano inviare, indicando mittente,
destinatario e corpo del messaggio tramite una connessione TCP sulla porta 25 (porta del server SMTP)

ˆ Eventualmente lo user agent si scollega e intanto il server SMTP si preoccupa di recapitare il messaggio: apre
una connessione verso il server SMTP del destinatario e invia il messaggio. Se il server del destinatario ha un
problema, si tenta di recapitare il messaggio più tardi.

Il protocollo SMTP è totalmente testuale, sia nei comandi che nel corpo dei messaggi, che devono essere sempre ASCII.
Come in HTTP e FTP sono presenti dei messaggi di risposta con codici numerici.

91
Meccanismo base
ˆ Uno user agent si collega al server SMTP e comunica da dove si sta collegando con il comando HELO

ˆ Lo user agent specica il mittente con MAIL FROM

ˆ Successivamente indica il destinatario con RCPT TO

ˆ Indica l'inizio del messaggio con il comando DATA

ˆ Compone il messaggo

ˆ Termina il messaggio con un punto

ˆ Chiude la connessione con QUIT

Formato dei messaggi


Il formato dei messaggi inviati dopo il comando DATA è stato denito in RFC822.
Con questo formato il testo del messaggio viene preceduto dal alcuni header (strutturati allo stesso modo che in
HTTP), come ad esempio:

From: [indirizzo]\n
To: [indirizzo]\n
Subject: [oggetto del messaggio]\n
\n
[testo del messaggio]
.

Successivamente è stato introdotto l'utilizzo di MIME (Multipurpose Internet Mail Extensions ) con lo scopo principale
di consentire il trasferimeto di messaggi non ASCII. Viene aggiunta anche la possibilità di inserire allegati.
Uno dei metodi per inserire testo non ASCII in un messaggio è l'utilizzo della codica in base64

Codica base64
Le sequenze di bit da trasferire vengono divise in gruppi di 24 bit. Ogni gruppo viene suddiviso in 4 sottogruppi di 6
bit. Ad ogni gruppo è associato un carattere in un alfabeto ASCII in base 64.

Quoted printable
Quando sono presenti solo alcuni caratteri di tipo non-ASCII è possibile utilizzare questo metodo. Con questo metodo
quando si incontra un carattere non-ASCII, viene sostituito da tre caratteri ascii: = seguito dalla rappresentazione
esadecimale del byte.
Ad esempio il carattere non-ASCII con valore 10011101 viene convertito in =9D

POP3 - Post Oce Protocol 3


Il protocollo SMTP permette di inviare un messaggio ad un server e permette a due server di scambiarsi messaggi.
Quando un messaggio arriva nel server di destinazione, viene salvato su di esso su una casella di posta elettronica
virtuale. Per permettere agli utenti di leggere la loro casella di messaggi sono stati inventati alcuni procotolli, tra cui
POP3.
POP3 gestisce quindi l'autenticazione dell'utente al server e il trasferimento dei messaggi.
POP3 utilizza TCP ed è in ascolto sulla porta 110.

Messaggi del protocollo


ˆ user e pass autenticano l'utente sul server POP3

ˆ Il server risponde con dei messaggi tipo  +OK  o  -ERR 

ˆ Nella fase di transizione:

 list : Elenca i messaggi in coda e la loro dimensione


 retr : Permette al client di richiedere al server un messaggio (viene inviato nella stessa connessione)
 dele : cancella un messaggio
 quit : chiude la connessione

92
Telnet - Terminal Network
È un semplice protocollo utilizzato per accedere a macchine remote ed impartire comandi. È stato uno dei primissimi
protocolli implementati.
I comandi sono trasferiti su una connessione TCP.
I caratteri dati sono caratteri ASCII (primo bit pari a 0), mentre i comandi di controllo sono tutti caratteri
non-ASCII (con il primo bit pari a 1). Ad esempio:

ˆ IAC (255): Interpreta il prossimo carattere come carattere di controllo

ˆ EC (247): Cancella l'ultimo carattere scritto

DNS - Domain Name System


È il servizio che permette principalmente la traduzione di nomi in indirizzi IP. Il DNS è in realtà un database distribuito,
dove ogni zona contiene le informazioni relative a se stessa, però queste zone riescono a cooperare e condividere i propri
dati tra di loro quando uno necessita i dati dell'altro, inoltre le varie zone sono organizzate in modo gerarchico.
Il DNS fu specicato formalmente da Paul Mockapetris negli RFC 882 e RFC 883, nel 1983. Successivamente le
speciche furono aggiornate con RFC 1034 e RFC 1035 nel 1987.
Gli indirizzi sono strutturati in modo gerarchico e ogni parte è separata da un punto ed è gestita da una autorità
diversa.
Ad esempio www.polimi.it , osservandolo da destra a sinistra vediamo it che è un dominio di primo livello (TLD -
Top Level Domain) che è la parte di indirizzo gestita dall'Italia. Chiunque vuole un indirizzo che termina con .it deve
richiederlo al register italiano. polimi è un dominio di secondo livello assegnato dal register italiano al Politecnico di
Milano. www è un dominio di terzo livello comunemente utilizzato per identicare che si vuole accedere al server web
di polimi.it . Questa terza parte dell'indirizzo viene gestita internamente dal politecnico.
I nomi utilizzati nei DNS sono case-insensitive, POLIMI.IT è come scrivere Polimi.it che è come scrivere polimi.it
.
DNS fa uso di UDP per le richieste.

Struttura dei server DNS


Un host che desidera scoprire l'indirizzo IP associato ad un certo indirizzo simbolico deve contattare un nameserver
DNS. Ce ne sono di svariati tipi:

ˆ Local Name Server : sono server DNS direttamente collegati agli host. Ogni ISP ne ha uno. Se il server
contattato non conosce la risposta per la richiesta eettuata, si occupa di contattare un Root Name Server, un
Top Level Domain.

ˆ Root Name Server : Sono dei server DNS centrali che contengono una grande quantità di informazioni riguardo
a diversi host e gruppi. Ce ne sono circa una decina in tutto il mondo, quasi tutti in USA. Contengono
informazioni sui server TLD da contattare. Contattano a loro volta gli Authoritative Name Servers.

ˆ Top-Level Domain Server (TLD) : Sono dei server che contengono informazioni per l'indirizzamento di
domini di primo livello come it,uk,com,jp...

ˆ Authoritative Name Server : Sono dei server DNS responsabili per un certo gruppo di domini.

Tipi di messaggi DNS


In ogni risposta DNS sono presenti diverse tuple organizzate in questo modo:
Name, Value, Type, TTL
Type indica il tipo di record, ce ne sono diversi:

ˆA : Name è il nome di un host e Value è il suo indirizzo IP.

ˆ NS : Name è un dominio e Value è il nome di un altro server DNS da cui ottenre le informazioni relative.

ˆ CNAME : Name è un nome alternativo (alias) per un host, il cui nome canonico è Value.

ˆ MX : Name è un dominio e Value è indirizzo IP del server su cui recapitare la posta per quel dominio. Questo
campo viene utilizzato dai server SMTP per sapere chi contattare per recapitare la posta.

TTL indica il tempo di vita dell'informazione. Se indico un TTL di un giorno, quando una richiesta transita su un
server DNS, questo può eettuare chaching della risposta per un tempo massimo pari a TTL, di modo da non dover
eettuare la richiesta nuovamente e in continuazione.

93
Meccanismo per reperire le informazioni
Le richieste solitamente si propagano in modo gerarchico dal server DNS locale ai root name servers. Se però ad
esempio un server DNS locale già conosce chi contattare per uno dei livello superiori, contatta direttamente un server
DNS di più basso livello.

Scambio di messaggi DNS


Ogni host collegato ad internet possiede l'indirizzo di un server DNS da contattare per risolvere i domini.
Quando si inserisce un indirizzo simbolico in qualunque applicazione, il sistema operativo invia un messaggio al
server DNS per conoscere l'indirizzo IP associato.

Argomenti ancora mancanti (TODO)


ˆ Livello sico

ˆ Livello applicativo

 RTP
 DNS
 HTTP
 FTP
 SMTP/POP/IMAP

ˆ Controllo di usso e parte introduttiva al trac shaping

ˆ Parametri di TCP moddabili da linux

ˆ Informazioni aggiuntive sul meccanismo di numerazione per l'opzione timestamp di tcp

ˆ Struttura della trama ping req/rep in ICMPv6

ˆ 802.11n e seguente

ˆ TCP Syncookies

ˆ Breve storia di Internet

ˆ cenno su TCP hando

ˆ IGMP e internet multicasting

ˆ Completare BGP con altri dettagli (vedi pattavina)

ˆ Comando host su linux per i DNS

ˆ Sockets in C

ˆ controllare SSTRESH con window scale

ˆ Formula per il calcolo MSL

ˆ Controllare i valori iniziali di TTL/alpha etc

ˆ sistemare le descrizioni nali di ethernet

ˆ MTU ip senza considerare LLC?!

ˆ Ecn echo

ˆ Risistemare BGP/RIP/RIPv2/AS e ISP

ˆ Immagine tcp tear down

ˆ disegni go-back-n vs. selective repeat

ˆ Criteri implementativi per decidere gli intervalli di interrogazione ARP.

ˆ TCP Timestamp option

ˆ Finire gure parte sistemi a code

94
Riferimenti bibliograci
[1] A. Pattavina Reti di telecomunicazione - Networking e Internet II edizione

[2] Andrew S. Tanenbaum Reti di calcolatori IV edizione

[3] Slides del corso 085894 Reti di telecomunicazione ed Internet del Politecnico di Milano, campus Leonardo

95

Potrebbero piacerti anche