La funzionalità più importante di un sistema Unix è la possibilità di comunicare attraverso la rete. Linux, offrendo tutte le caratteristiche di un sistema Unix ben dotato, è una ottima risposta ai problemi legati alla gestione di una rete.
La gestione della comunicazione in una rete è un problema complesso, e in passato, questo è stato alla base delle maggiori incompatibilità tra i vari sistemi, a cominciare dalle differenze legate all'hardware.
Il modello ISO scompone la gestione della rete in livelli, o strati (layer), in modo da suddividere le ``competenze'' e così permettere una standardizzazione nelle comunicazioni, indipendentemente dall'hardware utilizzato. Questi sono schematizzati nella tabella (seguente).
Perché si possa avere una connessione con altri computer, è necessario inizialmente un supporto fisico, solitamente composto da un cavo e da interfaccie di comunicazione. La connessione tipica in una rete locale è fatta utilizzando hardware Ethernet. Il cavo o i cavi e le schede Ethernet appartengono a questo primo livello.
Il tipo di hardware utilizzato nel primo livello determina il modo in cui avviene effettivamente la comunicazione. Nel caso dell'hardware Ethernet, ogni scheda ha un proprio indirizzo univoco (stabilito dal fabbricante) composto da 48 bit e solitamente rappresentato in forma esadecimale, come nell'esempio seguente.
07:01:2a:e5:23:4f
Il trasferimento dei dati, visto dal punto di vista di questo livello, avviene a blocchi definiti ``pacchetti''.
Per poter avere un tipo di comunicazione indipendente dal supporto fisico utilizzato, è necessaria una astrazione che riguarda il modo di inviare blocchi di dati e l'indirizzamento di questi. Questo è quindi il livello del protocollo IP, attraverso il quale vengono definiti gli indirizzi. I pacchetti che vengono utilizzati a questo livello si chiamano datagram.
Quando un datagram è più grande della dimensione massima di un pacchetto trasmissibile in quel tipo di rete fisica utilizzata, è il protocollo IP che si deve prendere cura di scomporre il datagram in segmenti più piccoli e di ricombinarli correttamente alla destinazione.
A questo livello appartengono i protocolli di comunicazione che si occupano di suddividere i dati da inviare in datagram e di ricomporli all'arrivo. I protocolli principali di questo livello sono TCP (Transmission Control Protocol) e UDP (User Datagram Protocol).
Il protocollo TCP, oltre alla scomposizione e ricomposizione dei dati, si occupa di verificare e riordinare i dati all'arrivo: i datagram perduti o errati vengono ritrasmessi e i dati finali vengono ricomposti. Il protocollo UDP, invece, non esegue alcun controllo.
A questo livello si introduce, a fianco dell'indirizzo IP, il numero di porta. Il percorso di un datagram ha un'origine identificata dal numero IP e dalla porta e una destinazione identificata da un altro numero IP e dalla porta. Le porte identificano dei servizi concessi o richiesti e la gestione di questi riguarda il livello successivo.
Ogni servizio di rete (condivisione del filesystem, posta, FTP, ...) ha un proprio protocollo, porte di servizio e un meccanismo di trasporto (quelli definiti nel livello precedente). Ogni sistema può stabilire le proprie regole, anche se in generale è opportuno che i computer che intendono comunicare utilizzino le stesse porte e gli stessi tipi di trasporto. Questi elementi sono stabiliti dal file /etc/services. Segue un breve estratto di esempio.
ftp 21/tcp
telnet 23/tcp
smtp 25/tcp
finger 79/tcp
pop-3 110/tcp
Per esempio, il protocollo ftp utilizza la porta 21 per comunicare, e il protocollo di trasporto utilizzato è TCP.
Quando si avvia una comunicazione, a questo livello si parla di sessione. Quindi, si apre o si chiude una sessione.
I dati che vengono inviati utilizzando le sessioni del livello inferiore, devono essere uniformi, indipendentemente dalle caratteristiche fisiche delle macchine che li elaborano. A questo livello si inseriscono normalmente delle librerie in grado di gestire una eventuale conversione dei dati tra l'applicazione e la sessione di comunicazione.
L'ultimo livello è quello dell'applicazione che utilizza le risorse di rete. Con la suddivisione delle competenze in così tanti livelli, l'applicazione non ha la necessità di occuparsi della comunicazione, e così anche l'utente, in molti casi, può anche non rendersi conto della presenza di questa.
Come è stato visto nelle sezioni precedenti, al di sopra dei primi due livelli strettamente fisici di comunicazione, si inserisce la rete dal punto di vista di Unix: un insieme di ``scatole'' identificate da un indirizzo IP.
Esistono almeno due versioni di questi tipi di indirizzo: IPv4 e IPv6. Il primo è quello ancora ufficialmente in uso, ma a causa del rapido esaurimento degli indirizzi disponibili nella comunità Internet, sta per essere introdotto il secondo.
Gli indirizzi IP versione 4, cioè quelli attualmente ancora in uso, sono composti da una sequenza di 32 bit convenzionalmente suddivisi in quattro gruppetti di 8 bit e rappresentati in modo decimale separati da un punto. Questo tipo di rappresentazione è definito come: ``notazione decimale puntata''.
Per esempio, 00000001.00000010.00000011.00000100 corrisponde al codice 1.2.3.4
All'interno di un indirizzo del genere si distinguono due parti: l'indirizzo di rete e l'indirizzo del computer host particolare. Il meccanismo è simile a quello del numero telefonico, in cui la prima parte del numero, il prefisso, definisce la zona, ovvero il distretto telefonico, mentre il resto identifica l'apparecchio telefonico specifico di quella zona. In pratica, quando viene richiesto un indirizzo IP, si ottiene un indirizzo di rete in funzione della quantità di computer host che si devono connettere. In questo indirizzo, una certa quantità di bit nella parte finale sono azzerati, e questo significa che quella parte finale può essere utilizzata per gli indirizzi specifici dei computer host. Per esempio, l'indirizzo di rete potrebbe essere:
00000001.00000010.00000011.00000000
e in tal caso, si potrebbero utilizzare gli ultimi 8 bit per gli indirizzi dei vari computer host.
L'indirizzo di rete, non può identificare un host, quindi nell'esempio, l'indirizzo
00000001.00000010.00000011.00000000
non può essere usato per identificare anche un computer host. Inoltre, un indirizzo in cui i bit finali lasciati per identificare gli host siano tutti a uno,
00000001.00000010.00000011.11111111
identifica un indirizzo broadcast, cioè un indirizzo per la trasmissione a tutti gli host di quella rete. Di conseguenza, un indirizzo broadcast non può essere utilizzato per identificare un computer host.
Naturalmente, i bit che seguono l'indirizzo di rete possono anche essere utilizzati per suddividere la rete in sottoreti. Nel caso di prima, si potrebbero per esempio voler creare due sottoreti utilizzando i primi due bit che seguono l'indirizzo di rete originario:
Indirizzo di rete.
Indirizzo della prima sottorete.
Indirizzo della seconda sottorete.
Indirizzo broadcast.
Il meccanismo utilizzato per distinguere la parte
dell'indirizzo che identifica la rete è quello
della maschera di rete o netmask.
La maschera di rete è un indirizzo che viene
abbinato all'indirizzo da analizzare con l'operatore
booleano
11111111.11111111.11111111.00000000
Cosa che coincide al ben più noto codice seguente.
255.255.255.0
Utilizzando l'esempio visto in precedenza, abbinando questa maschera di rete si ottiene l'indirizzo di rete:
00000001.00000010.00000011.00000100 host (1.2.3.4)
11111111.11111111.11111111.00000000 netmask (255.255.255.0)
00000001.00000010.00000011.00000000 indirizzo di rete (1.2.3.0).
Gli indirizzi IP sono stati classificati in cinque gruppi, a partire dalla lettera A fino alla lettera F.
Gli indirizzi di classe A hanno il primo bit a zero, utilizzano i sette bit successivi per identificare l'indirizzo di rete e lasciano i restanti 24 bit per identificare gli host.
0rrrrrrr.hhhhhhhh.hhhhhhhh.hhhhhhhh
All'interno di questa classe si possono usare indirizzi che vanno da:
00000001.________.________.________
a
01111110.________.________.________.
In pratica, appartengono a questa classe gli indirizzi compresi tra 1.___.___.___ e 126.___.___.___.
Gli indirizzi di classe B hanno il primo bit a uno e il secondo a zero, utilizzano i 14 bit successivi per identificare l'indirizzo di rete e lasciano i restanti 16 bit per identificare gli host.
10rrrrrr.rrrrrrrr.hhhhhhhh.hhhhhhhh
All'interno di questa classe si possono usare indirizzi che vanno da:
10000000.00000001.________.________
a
01111111.11111110.________.________.
In pratica, appartengono a questa classe gli indirizzi compresi tra 128.1.___.___ e 191.254.___.___.
Gli indirizzi di classe C hanno i primi due bit a uno e il terzo a zero, utilizzano i 21 bit successivi per identificare l'indirizzo di rete e lasciano i restanti 8 bit per identificare gli host.
110rrrrr.rrrrrrrr.rrrrrrrr.hhhhhhhh
All'interno di questa classe si possono usare indirizzi che vanno da:
11000000.00000000.00000000.________
a
11011111.11111111.11111110.________.
In pratica, appartengono a questa classe gli indirizzi compresi tra 192.0.1.___ e 223.255.254.___.
Gli indirizzi di classe D hanno i primi tre bit a uno e il quarto a zero. Si tratta di una classe destinata ad usi speciali.
1110____.________.________.________
Gli indirizzi di classe E hanno i primi quattro bit a uno e il quinto a zero. Si tratta di una classe destinata ad usi speciali.
11110___.________.________.________
Un indirizzo broadcast si distingue per avere la parte finale (più o meno lunga) di bit a uno.
Un indirizzo broadcast identifica tutte le reti, sottoreti e host di quel segmento.
Per esempio, l'indirizzo:
00000001.00000010.11111111.11111111
rappresenta simultaneamente tutti gli indirizzi che iniziano con 00000001.00000010.
L'indirizzo che si ottiene abbinando l'indirizzo di
un host e la sua maschera di rete invertita
con l'operatore
00000001.00000010.00000011.00000100 host (1.2.3.4)
00000000.00000000.00000000.11111111 netmask invertita (0.0.0.255)
00000000.00000000.00000000.00000100 indirizzo relativo (0.0.0.4).
Dalla classe A è stato escluso l'indirizzo 127.0.0.0 che identifica una rete immaginaria interna al computer stesso. All'interno di questa rete si trova normalmente una interfaccia di rete immaginaria connessa su questa rete: 127.0.0.1.
Per identificare questi indirizzi si parla di loopback.
All'interno di ogni computer, quindi, questo indirizzo corrisponde a se stesso. Serve in particolare per non disturbare la rete quando un programma (che usa la rete) deve fare riferimento a se stesso.
Default route è il percorso, o la strada, predefinita per l'instradamento dei pacchetti. Il termine defaultroute fa automaticamente riferimento a questo indirizzo particolare.
Se non si ha la necessità di rendere accessibili i computer della propria rete locale alla rete globale Internet, si possono utilizzare alcuni gruppi di indirizzi che sono stati riservati a questo scopo e che non corrispondono a nessun host raggiungibile attraverso Internet.
Nella classe A è stato riservato l'intervallo da
00001010.00000000.00000000.00000000 = 10.0.0.0
a
00001010.11111111.11111111.11111111 = 10.255.255.255.
Nella classe B è stato riservato l'intervallo da
10101100.00010000.00000000.00000000 = 172.16.0.0
a
10101100.00010000.11111111.11111111 = 172.31.255.255.
Nella classe C è stato riservato l'intervallo da
11000000.10101000.00000000.00000000 = 192.168.0.0
a
11000000.10101000.11111111.11111111 = 192.168.255.255.
Quando si scompone la propria rete locale in sottoreti, di solito lo si fa per non intasarla. Infatti è probabile che si possano raggruppare i computer in base alle attività che essi condividono. Le sottoreti possono essere immaginate come raggruppamenti di computer separati che di tanto in tanto hanno la necessità di accedere a computer situati al di fuori del loro gruppo. Per collegare due sottoreti occorre un computer con due schede di rete, ognuno connesso con una delle due reti, configurato in modo da lasciare passare i pacchetti destinati all'altra rete. Questo computer è un router, chiamato abitualmente gateway, e in pratica svolge l'attività di instradamento dei pacchetti.
La gestione diretta degli indirizzi IP è piuttosto faticosa dal punto di vista umano. Per questo motivo si preferisce associare un nome agli indirizzi numerici. Il sistema attualmente utilizzato è il DNS (Domain Name System), ovvero il sistema dei nomi di dominio. Gli indirizzi della rete Internet sono organizzati ad albero in domini, sottodomini (altri sottodomini...), fino ad arrivare a identificare il computer host desiderato.
dominio root
|
|-com... (dominio com)
|-edu... (dominio edu)
|-org... (dominio org)
|-net... (dominio net)
|-it (dominio it)
| |-beta (dominio beta.it)
| | |-alfa (dominio alfa.beta.it)
| | | |-dani (host dani.alfa.beta.it)
: : : :
Non esiste una regola per stabilire quante debbano essere le suddivisioni, di conseguenza, di fronte a un nome del genere, non si può sapere a priori se si tratta di un indirizzo finale, riferito a un computer, o a un dominio.
Spesso, all'interno della propria rete locale, è possibile identificare un computer attraverso il solo nome senza il dominio di appartenenza. Per esempio, se la rete in cui si opera corrisponde al dominio zigozago.dg, il computer pippo verrà inteso essere pippo.zigozago.dg. Quando un nome di dominio contiene tutti gli elementi necessari a identificare un computer, si parla di FQDN o Fully Qualified Domain Name, quindi, pippo.zigozago.dg dell'esempio precedente è un FQDN.
In un sistema di nomi di dominio (DNS), il problema più grande è quello di organizzare i così detti name server o DNS server. Si tratta di computer che si occupano di risolvere, ovvero trasformare, gli indirizzi mnemonici dei nomi di dominio in indirizzi numerici IP. A livello di dominio root, si trovano alcuni server che si occupano di fornire gli indirizzi per raggiungere i domini successivi, cioè com, edu, org, net, it, ... A livello di questi domini ci saranno alcuni server (ogni dominio ha i suoi) che si occupano di fornire gli indirizzi per raggiungere i domini inferiori, e così via, fino a raggiungere il computer host finale. Di conseguenza, un name server, per poter ottenere l'indirizzo di un host che si trova in un dominio al di fuori della sua portata, deve interpellare i name server a livello di root e mano a mano quelli di livello inferiore, fino a ottenere l'indirizzo cercato. Per determinare l'indirizzo IP di un computer host si rischia di disturbare una quantità di name server. Per ridurre questo traffico di richieste, ogni name server è in grado di conservare automaticamente una certa quantità di indirizzi che sono stati richiesti nell'ultimo periodo.
In pratica, per poter utilizzare la notazione degli indirizzi suddivisa in domini, è necessario che il computer locale sul quale si opera possa accedere al suo name server più vicino, oppure gestisca un name server per conto suo. In una rete locale privata, i cui computer non siano quindi raggiungibili dalla rete Internet, non è solitamente necessario predisporre un name server. È sufficiente il file /etc/hosts ( hosts) compilato correttamente con gli indirizzi associati ai nomi completi dei vari host.
Spesso, specialmente quando si utilizza la posta, c'è la necessità di individuare un utente tra quelli registrati all'interno di un certo computer host. Gli utenti sono identificati utilizzando il loro nome di login seguito dal simbolo @ (a commerciale o chiocciolina) che significa at (presso), seguito dall'indirizzo del computer host presso cui l'utente risiede. L'indirizzo dell'host può essere espresso sia secondo lo stile dei nomi di dominio, sia nella sua sua forma numerica puntata.
pluto@topolino.zigozago.dg
pluto@192.168.1.1
Per poter utilizzare i servizi di rete è necessario aver previsto questo durante la configurazione del kernel. Per quanto riguarda Linux, si tratta principalmente di attivare la gestione della rete in generale e di attivare le particolari funzionalità necessarie per le attività che si intendono svolgere. Ciò corrisponde alla configurazione delle opzioni di rete, o Networking options ( `Networking options').
Oltre alla gestione della rete, occorre anche pensare al tipo di hardware a disposizione, e per questo si deve configurare la parte riguardante i dispositivi di rete, o Network device support ( `Network device support').
I documenti fondamentali per lo studio delle reti in Linux sono:
1997.10.26 - Scritto da Daniele Giacomini daniele@calion.com (vedi copyright: Appunti Linux).