Abbiamo visto il livello applicazione e il livello di trasporto: in questo articolo continuiamo a parlare delle reti di elaboratori scendendo di un livello sulla scala TCP/IP, cominciando a parlare del livello di rete.

Piano piano stiamo districando tutta la pila del TCP/IP e come funziona internet: prima di tutto abbiamo parlato del livello applicativo, vedendo i tipi di architetture realizzabili per una applicazione.

Poi abbiamo visto come TCP e UDP mettono in comunicazione due processi su due host remoti.

Adesso scendiamo di un’altro gradino, e vediamo i servizi che il livello di rete offre al livello di trasporto, e che servizi sfrutta dal livello di collegamento.

Servizi chiave offerti dal livello di rete

Principalmente i protocolli di questo livello, si occupano di due cose:[fancy_list style=”arrow_list”]

  • Inoltro (forwarding): ovvero il trasferimento di un pacchetto dall’ input di un router all’ output di un’altro router.
  • Instradamento (routing): Determina in che modo i pacchetti raggiungono la loro destinazione.

Algoritmi di routing vengono utilizzati per creare Tabelle di forwarding usate per l’ instradamento dei pacchetti all’ interno della rete: da una tabella che magari ha ad esempio i campi Valore intestazione e Collegamento d’ uscita, gli algoritmi di routing riempiono la tabella specificando che uscita del router deve prendere il pacchetto che ha una particolare intestazione.

Ovviamente, ogni router dovrà avere una forwarding table.

Switch e Router

Il livello rete riguarda principalmente  questi due host terminali: uno switch, o link-layer switch, permette di scegliere l’ inoltro basandosi sull’ indirizzo contenuto nel livello di collegamento (livello 2); mentre invece il router permette di scegliere l’ inoltro basandosi sul valore del campo nel livello di rete.

[info_box]Lo switch permette di collegare fisicamente due end system all’ interno di una rete.[/info_box]

Il router instrada i pacchetti al livello di rete, e in parole povere il suo compito è quello di prendere in input un pacchetto e rinstradarlo (basandosi sulle tabelle di forwarding) sul giusto output ovvero sul giusto collegamento, facendo avvicinare il pacchetto di un hop.

Quindi, il forwardng è:[fancy_numbers]

  1. Ricevo un pacchetto,
  2. In base alle tabelle di routing e l’ indirizzo di destinazione, computa quale sarà il prossimo hop (salto),
  3. Inoltra il pacchetto verso il prossimo hop.

[/fancy_numbers]

Il packet switching può avere un approccio a circuito virtuale (servizio orientato alla connessione), prima che i datagrammi fluiscano i due end system e i router intermedi stabiliscono una connessione virtuale; oppure un approccio a datagramma (servizio non orientato alla connessione) dove invece i datagrammi sono indipendenti gli uni dagli altri.

Il livello di rete, ha due tipi di architetture:

A circuito virtuale

Nelle reti a circuito virtuale, il percorso tra origine e destinazione si comporta in modo analogo ad un circuito telefonico. In questo tipo di rete il pacchetto ha un numero VC (Etichetta di circuito) nell ‘intestazione ed ogni collegamento può avere un numero VC diverso.

Ogni router infatti sostituisce il numero VC con un nuovo numero, ovvero la sua tabella di routing sarà:
[minimal_table]

Interfaccia in ingresso Numero vc entrante interfaccia in uscita Numero vc uscente
1 12 2 22
2 65 1 55

[/minimal_table]
Una nuova riga è aggiunta alla tabella per ogni nuova connessione virtuale, ed una volta che il circuito viene chiuso l’ entry viene eliminata – ovvero il router mantiene lo stato della connessione.
Tre esempi di protocolli di questo tipo:

  • X.25: primo esempio di rete orientato alla connessione, costituiva la prima rete dati pubblica negli anni 70. La connessione veniva stabilita fra due computer tramite chiamata telefonica
  • Frame Relay: ha mandato in pensione X.25 negli anni 80, questo protocollo è orientato alla connessione e non ha controllo di flusso o di errore ed è ancora usato per connettere due lan in due uffici distinti.
  • ATM (Asynchronous Trasnfer Mode):  Progettata negli anni 90,  è un tipo di rete orientato alla connessione. Viene utilizzata nelle reti telefoniche per trasportare pacchetti IP ed è nata per unificare il trasferimento di dati, televisione, audio etc.

Reti a commutazione di pacchetto (packet-switched)

Internet è una rete di tipo packet-switched: a differenza di quelle a commutazione di circuito questo tipo di rete non conserva lo stato della connessione, e non esiste il concetto di “connessione”.

