Comunicazione Ethernet

Le comunicazioni in rete fra calcolatori sono standardizzate a diversi livelli di astrazione, uno sviluppato sull'altro. Questi partono dal livello più basso, in cui vediamo le trasmissioni solo come una sequenza di segnali elettrici, a quello più alto che è quello con cui interagiscono le applicazioni utente. Lo standard in questione è identificato con la sigla ISO/OSI, e questi livelli si chiamano appunto Livelli OSI.

In questo esercizio descriviamo brevemente due livelli superiori al primo (quello dei segnali elettrici), e i comandi in Linux che ci permettono di analizzare cosa succede in tali livelli.

Livello 2: indirizzi MAC

Il livello 2, detto data-link, è a sua volta diviso in due parti: LLC e MAC; il primo gestisce la trasmissione di dati sul canale (ad esempio chi parla quando, nel caso di più trasmissione contemporanee), mentre il secondo descrive come organizzare i dati da essere spediti.

Vedremo qualche esempio di cosa appare del protocollo MAC ai livelli più alti. Una delle feature principali del protocollo è che i dati da trasmettere vengono impacchettati in un frame, e questo contiene anche un'indirizzo di destinazione dell'interfaccia di rete che deve ricevere il pacchetto. Solitamente ci si riferisce a questo indirizzo come MAC address.

Il MAC address ha significato solo nella rete locale in cui ci si trova: i computer direttamente collegati tramite un cavo oppure uno switch, come questo: Gli indirizzi sono composti da 12 cifre esadecimali, di solito raggruppate a coppie, ad esempio:

b8:5f:98:ce:a6:86
Si ottenga l'indirizzo MAC dell'interfaccia di rete del PC a cui si è collegati, utilizzando il comando:
$ ip address show
Questo mostra molte informazioni; l'interfaccia di rete di interesse si chiamerà (cui PC dell'aula 4) enp3s0, e l'indirizzo MAC è identificato dall'etichetta link/ether.
Il comando ip si può usare per visualizzare vari dati sulla configurazione della rete, e anche per configurarla, nel caso si possiedano sufficienti permessi (non è però il vostro caso).

Quando ci si collega ad un'altra macchina, il PC ha bisogno di sapere l'indirizzo MAC corrispondente, per poterlo inserire all'interno dei pacchetti (frame) da spedire. Vedremo poi come questi indirizzi vengono ottenuti. Per il momento, tramite il comando arp, possiamo vedere quelli che il sistema ha correntemente in memoria.

Si utilizzi il comando arp per vedere la lista degli indirizzi MAC attualmemtente in memoria del PC corrente. Si controlli quali delle altre macchine labN.cs.dm.unipi.it sono elencate. Se ne scelga una che non c'é, e si mandi un pacchetto con il comando ping -c 1 labN (vedremo poi i dettagli di questo comando). Si verifichi ora la tabella degli indirizzi, e si controlli che sia apparso l'indirizzo della nuova macchina.

Livello 3: IP

Al momento non è molto chiaro come questi indirizzi MAC vengono determinati; per collegarsi ad una macchina noi in realtà utilizziamo un nome semplice da ricordare, come lab10.cs.dm.unipi.it; tuttavia, questo viene tradotto in un indirizzo numerico in formato IP dal sistema DNS (che vedremo nel dettaglio fra poco).

Un indirizzo IP è formato da 4 numeri interi da $0$ a $255$; ad esempio l'indirizzo di lab10.cs.dm.unipi.it è 131.114.10.130. Questo indirizzo, al contrario del MAC address, permette di localizzare il computer non solo nella rete locale ma in tutta la rete Internet.

Si utilizzi ancora il comando ip address show per determinare l'indirizzo IP della macchina alla quale si è collegati. Si chieda ad un collega nello stesso gruppo l'indirizzo della macchina trovata (possibile collegati a macchine diverse), e si provi a collegarsi direttamente con l'indirizzi numerico:
$ ssh xxx.yyy.zzz.www

