5.4) Controllo della congestione |
Quando troppi pacchetti sono presenti in una
parte della subnet, si verifica una congestione
che degrada le prestazioni. Ciò dipende dal fatto che,
quando un router non riesce a gestire tutti i pacchetti che gli
arrivano, comincia a perderli, e ciò causa delle ritrasmissioni
che aggravano ancor più la congestione.
La congestione in un router può derivare da diversi fattori:
Inoltre, la congestione in un router tende a propagarsi ai suoi
vicini che gli inviano dati. Infatti, quando tale router è
costretto a scartare i pacchetti che riceve non li conferma più,
e quindi i router che li hanno spediti devono mantenerli nei propri
buffer, aggravando così anche la propria situazione.
Il controllo della congestione
è un problema globale di tutta la rete, ed è ben
diverso dal problema del controllo di flusso nei livelli data
link, network (nel caso dei servizi connection oriented) e trasporto,
che invece riguarda una singola connessione sorgente-destinazione.
Ci sono due approcci al problema della congestione:
Il primo cerca di impostare le cose in modo che la congestione
non si verifichi, ma poi non effettua azioni correttive.
Il secondo tiene sott'occhio la situazione della rete, intraprendendo
le azioni opportune quando necessario.
5.4.1) Traffic shaping |
In questo approccio, di tipo open loop, l'idea
è di forzare la trasmissione dei pacchetti a un ritmo piuttosto
regolare, onde limitare la possibilità di congestioni.
Verdemo tre tecniche per implementare il traffic shaping:
Algoritmo Leaky bucket (secchio che perde)
L'idea è semplice, e trova un analogia reale in un secchio
che viene riempito da un rubinetto (che può essere continuamente
manovrato in modo da risultare più o meno aperto) e riversa
l'acqua che contiene attraverso un forellino sul fondo, a ritmo
costante. Se viene immessa troppa acqua, essa fuoriesce dal bordo
superiore del secchio e si perde.
Sull'host si realizza (nell'interfaccia di rete o in software)
un leaky bucket, che è autorizzato a riversare sulla rete
pacchetti con un fissato data rate (diciamo b bps) e che mantiene,
nei suoi buffer, quelli accodati per la trasmissione.
Se l'host genera più pacchetti di quelli che possono essere
contenuti nei buffer, essi si perdono.
In questo modo, l'host può anche produrre un traffico bursty
senza creare problemi sulla rete; finché il data rate medio
non supera i b bps tutto funziona regolarmente, oltre si cominciano
a perdere pacchetti.
Algoritmo token bucket (secchio di gettoni)
E' una tecnica per consentire un grado di irregolarità
controllato anche nel flusso che esce sulla rete.
Essenzialmente, si accumula un credito trasmissivo con un certo
data rate (fino ad un massimo consentito) quando non si trasmette
nulla.
Quando poi c'è da trasmettere, lo si fa sfruttando tutto
il credito disponibile per trasmettere, fino all'esaurimento di
tale credito, alla massima velocità consentita dalla linea.
Il secchio contiene dei token,
che si creano con una cadenza prefissata (ad esempio uno ogni
millisecondo) fino a che il loro numero raggiunge un valore M
prefissato, che corrisponde all'aver riempito il secchio di token.
Per poter tramettere un pacchetto (o una certa quantità
di byte), deve essere disponibile un token.
Se ci sono k token nel secchiello e h > k pacchetti da trasmettere,
i primi k sono trasmessi subito (al data rate consentito dalla
linea) e gli altri devono aspettare dei nuovi token.
Dunque, potenzialmente dei burst di M pacchetti possono essere
trasmessi in un colpo solo, fermo restando che mediamente non
si riesce a trasmettere ad una velocità più alta
di quella di generazione dei token.
Un'altra differenza col leaky bucket è che i pacchetti
non vengono mai scartati (il secchio contiene token, non pacchetti).
Se necessario, si avverte il livello superiore, produttore dei
dati, di fermarsi per un pò.
Questi due algoritmi possono essere usati per regolare il traffico
host-router e router-router; in quest'ultimo caso però,
se il router sorgente è costretto a fermarsi invece di
inviare dati e non ha spazio di buffer a sufficienza, questi possono
perdersi.
Flow specification
Il traffic shaping è molto efficace se tutti (sorgente,
subnet e destinazione) si accordano in merito.
Un modo di ottenere tale accordo consiste nello specificare:
Tale accordo si chiama flow specification
e consiste in una struttura dati che descrive le grandezze in
questione.
Sorgente, subnet e destinatario si accordano di conseguenza per la trasmissione.
Questo accordo viene preso prima di trasmettere, e può
essere fatto sia in subnet connesse (e allora si riferisce al
circuito virtuale) che in subnet non connesse (e allora si riferisce
alla sequenza di pacchetti che sarà trasmessa).
Controllo della congestione nelle reti basate su circuiti virtuali
In generale nelle reti connesse è più facile il
controllo della congestione, perché le risorse per una
connessione sono allocate in anticipo.
Quindi, per evitare la congestione è possibile negare l'attivazione
di nuovi circuiti virtuali ove non vi siano sufficienti risorse
per gestirli. Questa tecnica va sotto il nome di admission
control.
5.4.2) Choke packet |
In questo approccio, di tipo closed loop,
è previsto che un router tenga d'occhio il grado di utilizzo
delle sue linee di uscita. Il router misura, per ciascuna linea,
l'utilizzo istantaneo U e accumula, entro una media esponenziale
M, la storia passata:
dove
Quando, per una delle linee in uscita, M si avvicina a una soglia
di pericolo prefissata, il router esamina i pacchetti in ingresso
per vedere se sono destinati alla linea d'uscita che è
in allarme.
In caso affermativo, invia all'host di origine del pacchetto un
choke packet (to choke
significa soffocare) per avvertirlo di diminuire il flusso.
Quando l'host sorgente riceve il choke packet diminuisce il flusso
(tipicamente lo dimezza) e ignora i successivi choke packet per
un tempo prefissato, perché tipicamente ne arriveranno
molti in sequenza.
Trascorso tale tempo prefissato, l'host si rimette in attesa di
altri choke packet. Se ne arrivano altri, riduce ancora il flusso.
Altrimenti, aumenta di nuovo il flusso.
Hop-by-hop choke packet
L'unico problema della tecnica precedente è la lentezza
di reazione, perché l'host che produce i pacchetti ci mette
un certo tempo a ricevere i choke packet ed a diminuire di conseguenza
il ritmo della trasmissione. Per migliorare le cose si può
costringere ogni router sul percorso, appena riceve tali pacchetti,
a rallentare subito il ritmo. In tal caso si parla di hop-by-hop
choke packet.
Questa tecnica rende molto più veloce il sollievo del router
che ha per primo i problemi di congestione, ma richiede più
spazio di buffer nei router sul percorso dall'host originario
a quel router.
5.5) Internetworking |
Come sappiamo, esistono diverse architetture di rete, ciascuna caratterizzata dalle scelte effettuate in molti settori fra i quali ricordiamo:
Per connettere fra loro reti eterogenee si devono superare problemi non banali, tra i quali:
A causa di tali problemi, in generale (a meno che le architetture
di rete non siano molto simili) non si usa questo approccio generale,
ma altre tecniche più specifiche.
Tali tecniche sono basate sull'uso di particolari attrezzature, che operano a livelli diversi:
Reti di router multiprotocollo
Mediante ricorso a tali apparecchiature diventa possibile, per
esempio, impostare una internetwork costituita di reti eterogenee.
Ogni rete può comunicare con le altre reti a lei conformi
attraverso una porzione di rete costituita di router multiprotocollo.
Le reti OSI possono parlare fra loro, e così quelle IP.
Nella subnet costituita dai router multiprotocollo circolano pacchetti
di entrambe le architetture, che vengono instradati secondo le
regole di competenza dell'architettura di sui fanno parte.
Tunneling
Un' altra tecnica che risolve un problema analogo è il
tunneling, che si utilizza
per mettere in comunicazione due reti uguali per mezzo di una
rete diversa.
In questo caso la rete di tipo Y non è dotata di router
multiprotocollo. Invece, un router designato in ciascuna delle
due reti di tipo X è multiprotocollo e incapsula i pacchetti
delle reti di tipo X dentro pacchetti di tipo Y, consegnandoli
poi alla rete di tipo Y. Si noti che in questi pacchetti ci sono
due buste di livello network:
Frammentazione
Un diverso problema che talvolta si presenta è legato al
fatto che in generale è possibile che i pacchetti in arrivo
da una rete siano troppo grandi per transitare su un altra.
In questo caso è necessario che il livello network della
rete di origine (e di quella di destinazione) prevedano meccanismi
di spezzettamento del
pacchetto in frammenti
prima di consegnarli alla rete di transito, e di ricomposizione
dei frammenti appena essi giungono dalla rete di transito in quella
di destinazione (come vedremo, il protocollo IP è fornito
di questa funzionalità).
Circuiti virtuali concatenati
Se tutte le reti interessate offrono servizi connessi nel livello network, è possibile costruire un circuito virtuale che si estende attraverso più reti eterogenee come concatenazione di circuiti virtuali che attraversano ciascuno una delle reti. Ai confini fra ogni rete ci sono dei router multiprotocollo che:
Transport gateway
Un meccanismo simile è piuttosto diffuso a livello transport,
dato che esso offre servizi connessi in quasi tutte le architetture.
In tale ambito le apparecchiature interessate prendono il nome
di transport gateway.
Poiché i transport gateway operano a livello transport,
essi ricevono i dati dal livello application di partenza e li
consegnano al livello application di arrivo.
Application gateways
Un ultimo tipo di attrezzatura è costituito dagli application
gateway, che effettuano una conversione di dati
a livello application.
Ad esempio, per mandare da un host Internet un messaggio di posta elettronica a un utente OSI:
5.5.1) Internetwork routing |
In generale, in una internetwork le singole
reti componenti sono entità autonome e vengono chiamate
AS (Autonomous
System).
In questo caso, il routing complessivo è a due livelli: