TCP/IP: introduzione al networking

Abbiamo visto un po di settimane fa, come funzionano i protocolli dello stack TCP/IP. Abbiamo visto che cosa sia un indirizzo IP, e abbiamo dato una sbirciata a come dialoghino le macchine tra di loro, sfruttando il TCP, mentre spiegavamo del baco recentemente riaperto in questo protocollo fondamentale.

Abbiamo anche visto come tante macchine, connesse alla stessa rete, sono in grado di dialogare tra di loro, scambiandosi pacchetti tramite l’uso di una macchina in comune, che funge da nodo centrale della rete che abbiamo preso in considerazione (puo essere un hub, uno switch o un router, poco importa).

Ora prendiamo in considerazione la domanda seguente: “Come possono dialogare macchine che risiedono su reti fisiche differenti?”, e cerchiamo di dargli una risposta.

Per prima cosa, per far dialogare insieme macchine su reti differenti, bisognerà che queste due reti siano connesse in qualche modo, fisicamente. La necessità di collegare tra di loro reti anche molto diverse (ad esempio, una rete ethernet, una wireless e una token-ring), ha dato origine all’Internetworking. Le connessioni tra le varie reti si creano allacciando tra di loro tra loro macchine che appartengono alle singole reti che vogliamo connettere. Si creerà in questo modo una rete piu grande, e le varie reti piccoline che abbiamo connesso, si potranno chiamare “sotto-reti”, in quanto sottogruppi di una rete piu grande.

I punti di connessione tra le varie sottoreti, sono chiamati “gateway”, o “router” e sono delle macchine che hanno il compito (spesso non solo questo) di gestire i pacchetti dalla rete interna verso l’esterno, e viceversa. Dovranno quindi essere in grado di colloquiare sia con le macchine della propria rete, sia con i router delle altre sotto-reti che si vogliono collegare. E’ molto importante notare come gli HUB operino a livello fisico, o livello 1 (i singoli bit ricevuti su un’interfaccia vengono ritrasmessi su tutte le interfacce, gli SWITCH operano a livello 2 (mac address), e distinguono quindi a quale delle reti collegate alle proprie interfacce instradare il pacchetto ricevuto, e ancora i router lavorano a livello 3, reimplementando completamente i livelli sottostanti in base al solo indirizzo IP di destinazione. Con un router possiamo quindi connettere tra di loro reti completamente differenti tra loro, quali una rete ethernet e una rete wireless. Proviamo a riassumere la cosa con uno schemino:

   SOTTO-RETE 1                                    SOTTO-RETE 2

    [NodoA]---------+                                       +---------[NodoE]
                    |                                       |
                    [NodoB]---------------------------[NodoD]---------[NodoG]
                    |                                       |
    [NodoC]---------+                                       +---------[NodoF]

Nell’esempio che abbiamo sotto gli occhi, possiamo vedere una rete. Questa è formata da due sottoreti, la 1 e la 2. La sottorete 1 è composta da tre macchine: A, B e C. A e C sono client comuni, mentre B funge da gateway per la sottorete 2, che è composta da quattro macchine, D, E, F e G. D è il router di questa sottorete, in quanto connette piu reti, mentre E, G ed F sono macchine client comuni. Questa rete ci accompagnerà lungo tutto l’articolo, quindi stampatevela bene in mente 😉

Possiamo facimente immaginare, da quello che abbiamo visto finora, come i vari router, ed i loro collegamenti, costituiscano di per se una rete, che avrà quindi degli indirizzi IP assegnati. Ogni router avrà quindi due o piu interfacce, ad ognuna delle quali verrà assegnato un indirizzo IP univoco.

Iniziamo allora ad assegnare qualche indirizzo alle macchine (che d’ora in poi chiameremo con il loro nome corretto, ovvero HOST) delle due sottoreti. Prima di cominciare facciamo un breve ripasso su cos’è IP:

IP (o Internet Protocol) è quell’insieme di regole e convenzioni (un protocollo, per l’appunto) che consentono ai nostri pc di indirizzare i pacchetti alle macchine corrette. Ogni macchina connessa ad una rete (qualunque essa sia) che voglia trasmettere o ricevere dati, deve necessariamente avere un indirizzo IP, che la identifica univocamente all’interno della rete stessa. Un indirizzo IP è formato da 32 bit (un bit, è un 1 o uno 0), che vengono di solito raggruppati in 4 gruppi da 8 bit, e trasformati dalla forma binaria a quella decimale, per facilitarne la memorizzazione, ottenendo cosi un valore simile a “81.230.15.144”. Essendo ognuno degli ottetti un numero binario di 8bit, ogni campo dell’indirizzo in formato decimale non potrà avere un valore non compreso tra 0 e 255 (2^8=256, appunto i valori tra 0 e 255).
L’indirizzo viene poi comunemente suddiviso in due parti: la cosi detta Net-ID (indirizzo di rete) e la Host-ID (indirizzo di host). Questo per permettere una piu chiara visualizzazione delle reti: tutti gli host appartenenti alla stessa rete, avranno la stessa Net-ID.
Il processo di divisione tra host-id e net-id segue regole ben precise, che si chiamano “classi”: a seconda di quanti ottetti occupa il campo net-id, suddivideremo tutti gli indirizzi IP disponibili, in 5 classi:

* Classe A: comprende tutti gli indirizzi tra 0.0.0.0 e 127.255.255.255. La parte Net-ID occupa il primo ottetto, mentre la parte Host-ID i restanti 3. Le reti ottenute da questa classe sono poche (solo 127) la davvero gigantesche.
* Classe B: comprende tutti gli indirizzi tra 128.0.0.0 e 191.255.255.255. La parte Net-ID occupa i primi due ottetti, e la parte Host-ID gli altri due. Le reti ottenute da questa classe sono piu numerose, ma piu piccole di quelle di classe A.
* Classe C: comprende tutti gli indirizzi tra 192.0.0.0 e 223.255.255.255. Sono le reti piu piccole: la net-id è di 3 ottetti, mentre l’ultimo ottetto è occupato dall’host-id.
* Classe D: il multicast. Questa classe, che comprende gli indirizzi da 224.0.0.0 a 239.255.255.255, è riservata al multicast. La divisione tra host-id e net-id non c’è piu. Non tratteremo questa classe in questo articolo.
* Classe E: riservata per usi futuri. Questa ultima classe, che occupa la fascia di indirizzi tra 240.0.0.0 e 255.255.255.255, è stata lasciata inutilizzata prevedendo un suo utilizzo in futuro.

Alcune serie di indirizzi, appartenenti a ciascuna di queste classi, sono stati inoltre riservati per l’utilizzo nelle sottoreti provate. Queste serie di indirizzi sono la 10.0.0.08 (vedremo piu tardi cosa significa il 8 in coda), la 172.16.0.012 e la 192.168.0.016, nonchè la serie 127.0.0.08, che indirizza le interfaccia di loopback.
Questa suddivisione in classi, è ormai in disuso proprio grazie all’introduzione massiccia delle netmask di cui parliamo oggi.

Gli indirizzi ip che hanno la Host-ID contenenti soli “1”, sono gli indirizzi di broadcast. Un pacchetto inviato ad un indirizzo di broadcast viene ricevuto da tutti gli host connessi a quella rete. L’indirizzo di broadcast limitato (quello cioè che si riferisce a tutti gli host appartenenti alla sola sottorete su cui risiede il mittente del pacchetto) è 255.255.255.255. Un pacchetto inviato a questo indirizzo raggiungerà tutti gli host della rete fisica su cui risiede il mittente, ma non attraverserà nessun router. Per di piu, un indirizzo con la net-id composta di soli “0”, indica che il destinatario risiede sulla stessa rete fisica del mittente (se anche il campo host-id è composto da soli “0”, quindi 0.0.0.0, il pacchetto ha come desinatario il mittente stesso del pacchetto. Si usa quando la macchina non conosce il proprio indirizzo IP).
Gli indirizzi invece con Host-ID contenente soli “0”, sono indirizzi di rete (abbiate pazienza e vedremo anche questo).
Tutte queste eccezioni vanno al di la della mera spiegazione delle netmask che questo articolo si prefigge. Chi fosse interessato a saperne di piu, puo trovare informazioni molto dettagliate con una semplice ricerca su http://www.google.it.

E’ una buona consuetudine usare alcuni accorgimenti per facilitare il riconoscimento del tipo di macchina avendo il solo indirizzo IP. Questi accorgimenti sono assolutamente liberi. Possiamo ad esempio decidere di assegnare la serie 198.162.0.1-254 ai router, la serie 198.162.1.1-254 alle stampanti di rete, la serie 198.168.2.1-254 ai firewall, e cosi via (questo esempio non è per nulla ottimizzato, ma dovrebbe rendere l’idea. Torneremo sull’argomento piu avanti. Nel nostro esempio, ad ogni modo, abbiamo scelto di dividere gli indirizzi in due reti: 192.168.0.0 e 192.168.1.0, ed assegnare ai router il primo indirizzo di ognuna di queste due reti).

Cominciamo allora ad assegnare qualche indirizzo agli host del nostro esempio. Cominciamo con i due router.

+-------+---------------+
| Host  | Indirizzo IP  |
+-------+---------------+
| NodoB | 192.168.0.1   |
| NodoD | 192.168.1.1   |
+-------+---------------+

Procediamo poi assegnando indirizzi alle macchine host della sotto-rete 1:

+-------+---------------+
| Host  | Indirizzo IP  |
+-------+---------------+
| NodoA | 192.168.0.2   |
| NodoC | 192.168.0.3   |
+-------+---------------+

e a quelle della sotto-rete 2:

+-------+---------------+
| Host  | Indirizzo IP  |
+-------+---------------+
| NodoE	| 192.168.1.2   |
| NodoG	| 192.168.1.3   |
| NodoF | 192.168.1.4   |
+-------+---------------+

In questo momento, avendo un singolo indirizzo, possiamo facilmente intuire (noi netadmin coscenti) a quale rete appartenga una macchina, e quale sia la sua funzione. Se ad esempio inserissimo un’altra rete, e vi dicessi che ho assegnato ad una macchina l’indirizzo 192.168.2.1, sapreste dirmi se si tratta di un router o di un host? E il 192.168.2.9? Bravi, avete capito 🙂

Ora cominciamo ad introdurre il concetto di netmask (finalmente eh?). Come abbiamo visto qualche riga fa, la serie di indirizzi IP disponibili con i 32 bit di lunghezza dell’indirizzo, sono divise in 5 classi. Gli indirizzi di ciascuna delle tre classi che si possono utilizzare per il classico indirizzamento (non contiamo le multicast), hanno, come potete notare, grandi somiglianze tra di loro. Prendiamo ad esempio due indirizzi dalla classe B:

* 166.131.0.0
* 129.244.0.0

e prendiamone due dalla classe C:

* 200.168.232.0
* 191.175.123.0

Osserviamo ora le differenze tra gli indirizzi di classi diverse, e le somiglianze tra gli indirizzi della stessa classe. Gli indirizzi di reti di classe B hanno gli ultimi due ottetti (host-id? :)) uguali a “0”, mentre quelli di classe C hanno uguale a “0” solo l’ultimo ottetto (si, proprio l’host-id :P). Introduciamo quindi un valore che ci permetta di differenziare la classe di appartenenza: la netmask. Definiamo la netmask come un insieme di bit (sempre i nostri mitici 1 e 0) che indicano quali campi sono occupati dalla net-id, e quali invece dalla host-id; in particolare imposteremo a 1 la parte della net-id ed a 0 quella della host-id. Per chiarezza, traformiamo il nostro indirizzo 166.131.0.0 in binario. Mettiamo poi un 1 per ogni bit facente parte della net-id ad 1, e ogni bit della host-id a 0:

10100110.10000011.00000000.00000000
11111111.11111111.00000000.00000000

La sua netmark, varrà quindi in formato decimale 255.255.0.0. Che ci indica per l’appunto che i due primi ottetti sono occupati dalla net-id, e gli altri due dalla host-id.
Lo stesso discorso si farà con gli indirizzi di classe A (netmark 255.0.0.0), e di classe C (netmask 255.255.255.0)

Procediamo a passettini. Inseriamo le nostre netmask nel piano di indirizzamento che abbiamo fatto prima, e generalizziamo il tutto in un’unica tabella:

+-------+---------------+---------------+
| Host  | Indirizzo IP  | Netmask       |
+-------+---------------+---------------+
| NodoA | 192.168.0.2   | 255.255.255.0 |
| NodoB | 192.168.0.1   | 255.255.255.0 |
| NodoC | 192.168.0.3   | 255.255.255.0 |
| NodoD | 192.168.1.1   | 255.255.255.0 |
| NodoE	| 192.168.1.2   | 255.255.255.0 |
| NodoG	| 192.168.1.3   | 255.255.255.0 |
| NodoF | 192.168.1.4   | 255.255.255.0 |
+-------+---------------+---------------+

Osserviamo le reti cosi create: la sottorete 1 sarà caratterizzata dall’indirizzo 192.168.0.0 e netmask 255.255.255.0. Solo l’ultimo ottetto sarà quindi disponibile per gli host di questa rete, che saranno infatti 192.168.0.1,192.168.0.2,192.168.0.3, e cosi via. L’indirizzo di boroadcast della sottorete è naturalmente 192.168.0.255.
La seconda sottorete, allo stesso modo, avrà indirizzo 192.168.1.0 e netmask 255.255.255.0.

Facciamo ora un altro passettino in avanti: per rendere piu facile la notazione delle netmask, integriamo la loro dicitura all’interno dell’indirizzo ip, introducento il prefisso. Prendiamo ad esempio la netmask 255.255.0.0. Quanti 1 contiene? 16. Scriveremo allora in fondo all’indirizzo, un bel 16. Un esempio concreto? Riprendiamo la nostra sottorete 1: la sua netmask vale 255.255.255.0, che comprende 24 “1”. Il suo indirizzo sarà allora nulla piu che 192.168.0.024. Allo stesso modo, la sottorete 2 sarà 192.168.1.024.

Ennesimo passettino, questo un po piu grande di quelli precedenti. Partiamo dalla domanda: “Quanti host ha la nostra rete?”. Contiamoli, sono 7. Quanti indirizzi ci servono, quindi? Ovviamente 7, perchè utilizzarne piu di quanto necessario… eppure con la nostra suddivisione in reti abbiamo “requisito” ben 508 indirizzi! Non è molto efficente come scelta… certo utilizzando indirizzi destinati alle reti private ce lo possiamo ampiamente permettere, ma se dovessimo creare una rete con indirizzi pubblici? Con la scarsità (e il costo) degli indirizzi pubblici, direi che è meglio cercare un’ottimizzazione. Come fare? Semplice, mandiamo in pensione le classi, e teniamoci le nostre meravigliose netmasks. Rivelazione? Bene, già che siamo in vena di rivelazioni, vi faccio notare che lungo tutto l’articolo, per comodità, abbiamo presupposto di avere due sole reti. ma guardate bene: la linea che congiunge i due router non è forse anche quella una rete? Non ci sono forse due interfaccie? Sfatiamo il mito che ogni host ha un suo indirizzo IP, correggiamoci, e diciamo le cose come stanno: un indirizzo IP rappresenta una interfaccia di rete, e non un host. Il fatto che le nostre macchine di casa abbiano comunemente una sola interfaccia, non significa che tutte le macchine siano cosi. Lo dimostrano i router del nostro esempio, che hanno certamente ALMENO due interfaccie, e ognuna delle due avrà bisogno di un indirizzo. Dobbiamo quindi trovare il modo di indirizzare tre reti con il minor numero di indirizzi possibile (in nome della legge del dio denaro…).