I pacchetti infatti vengono indirizzati utilizzando l’indirizzo dell’ host destinatario e passano da un hop all’ altro fino ad arrivare a destinazione: i pacchetti poi, che vanno da un mittente ad uno stesso destinatario, potrebbero anche intraprendere percorsi diversi.

Architettura di un router

Come già abbiamo visto all’ inizio di questa serie di articoli, il router implementa i 3 livelli più bassi dello stack TCP/IP: il livello fisico, di collegamento e di rete.

Una volta preso in input da una delle entrate un pacchetto, ne estrapola il Frame e se è esente di errori lo passa al livello di rete. A questo punto, il processore di routing del router deve scegliere nella coda di quale porta di output inserire il pacchetto che verrà poi trasferito come segnale a livello fisico.

Questo processo, come già abbiamo visto in passato, deve essere veloce: il tasso di invio deve essere il più simile possibile a quello di ricezione per evitare colli di bottiglia e conseguente congestione.

La tabella di routing viene implementata con una struttura ad albero: Ogni livello dell’ albero corrisponde ad un bit dell’ indirizzo di destinazione:

  • Se il prossimo bit è 0 si visita il sottoalbero di sinistra
  • Se il prossimo bit è 1 si visita il sottoalbero di destra

La ricerca viene effettuata in n passi, dove n è il numero di bit che formano l’ indirizzo.

Vediamo adesso come fanno a commutare i pacchetti dalla giusta entrata alla giusta uscita:

Tecniche di commutazione

Commutazione in memoria

La prima generazione di router, effettuava la commutazione sotto il controllo della cpu: il pacchetto veniva quindi copiato nella memoria del processore e i pacchetti venivano trasferiti dalla porta di ingresso a quella di uscita.

 Commutazione tramite bus

Questo tipo di commutazione, permette di collegare l’input del router con la giusta porta di output. Il problema però, è che per la sua natura, il bus permette di trasferire un pacchetto per volta: gli altri pacchetti rimangono buoni in attesa di essere smistati in un buffer di input.

Ciò implica che la larghezza di banda  della commutazione, è limitata alla capacità di trasferimento del bus.

Commutazione tramite rete di interconnessione

Questo permette di superare il limite della capacità dei bus: sostanzialmente è formato da 2n bus che collegano n entrate ed n uscite formando una crossbar switch.

Il router Cisco 12000 raggiunge la bellezza di 60Gbps nella struttura di commutazione. Non male se paragonato ai 32 gb del Cisco 5600 che utilizza una commutazione tramite bus, sufficiente comunque per i punti di accesso o per router aziendali.

Porte di uscita

Le porte d’uscita devono avere una funzionalità di accodamento, che viene sfruttata quando la struttura di commutazione consegna pacchetti alla porta d’uscita a una frequenza che supera quella del collegamento uscente.

Inoltre, devono stabilire in che ordine i pacchetti devono essere spediti.

Quindi, dove si verifica l’accodamento?

L’accodamento si verifica dove sono presenti buffer: nelle porte di ingresso, e in quelle di uscita.

[note_box]Velocità di commutazione: frequenza alla quale tale struttura può trasferire i pacchetti dalle porte di ingresso a quelle di uscita [/note_box]

Nelle porte di ingresso, l’accodamento si può evitare solo se (per n porte di ingresso) la velocità di commutazione è almeno n*velocità della linea in ingresso.  Con HOL (Headofline blocking)  si intende quando un pacchetto in un buffer di una linea di ingresso, non può essere trasferito in quanto c’è un pacchetto davanti a lui che per qualche motivo stà bloccando la sua fila.

Nelle porte di uscita, se la struttura non è abbastanza rapida ad inviare pacchetti può verificarsi un accodamento: anche nel caso in cui troppi pacchetti vanno tutti nella stessa uscita, può verificarsi un’accodamento.

In entrambi i casi, se l’accodamento dei pacchetti supera le capacità del buffer di mantenerli potrebbe esserci una perdita di pacchetti.

Ma quant’è la capacità dei buffer? Secondo l’ RFC 3439 era la capacità del collegamento moltiplicato per il RTT (Round-trip-time: tempo di andata e ritorno di un pacchetto), mentre attuali raccomandazioni dicono che debba essere RTT*C/(sqroot(N)) dove N è il numero di flussi.

Protocolli del livello di rete

I protocolli di questo livello sono:[fancy_list style=”plus_list”]

  • IPv4( ma esiste anche IPv6): Internet Protocol version 4
  • IGMP: Internet Group Management Protocol (multicasting)
  • ICMP: Internet Control Message Protocol (Gestione degli errori)
  • ARP: Address Resolution Protocol (Associa l’ indirizzo IP  all’  indirizzo di collegamento)

[/fancy_list]

IP: Internet Protocol (IPv4)

