Ci apprestiamo ad affrontare uno degli argomenti più importanti e complessi dell’intera guida, ovvero il networking. Spendendo qualche minuto su un motore di ricerca scoverete migliaia di documenti che trattano in lungo e largo il rapporto strettissimo tra Linux e le reti. Alcuni sono redatti piuttosto bene, altri, molto spesso, risultano troppo dettagliati o eccessivamente semplicistici. Il punto è proprio questo, il materiale a disposizione è tanto, il rischio di perdersi è concreto, quindi selezioneremo solo quanto occorre veramente conoscere per comprendere ciò che leggerete nelle puntate immediatamente successive. Animati da questo intendimento inseguiremo quindi la massima sintesi di cui saremo capaci concentrandoci solo sull’essenziale.
I protocolli
Quando due entità intendono scambiare informazioni occorre un mezzo per veicolarle ma anche un linguaggio comune che sia intellegibile per entrambi. Ovviamente le apparecchiature elettroniche non fanno eccezione. Potete immaginare i protocolli di comunicazione come la collezione di regole perché ciò avvenga. In pratica La grammatica e il vocabolario per capirsi. Linux utilizza massicciamente i protocolli TCP e UDP in congiunzione con il protocollo IP. Per comprendere meglio come avvenga tutto ciò si fa riferimento al modello OSI che richiama alcuni concetti chiave per la progettazione delle reti. Dovete immaginarlo come uno schema di astrazione in cui la comunicazione tende sempre più a svincolarsi dalla connessione fisica mutando nel puro flusso logico di informazioni che raggiungerà gli elementi terminali nel Sistema Operativo man mano che risale lungo i vari livelli. Ovviamente il collegamento materiale fra diversi host avverrà tipicamente al livello più basso che è appunto quello fisico. Schematizziamo i livelli OSI in una tabella. Consigliamo di leggerla due volte, la prima dal basso verso l’alto e la seconda dall’alto verso il basso, così facendo ripercorrete la vita di un flusso di comunicazioni che ottiene una risposta e sarà quindi più semplice comprendere il senso di quanto viene descritto.
Livello di Applicazione | Qui troviamo i protocolli che abitano l’ultimo tratto fra le applicazioni e i livelli sottostanti per interfacciarle con le reti. |
Livello di Presentazione | In questo livello ha luogo la standardizzare fra i dati delle applicazioni per utilizzare le comunicazioni. |
Livello di Sessione | Avviene la gestione delle connessioni ovvero del flusso di dati fra destinazioni. |
Livello di Trasporto | Il TCP (Trasmission Control Protocol e lo UDP (User Datagram Protocol) agiscono a questo livello. A seconda che lo host sia in trasmissione o in ricezione i datagram vengono organizzati in pacchetti o i pacchetti vengono gestiti in appoggio al livello superiore. |
Livello Network | Lo ICMP (Internet Control Message Protocol) e lo Internet Protocol (IP) agiscono a questo livello. E’ qui che ha luogo il routing (ovvero lo smistamento dei flussi dati) fra host diversi tramite la determinazione del prossimo “salto” nell’instradamento di un flusso comunicazione. |
Livello Data Link | La comunicazione viene spezzettata in datagram ovvero sezioni gestibili. Questo livello interagisce con quello fisico, identifica gli host, verifica che la comunicazione a livello fisico fra host diversi avvenga senza errori. |
Livello Fisico | Avviene il contatto elettrico fra host diversi. |
IP
Quando ci riferiamo ai protocolli la notazione IP è riferita all’Internet Protocol inteso come tale. L’Internet Protocol è alla base del funzionamento di Internet e di altre reti basate su indirizzi IP nonché pietra angolare di tutte le attività di routing essenziali per il loro funzionamento. In pratica questo protocollo consente a sottoreti, elementi di sottoreti o device di dialogare con altri elementi attraverso un punto di congiunzione che li mette in comunicazione (il router). I dati sono inseriti in datagram a cui è associato un header contenente le informazioni necessarie al loro instradamento. Questi dati rappresentano il payload (ovvero il carico utile) di informazioni da veicolare.
TCP
Il Trasmission Control Protocol è un protocollo di trasporto che veicola e gestisce in maniera ordinata ottetti di bit in un una rete costituita da indirizzi IP. Lavora mettendo in comunicazione due host. I dati sono incapsulati in un datagram TCP a cui viene aggiunta una intestazione TCP, poi sono instradati. E’ previsto un controllo dei pacchetti smarriti, corrotti o fuori tempo massimo con relativa ritrasmissione ove necessario. Il flusso di dati può interessare due host che dialogano tra di loro in contemporanea creando un collegamento full duplex real time (ovvero un canale a due vie).
UDP
Lo User Data Protocol è un protocollo a livello di trasporto ma è più leggero e veloce del TCP in quanto non prevede la ritrasmissione o l’ordinamento quindi ha minore necessità di risorse. Risulta particolarmente indicato per lo streaming audio-video o per altre trasmissioni con le medesime caratteristiche come il VoIP.
ICMP
Lo Internet Control Message è un protocollo deputato alle verifica dell’integrità di una connessione. E’ quello che viene utilizzato per il comando ping in cui si ottiene da uno specifico indirizzo una risposta al fine di vagliare la percorribilità di un percorso. Nella schermata e seguire ne vedete due esempi d’uso, il primo verso un indirizzo IP attivo, il secondo verso un indirizzo IP inesistente.
fprincipe@html1:~$ ping 192.168.0.102
PING 192.168.0.102 (192.168.0.102) 56(84) bytes of data.
64 bytes from 192.168.0.102: icmp_seq=1 ttl=64 time=0.305 ms
64 bytes from 192.168.0.102: icmp_seq=2 ttl=64 time=0.250 ms
64 bytes from 192.168.0.102: icmp_seq=3 ttl=64 time=0.235 ms
64 bytes from 192.168.0.102: icmp_seq=4 ttl=64 time=0.260 ms
64 bytes from 192.168.0.102: icmp_seq=5 ttl=64 time=0.200 ms
^C
--- 192.168.0.102 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4078ms
rtt min/avg/max/mdev = 0.200/0.250/0.305/0.034 ms
fprincipe@html1:~$ ping 192.168.0.103
PING 192.168.0.103 (192.168.0.103) 56(84) bytes of data.
From 192.168.0.101 icmp_seq=1 Destination Host Unreachable
From 192.168.0.101 icmp_seq=2 Destination Host Unreachable
From 192.168.0.101 icmp_seq=3 Destination Host Unreachable
^C
--- 192.168.0.103 ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4085ms
pipe 4
fprincipe@html1:~$ ifconfig
enp0s3: flags=4163 mtu 1500
inet 192.168.0.101 netmask 255.255.255.0 broadcast 192.168.0.255
inet6 fe80::a00:27ff:fe24:faa0 prefixlen 64 scopeid 0x20
ether 08:00:27:24:fa:a0 txqueuelen 1000 (Ethernet)
RX packets 271 bytes 280164 (280.1 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 241 bytes 22540 (22.5 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1000 (Local Loopback)
RX packets 94 bytes 7058 (7.0 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 94 bytes 7058 (7.0 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
Subito sopra vediamo l’output del comando ifconfig che restituisce informazioni relative agli host di rete attivi sulla macchina che state utilizzando. Al livello datalink gli host si riconoscono fra loro attraverso il MAC Address, un indirizzo codificato direttamente nelle interfacce di rete in fabbrica che le identifica in modo univoco.
Come vedete il primo host si presenta con tre distinti indirizzi rappresentanti dalle voci inet, inet6 e ether che rappresentano rispettivamente lo IPv4, lo IPv6 e il MAC Address. Questi sono costituiti nell'ordine da 4 numeri decimali separati da punti e non superiori al numero 255, da 8 quartine di numeri esadecimali separati da doppi punti, da 4 coppie di numeri esadecimali separati da doppi punti. Un indirizzo IP può quindi essere di tipo IPv4 e di tipo IPv6. Nel IPv4 lo spazio di indirizzamento possibile è di soli 32 bit. Vale a dire che l'intera quantità di indirizzi IPv4 assegnabili non può superare quelli identificabili attraverso 32 bit. Risulta quindi troppo limitato per la tecnologia in divenire assai diversa da quella dei decenni passati in cui originariamente venne concepito. Inoltre alcuni indirizzi risultano riservati per usi particolari. A tendere lo IPv4 sarà abbandonato per passare allo IPv6, quest’ultimo ha uno spazio di indirizzamento di 128 bit quindi può meglio rispondere alle esigenze tipiche del mondo attuale ovvero l’internet delle cose. Noi ci concentreremo sullo IPv4 poiché è ancora adottato come standard e presumibilmente lo sarà per parecchi anni a venire, comunque spendete qualche minuto per comprendere meglio lo IPv6 leggendo la pagina di Wikipedia a questo indirizzo.
L’indirizzo IPv4 (d’ora in avanti semplicemente indirizzo IP) è assegnato arbitrariamente a un host di rete in maniera statica o dinamica a discrezione dell'amministratore della macchina in questione.
La notazione in cui è espresso è decimale. Come dicevamo alcuni indirizzi hanno utilizzi particolari, ad esempio tutti gli IP che iniziano per 10, per 192.168 e per 172.16-31 sono indirizzi che non vengono ruotati ma comunicano solo in un contesto di host che si affacciano allo stesso livello di routing. Quelli che iniziano per 127 si riferiscono alla macchina che li presenta ovvero al localhost e servono per indirizzare una comunicazione assegnando come destinazione lo stesso host che la origina. Altri indirizzi speciali sono quelli che terminano con .0 o con .255 infatti rappresentano un range di IP e un indirizzo per inviare comunicazioni broadcast (cioè verso tutti) nella specifica sezione di indirizzi.
Le porte
Le comunicazioni che sfruttano IP, TCP e UDP sono soggette a multiplazione. Vale a dire che è possibile assegnare a esse una “porta” numerica che associa una sorta di etichetta consentendo quindi di usare lo stesso IP per servizi diversi. Ad esempio due servizi molto diffusi e distinti come ssh e http possono condividere lo stesso indirizzo IP adottando le porte 22 e 80. Alcune porte sono, per convenzione, associate a uno specifico servizio, altre sono considerate libere per qualsiasi utilizzo. Un elenco delle porte più comuni può essere consultato qui.