Quando decidiamo di collegarci, o comunque di spedire un pacchetto, ad un determinato indirizzo IP, il computer deve per prima cosa determinare se quel computer si trova una rete locale, direttamente collegata con un cavo, ed è quindi direttamente raggiungibile spedendo un pacchetto con il giusto indirizzo MAC. Se è questo il caso, chiede sulla rete: "quale MAC ha l'IP xxx.yyy.zzz.www?"; appena ottiene risposta, impacchetta i dati da mandare.

Se invece così non è, il computer deve appoggiarsi ad un altro computer per chiedere l'inoltro del pacchetto a destinazione. Questo computer a sua volta potrebbe appoggiarsi ad altri, e così via. Questi "computer di appoggio" sono detti router. Anche il router fornito dal vostro operatore telefonico per l'ADSL di casa svolge questo ruolo, sebbene abbastanza in piccolo.

Si utilizzi il comando ip route show per mostrare la tabella di routing sul computer a cui si è collegati.

Nella tabella di routing si vedranno due tipi di campi:

In generale un IP è rappresentabile con 32 bit, (8 bit per ogni numero da 0 a 255); Ad esempio, la rete 192.168.0.0/30 è fatta di 4 indirizzi:
192.168.0.0, 192.168.0.1, 192.168.0.2, 192.168.0.3

Si determinino il primo e l'ultimo indirizzo che possono far parte degli indirizzi locali collegati alla macchina dell'Aula 4 a cui ci si è connessi.

Sui sistemi Linux (ma anche su Windows e Mac) esiste un comando che, tramite un protocollo apposito, permette di testare la connettività fra due computer, specificando il loro indirizzo IP. Questo programma si chiama ping. Come il nome suggerisce, il software invia una richiesta all'host di destinazione (il ping), e riceve una risposta (il pong). Da questo determina il tempo che è richiesto per un pacchetto a fare andata e ritorno da un determinato host.

Si provi ad utilizzare il comando ping per contattare:

Gli altri livelli

I livelli successivi definiscono le regole pre instaurare una connessione, e per regolare i flussi di traffico (il transport layer, ovvero il livello 4). Andando ancora più in alto, si trovano i protocolli di rete, ovvero le regole che le applicazioni rispettano per capirsi tra di loro. Per maggiori dettagli, si veda la voce Wikipedia sui Livelli OSI.

Velocità di trasmissione

Lo standard che regola la trasmissione di dati attraverso il protocollo Ethernet (quello che abbiamo testato fino ad ora nella rete locale), prevede diverse possibili velocità a cui lavorare.

Le velocità di trasmissione si misurano in bit/s, ovvero nel numero di 0 e 1 che è possibile trasmettere in un intervallo di tempo. Tipicamente, le velocità più diffuse sono 100MBit e 1GBit (ricordate che 1 byte = 8 bit). Sono previste anche modalità a 2.5GBit, 5GBit, e 10GBit. Per velocità superiori, tipicamente si preferisce usare la fibra ottica, perché diventa sempre più difficile mantenere alte velocità (soprattutto su distanze più lunghe) tramite cavi in rame. La lunghezza massima di un cavo Ethernet si aggira sui 100m; questa è la ragione per cui la banda larga nelle case viene distribuita con la fibra ottica, e non con devi cavi Ethernet.

Sulle macchine dell'Aula 4 è installato il comando iperf che permette di testare la velocità di trasmissione fra due macchine. Si provi a verificare qual è la velocità di collegamento interna delle macchine in Aula 4. Per fare questo, si lavori con un collega, ognuno collegato ad una macchina diversa. Per chi avesse una distribuzione Linux sulla macchina di casa, è possibile installare il pacchetto iperf e ripetere il test della velocità da casa propria al dipartimento lanciando il comando iperf -s -p 16000 su una macchina in Aula 4, e poi iperf -c labN.cs.dm.unipi.it -p 16000. Vedremo più avanti la ragione per il parametro -p 16000, per ora prendiamolo per buono.