L’ IP è il responsabile della suddivisione in pacchetti, del forwarding e della consegna dei datagrammi sul livello di rete (ovvero host to host).

Essendo basato su un’architettura senza connessione, è inaffidabile e i pacchetti di questo livello vengono chiamati Datagrammi.

Il servizio di consegna offerto è di tipo best effort: viene offerto il massimo impegno possibile al momento.

Formato dei datagrammi

Vediamo il formato di un datagramma IP, che contiene 20 byte di intestazione (senza opzioni):

formato dei datagrammi ip

 

  • Version: Numero di versione, può essere 4 (IPv4) o 6 (IPv6)
  • HLEN: Lunghezza dell’ intestazione, visto che Options è una quantità variabile
  • Service Type: Tipo di servizio serve per distinguere datagrammi con richieste di QoS diverse
  • Total Length: lunghezza totale del datagramma in byte (solitamente < 1500byte). Per capire se il pacchetto è arrivato completamente
  • Identification: Identificatore, questo insieme a Flags e fragment offset gestiscono la frammentazione dei pacchetti (vedremo fra poco).
  • Flags: flags
  • Fragment offset: Spiazzamento di frammentazione
  • TTL: Tempo di vita residuo, decrementa ad ogni hop( router) e viene elimintato se TTL=0.
  • Protocol: Protocollo del livello superiore (ti ricordi il demultiplexing?). Per TCP vale 6, per UDP vale 17, 1 per ICMP, 2 per IGMP e 89 per OSPF.
  • Checksum: Checksum solo dell’ intestazione
  • Source IP Address: Indirizzo ip del mittente
  • Destination IP Address: Indirizzo ip di destinazione
  • Options: campi opzionionali tipo Timestamp, Registrazione dei percorsi, Elenco dei router
  • Dati: Segmento del livello di trasporto, oppure altri dati come messaggi ICMP.

Frammentazione

Abbiamo detto che la Internet sfrutta IP come tecnologia a livello rete: questo vuol dire che un datagramma IP viaggia attraverso molte reti, con caratteristiche diverse. In particolare, ogni link potrebbe avere una MTU (Maximum Transfer Unit) diversa: ovvero la massima quantità di dati che un frame a livello di collegamento può trasportare, varia in base alla tecnologia.

Per ovviare a questo problema, ogni router estrae il datagramma dal frame, lo elabora e lo incapsula in un nuovo frame.

I datagrammi IP grandi quindi, vengono suddivisi (ovvero, frammentati) in datagrammi IP più piccoli:

  1. Un datagramma viene frammentato,
  2. I frammenti saranno riassemblati solo una volta raggiunta la destinazione
  3. I frammenti devono essere riassemblati prima di raggiungere il livello di trasporto
  4. I bit dell’ intestazione IP sono usati per identificare e ordinare i frammenti

Quindi, sapendo questo, possiamo dire con più precisione che il campo Identificazione contiene un identificativo associato a ciascun datagramma al momento della creazione, ed è unico per tutti i frammenti.

Il campo flag è composto da 3 bit che se asseriti significano:

  • Riservato
  • Do not fragment: 1 non frammentare, 0 si può frammentare
  • More fragments: 1 frammenti intermedi, 0 l’ ultimo frammento

Il campo Offset( scostamento laterale) specifica l’ ordine del frammento all’ interno del datagramma originario.

Indirizzamento IPv4

Per indirizzare, IPv4 utilizza un numero a 32 bit (o 4 byte – da quì v4) in notazione decimale puntata, dove ogni byte dell’ indirizzo viene indicato in forma decimale.

Ogni interfaccia di host e router di Internet ha un indirizzo IP globalmente univoco a 21 bit.

L’ interfaccia è il confine tra host e collegamento fisico: i router devono necessariamente essere connessi ad almeno due collegamenti, un host in genere ha un’ interfaccia e a ciascuna interfaccia è associato un indirizzo ip.

Quanti host possiamo indirizzare con 32 bit? 232 equivale a più di 4 miliardi di possibili indirizzi.

La notazione con cui si indica un indirizzo può essere:

  • Binaria: 10000000 000001011 00000011 00011111
  • Decimale puntata: 128. 11 . 3 . 31
  • Esadecimale (utilizzata nella programmazione di rete): 800B03r1F

Gerarchia nell’ indirizzamento

Questo indirizzo a 32 bit, viene diviso in due parti:

  • i primi n bit (chiamato prefisso) individuano la rete
  • I 32-n bit rimanenti (chiamato suffisso) individuano il collegamento al nodo.

A seconda di come stabiliamola lunghezza di questo prefisso, abbiamo:

  • Fisso: Indirizzamento con classi
  • Variabile: indirizzamento senza classi

Usando le classi di indirizzamento, possiamo supportare sia reti piccole che grandi ed utilizziamo 3 lunghezze di prefisso (da 8, 16 e 24):