Torniamo a osservare il nostro esempio: abbiamo 7 macchine e 3 reti, e a disposizione una bellissima 192.168.0.016. la prima rete, ha 3 host. La seconda, ne ha 4, la terza (quella dei due router) solo 2. Creiamo ora una netmask per ognuna di queste reti, cercando di minimizzare il numero di “0” (ovvero di host disponibili) alle nostre necessità.

Nel caso della rete 1, abbiamo bisogno di 3 indirizzi. Quanti bit servono per indirizzare 3 host? risposta: 3, infatti dovremo escludere i bit 00 e 11 (rete e broadcast) e quindi da due bit potremmo ricavare solo 01 e 10, che non ci bastano. Usiamo quindi 3 bit, 000 (rete), 001, 010, 011 (i tre host) e 111 (broadcast). Dai 32 bit, useremo quindi gli ultimi 3 (32-3=29), ottenendo cosi che la nostra prima rete avrà indirizzo 192.168.0.029, che comprenderà tutti gli indirizzi tra 192.168.0.0 e 192.168.0.7 (che saranno rispettivamente l’indirizzo di rete e il broadcast). Passiamo ora ad analizzare la seconda rete: 4 host, piu rete e broadcast, sono 6 indirizzi. Quanti bit? Sempre 3: infatti 2^2 fa 4 e non ci bastano, 2^3 fa 8, piu che sufficienti. L’indirizzo della seconda rete sarà quindi: 192.168.0.829. Il suo indirizzo di rete sarà 192.168.0.8, e il suo broadcast 192.168.0.15. Terminiamo quindi con la terza rete: 2 host, piu rete e broadcast, sono 4 indirizzi: 2^2=4, bastano 2 bit. Indirizzo di rete sarà quindi 192.168.0.1630. A voi il piacere di trovare il suo indirizzo di broadcast 🙂

Con questa ottimizzazione, abbiamo lasciato liberi tutti gli indirizzi della 192.168.0.1724, che non mi sembra proprio un brutto risultato 🙂

Il passo successivo a questo nostro discorso sulle broadcast, è senza dubbio l’instradamento e le tabelle di routing, ovvero come fanno i router a capire a quale rete è destinato un pacchetto, e su quale interfaccia instradarlo, ma questo è un argomento da trattare con la testa rilassata, e quindi ci concediamo una pausa. Happy hacking 🙂

Annunci

3 pensieri su “TCP/IP: introduzione al networking

  1. mauro

    Complimenti per l’ottima speigazione fornita … Finalmente una descrizione semplice e comprensibile anche per i non addetti , che schiarisce e fa comprendere le non sempre evidenti motivazioni della tecnica utilizzata nelle reti . Grazie !

    NB. Spero di poter ritrovare qualche spiegazione simile sulle tecniche da utilizzare per le configurazioni wifi tra due router ….

    Rispondi
  2. alt-os Autore articolo

    Grazie per i complimenti 🙂
    Al momento non c’è una spiegazione sulle tecniche per configurare tra loro router wifi, ma anche perché non ho capito in che senso vorresti configurarli, per fare da “ponte radio”?

    Rispondi
  3. gianni

    ottimo articolo, ho capito tutto anche io…………spiegare è un’arte.
    Ho notato che a “parte” le immersioni seguiamo gli stessi interessi, sopratutto le moto..!

    Rispondi

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google photo

Stai commentando usando il tuo account Google. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...