Torna alla pagina di Sistemi per l'elaborazione delle informazioni
:: Sistemi per l'elaborazione delle informazioni ::
Lezione 22 Ottobre 2007
VLSM versus FLSM
I limiti del FLSM li abbiamo già visti tutti. In una configurazione con 4 sottoreti di 100, 8, 8 e 4 hosts ciascuna, una suddivisione FLSM è inefficiente. Devo dividere il classe C in 4 parti, ed ognuna conterrebbe al max 62 hosts, quindi la prima rete da 100 sarebbe esclusa, e notate che qui sto "contraddicendo" anche la vecchia norma che impedisce di usare net id tutti a 0 o tutti a 1. L'unica soluzione per rispettare sta norma è comprare 4 classe C diversi!
Ovviamente una simile cosa non s'ha da fare, e quindi ci si deve dedicare al VLSM. Il come ve lo lascio per esercizio. Cmq anche questa prospettiva nasconde un'ingenuità: perché mai un'azienda dovrebbe comprare un classe C per dare a TUTTE le sue macchine un indirizzo pubblico? La necessità di sta cosa in effetti sfugge, e infatti vedremo poi che si ovvierà a sta situazione.
Instradamento IP
I Gateway collegano reti diverse, e dobbiamo capire come fanno effettivamente a funzionare.
Instradamento diretto
L'instradamento diretto si ha quando l'indirizzo di destinazione sta nella mia stessa sottorete. Col giochetto delle maschere di sottorete, lo capisco subito, e mando il mio bel pacchetto in qualche frame ethernet, e voilà!
Instradamento indiretto
Se invece il mittente e il destinatario non si trovano sulla stessa rete, occorre mandare il pacchetto ad un router, il quale poi ci penserà lui a smistare dove deve. A me come mittente basta solamente l'indirizzo del router, al resto ci penserà lui. Negli esercizi c'è un esempio di come muta l'header di livello 2 e di livello 3 per un pacchetto che deve passare di rete in rete.
Il gateway ha 2 schede, una su una rete e una su di un'altra, ciascuna configurata correttamente secondo la rete in cui si trova. Per trasmettere i pacchetti da un'interfaccia all'altra, occorre abilitare una funzionalità dei router chiamata IP FORWARDING, che replica un pacchetto da una rete ad un'altra. Avendo solo due schede, è ovvio che ciò che non sta da una parte deve andare sull'altra...
Il Router invece ha più di 2 interfacce, quindi deve applicare una certa intelligenza per capire su quale delle molte interfacce forwardare un pacchetto. Dovrebbe sapere a quali router forwardare un certo pacchetto con un certo indirizzo per poterlo recapitare. Nel mondo della teoria, potrebbe essere lo stesso host da cui è partito il pacchetto a stabilire quali router attraversare. Non è improponibile, l'unico problema è un problema di sicurezza che non è stato ulteriormente specificato.
Il router ha una tabella di instradamento, e il sistema con cui instrada si chiama instradamento table-driven.
La tabella di instradamento
Ha 4 colonne:
- net_id della rete destinazione
- maschera di sottorete di ogni net id
- indirizzo IP del gateway associato a quel net id
- interfaccia di livello 2 a cui è associato quel net id
NOTA: i pacchetti con indirizzi 127.0.0.0 NON vengono mai inviati ad un'interfaccia di rete, ma vengono copiati dal buffer di uscita al buffer di ingresso. Non si affacciano mai sulla rete. 127.0.0.0 vuol dire localhost, e questo indirizzo è detto interfaccia di loopback.
Gli indirizzi 0.0.0.0 vogliono dire ogni cosa. E' una regola che mi dice: tutti i pacchetti vanno qui. Come faccio allora a farla coesistere con altre regole? Per esempio, potrei avere una regola che mi dice che i pacchetti con prefisso 130.120 devono andare all'interfaccia eth0, e poi avere una 0.0.0.0 che mi manda tutti i pacchetti su interfaccia eth1. Ha senso?
No. E infatti non funziona proprio così. Infatti, gli instradamenti degli 0.0.0.0 sono messi per ultimi nella tabella di routing, così che se tutte le altre alternative che ho visto prima non sono risultate valide, userò quel sistema.
Attenzione: le tabelle non vengono fatte a mano. O meglio, finché ho una rete di 3 computer posso anche permettermelo, ma appena la complessità sale un po' non se ne parla proprio. Ci sono sistemi per aggiornare le tabelle in modo dinamico.
Altre tecniche di instradamento
Se non so dove diavolo inviare il pacchetto, posso scegliere di adottare diverse strategie:
- RANDOM: lo invio ad un router a caso
- FLOODING: lo mando a tutti i router che conosco
- HOT POTATO: mando il pacchetto al router con la coda più corta.
Flooding non è un'idea stupida come potrebbe sembrare, soprattutto se ho una rete con tutti i gateway uno in sequenza all'altro: è efficiente come una tabella. Il flooding è tanto meno conveniente quanto più una rete è connessa, ovvero ci sono cammini relativamente brevi tra 2 reti diverse.
In caso di rete molto connessa, cioè con cammini brevi tra reti diverse, il sistema random può essere utile, perché tanto la connessione della rete fa sì che bene o male prima o poi il mio pacchetto arriverà dove deve.
Anche la hot potato funziona bene con reti molto connesse, perché sceglie il router con meno pacchetti in coda. Il tempo che si perde girando per la rete a caso lo si guadagna trascorrendo meno tempo nelle code, e in certe situazioni ci può essere un vantaggio.
Come scegliere tra le varie voci della tabella
Le comparo una a una? Mmm. Più o meno. In realtà, si prende quella voce che combina perfettamente con il destinatario del pacchetto che sto processando, ma non solo: deve anche essere quella che combina con il più alto numero di bit. Se una voce di tabella combina per 16 bit, e un'altra per 18, sceglierò di mandare il pacchetto alla rete che combina per 18 bit.
Certo, sta roba è costosa, e quindi ci sono tutti dei bravi algoritmi per ottimizzare la ricerca in tabelle lunghe, così da minimizzare il tempo di attesa che un pacchetto passa in un router.
Può essere una domanda da compito quella di stabilire, data una tabella di instradamento ed un indirizzo, a quali righe il router associerà quell'indirizzo, e quali tra quelle righe sarà la PRESCELTA.
L'instradamento modifica i pacchetti?
Sì. Innanzitutto cambiano gli indirizzi di livello 2 per ovvi motivi. Inoltre, se il mio router collega reti che hanno data link differenti, come possono esserlo una Ethernet e una SONET, allora dovrà anche cambiare il frame di livello 2, magari frammentarlo in altri modi e via dicendo. Quindi il pacchetto viene stranfognato, anche se la sostanza non deve cambiare.
Comunicazione tra router: ICMP
I router devono poter comunicare tra di loro e parlare agli host. Infatti devono scambiarsi messaggi del tipo "ho la coda piena", "mia mamma ha preparato la polenta", "sia dannato il computer di Jack che continua a guardare siti porno".
Per esempio, quando un pacchetto viene "droppato" da un router, ovvero viene cancellato per vari motivi, questa cancellazione deve essere notificata a chi ha inviato quel pacchetto.
Il protocollo che si occupa di questi messaggi si chiama ICMP. E' sempre parte di IP, ma è un header aggiuntivo che si aggiunge all'header di IP. E occhio: ICMP non manda messaggi che riguardano i pacchetti ICMP, altrimenti non finirebbe più. E' come se mandassi una lettera con ricevuta di ritorno, e la ricevuta di ritorno necessitasse di una ricevuta di ricevuta di ritorno, la quale poi solleciterà una ricevuta di ricevuta di ricevuta di ritorno e così via.
Per stabilire che un header IP è seguito da un header ICMP, lo si vede da un paio di campi dell'header: il campo PROTOCOL sarà messo a 1, e quello TOS a 0.
I pacchetti ICMP, che si scopre essere tali proprio per via della scoperta di questi campi, a volte vengono trattati in modo riguardoso dai router: gli fanno scavalcare le code, come l'ambulanza che passa coi semafori rossi (esempio di Damiani, non mio. Io avrei detto: come Stefano da Alfredo, scavalca la coda).
I pacchetti ICMP vengono scambiati tra router e router, tra router e host e tra host e host. Un esempio di messaggio ICMP tra host e host è l'echo, ovvero io rifletto quello che un altro mi manda. Utilità? Boh. E' spiegato nella famosa RFC 445.23u/34 bis comma ter /&$&"/19 che Postel scrisse in un momento di sconforto.
Nota: se un pacchetto frammentato viene droppato per qualche motivo, non si manda un ICMP di notifica per ogni frammento, ma solo per il primo.
Un tipo di messaggio ICMP che può arrivare da un router all'altro è quello di redirect: un router comunica di inviare pacchetti non a lui, ma a qualcun altro. Per esempio, posso instradare i pacchetti pari ad un router e quelli dispari ad un altro router. In questo modo faccio un load balancing, cioè bilancio il carico tra macchine diverse. E notate che questo bilanciamento non deve essere reso noto a me, povero host che invio pacchetti al mio gateway di default. Ci pensano loro a sistemarsi, io invio le cose come ho sempre fatto e non ci penso.
Altri messaggi che i router si scambiano sono quelli per aggiornare le tabelle di instradamento.
PING
Il ping è un modo per verificare la raggiungibilità di un host. Viene mandato un certo messaggio ICMP ad un IP, e quello risponderà. In questo modo posso rendermi conto di quanto tempo deve passare prima che un pacchetto inviato da me arrivi ad un altro host, e soprattutto se l'altro host è in linea, ovvero se risponde ai miei ping!
Una nota: siccome ping usa ICMP, è probabile che ci siano router che fanno saltare la coda ai pacchetti ICMP, e quindi il tempo che mi dà sarà inferiore al tempo effettivo che un normale pacchetto TCP potrebbe metterci ad arrivare a quell'host. Girata in vari modi, questa è domanda da esame.
Tracert, o Traceroute
Il comando tracert mi stampa la lista dei vari router che il mio pacchetto attraversa per arrivare ad una certa destinazione. Come fa?
Si basa su una proprietà del ping. Il pacchetto ICMP che fa da ping ha una proprietà chiamata TTL. Ogni volta che un router forwarda un pacchetto ping, sottrae 1 a TTL. Quando TTL arriva a 0, il pacchetto ping viene droppato.
Ecco quindi che se faccio vari ping in sequenza verso un certo IP, ognuno con TTL crescente a partire da 1, il primo sarà droppato dal primo router, il secondo dal secondo router, il terzo dal terzo router e così via e avrò la lista di tutti i router che si frappongono tra il mio computer e www.xxxjack.com.
(CONTINUA)
Torna alla pagina di Sistemi per l'elaborazione delle informazioni