Classi di indirizzi ip

Una volta individuato un indirizzo è facile risalire alla classe a alla lunghezza del prefisso: c’è un problema però con questo tipo di indirizzamento che l’immagine fà saltare all’ occhio.

  • La classe A può essere assegnata solo a 128 organizzazioni al mondo, ognuna con 16.777.216 nodi. In questa classe la maggior parte degli indirizzi andava sprecata, e poche organizzazioni potevano usufruire di indirizzi di classe A.
  • La classe B ha gli stessi problemi della A
  • La classe C ha solo 256 indirizzi per rete :C

L’ indirizzamento variabile, ovvero senza classi, ci permette di avere una maggiore flessibilità nell’ assegnamento degli indirizzi.

Vengono utilizzati blocchi di lunghezza variabile che non appartengono quindi a nessuna classe. Un indirizzo però, non è in grado di definire da solo la rete a cui appartiene.

La lunghezza del prefisso è variabile (da 0 a 32) e viene aggiunta all’ indirizzo separata da uno slash:

byte.byte.byte.byte/n

dove n è la lunghezza del prefisso. Questa notazione è chiamata CIDR (Classless InterDomain Routing)

Il numero di indirizzi nel blocco è dato da N = 232-n e per trovare il primo indirizzo si impostano a 0 tutti i bit del suffisso (32-n) e per trovare il primo si impostano a 1 tutti i bit del suffisso.

NetMask e Indirizzi di rete

La maschera dell’ indirizzo di rete è un numero a 32 bit, con i primi n bit impostati a 1 e il resto (32-n) a 0. Mediante questa maschera, si ottiene l’ indirizzo di rete che è usato nell’ instradamento dei datagrammi verso la destinazione.

Esistono poi degli indirizzi particolari che s0no riservati:

  • 0.0.0.0 è utilizzato dagli host al momento del boot
  • Quando il numero di rete è impostato tutto a zero si riferisce alla rete stessa
  • Un’ indirizzo formato da tutti 1 è una trasmissione broadcast (usato di solito in LAN).
  • Gli indirizzi nella forma 127.xx.yy.zz sono riservati al loopback (i pacchetti non vengono inviati ma vengono elaborati localmente e trattati come pacchetti in arrivo).

Per avere un blocco di indirizzi IP da usare in una sottorete, bisogna rivolgersi al proprio ISP che a sua volta  chiederà all’ ICANN (Internet Corporation for Assigned Names and Numbers) che se vi ricordate ha anche il compito di gestire i server radice del DNS.

Ottenere un indirizzo IP

Quando ci connettiamo utilizziamo un indirizzo IP. Come ottenerlo quindi? Volendo possiamo configurarlo manualmente guardando nelle impostazioni del nostro computer (Sia Linux, mac o windows). Solitamente, si utilizza un protocollo chiamato DHCP che vediamo perchè molto utile e importante

DHCP: Dynamic Host Configuration Protocol

Questo protocollo permette a un host di ottenere  un indirizzo IP in modo automatico: viene spesso utilizzato nei sistemi dove gli host si aggiungono e rimuovono frequentemente ed è possibile configurare il DHCP in modo che assegni ad uno stesso host uno stesso IP(ovvero ogni volta che si riconnette alla rete, gli viene assegnato quel determinato IP).

Vediamo alcune funzioni di DHCP:

  • Permette di rinnovare la proprietà dell’ indirizzo in uso
  • Permette di riusare indirizzi
  • Supporta anche gli utenti mobili che si vogliono unire alla rete
  • Utilizzato nelle reti residenziali di accesso a Internet e nelle LAN wireless dove appunto gli host si aggiungono e rimuovono dalla rete con estrema frequenza.

E’ un protocollo di tipo client-server del livello applicazione dove il Client è l’host appena connesso che necessita delle informazioni sulla configurazione della rete (e non solo l’ IP), e il Server che fornisce i dati.

Solitamente è presente sempre un server per ogni sottorete, o comunque il router fa da agente di appoggio DHCP per un server DHCP facente parte della rete.

I passaggi sono:[fancy_numbers]

  1. L’host invia un messaggio broadcasts: DHCP discover
  2. Il server DHCP risponde con: DHCP offer
  3. L’ Host richiede l’ indirizzo IP: DHCP request
  4. Il server invia l’ indirizzo: DHCP ack

[/fancy_numbers]

I dati forniti dal server DHCP all’ host al momento della connessione sono:[fancy_list style=”plus_list”]

  • Indirizzo IP
  • Maschera di rete
  • Indirizzo del router
  • Indirizzo DNS

[/fancy_list]

Il formato dei messaggi DHCP
Il formato dei messaggi DHCP