L'integrità dei dati e affidabilità nelle comunicazioni basate su protocolli internet
L’insieme dei protocolli di rete che realizzano quello che è comunemente denominato TCP/IP costituisce oggi la base della comunicazione tra computer o apparecchiature attraverso una rete locale o piu’ in generale la rete internet.
I protocolli di rete sono normalmente organizzati in
livelli, in cui ogni livello ha un preciso compito nei differenti aspetti della
comunicazione.
I protocolli che costituiscono il TCP/IP sono organizzati
in quattro livelli:
A partire dal livello di collegamento (il piu’ basso)
ciascun livello (in linea di principio e salvo eccezioni) comunica solo con i
livelli soprastanti e sottostanti.
Il livello di collegamento normalmente comprende la
gestione a basso livello tra il dispositivo di comunicazione (es: scheda
ethernet, token ring, ISDN, ATM etc) e il sistema operativo del computer o
apparecchiatura.
Il livello di rete gestisce attraverso i protocolli di
rete come i pacchetti da e per i livelli adiacenti debbano essere interpretati,
modificati, instradati e modificati. I protocolli che fanno parte di questo
livello sono l’Internet Protocol (IP), l’Internet Control Message Protocol
(ICMP) e l’Internet Group Management Protocol (IGMP).
Il livello di trasporto si occupa di garantire il
trasferimento dei dati tra due dispositivi che hanno instaurato una
comunicazione. I protocolli che fanno parte di questo livello sono il Transmission
Control Protocol (TCP) e l’User Datagram Protocol (UDP).
Il protocollo TCP garantisce una comunicazione affidabile
tra due dispositivi connessi logicamente attraverso la rete. Esso si occupa di
tutta la gestione dei dati che provengono dall’applicazione soprastante,
dividendo dove necessario il flusso dati in unita’ compatibili ai limiti del protocollo di rete sottostante,
gestisce le eventuali richieste di ripetizione di dati giunti incompleti
nonche’ il loro eventuale riordino sequenziale. Grazie a queste caratteristiche
di affidabilità l’applicazione che si serve del TCP per stabilire una
comunicazione puo’ ignorare tutti i dettagli legati al mantenimento e la
verifica della connessione.
Il protocollo UDP invece gestisce il semplice invio di
pacchetti tra dispositivi non garantendo che questi arrivino a destinazione né
tantomeno provvedendo a eventuali richieste di ripetizione. Tutti gli eventuali
dettagli per rendere la comunicazione affidabile dovranno essere gestiti
dall’applicazione.
Infine il livello di applicazione gestisce i dettagli di
una particolare applicazione. I protocolli che fanno parte di questo livello
sono ad esempio il File Transfer Protocol (FTP utile a copiare files tra due
computer), l’Hyper Text Transfer Protocol (HTTP usato dai browser), il Simple
Mail Transfer Protocol (SMTP usato dai client per la posta elettronica per
inviare messaggi di posta elettronica).
Quando due computer (o apparecchiature) vengono collegati tra loro attraverso una rete ethernet e stabiliscono tra loro un collegamento Client/Server bidirezionale utilizzando il TCP/IP l’insieme dei protocolli che partecipano all’instaurazione del collegamento e lo scambio dei dati è il seguente:
Nell’illustrazione l’applicazione del primo computer è
denominata Applicazione Client, l’applicazione del secondo computer è
denominata Applicazione Server.
Le due applicazioni possono fornire svariati tipi di
servizi, tra cui lo scambio di file FTP, messaggi di posta elettronica SMTP,
navigazione web HTTP, trasferimento di immagine di processo o altro.
Ciascun livello ha un proprio protocollo (nella realta’
questi possono essere piu’ di uno) per comunicare con il proprio
corrispondente.
Nell’esempio il protocollo IP consente ai due livelli di rete di comunicare tra loro. Appare
ora chiaro che quello che comunemente viene denominato TCP/IP è un insieme di
protocolli di cui IP e TCP fanno parte.
La configurazione minima di protocolli internet necessari per instaurare una comunicazione tra due computer attraverso un collegamento ethernet è la seguente:
Dall’illustrazione si vede come i due protocolli di trasporto TCP e UDP utilizzano IP come protocollo di rete. TCP è un protocollo che garantisce l’affidabilità’ del collegamento, il trasporto e consegna a destinazione dei dati. UDP è un protocollo che serve solo a inviare frame attraverso la rete senza garanzie di consegna e collegamento. Il TCP è usato ad esempio da FTP, UDP è usato da DHCP o SNMP. IP è il protocollo del livello di rete utilizzato sia da UDP sia da TCP. Qualsiasi dato trasferito attraverso la rete da qualunque protocollo viene processato da IP. IP è affiancato da ICMP il quale ha funzioni di controllo degli errori e serve a gestire la comunicazione tra IP e i protocolli soprastanti.
IP comunica direttamente con l’interfaccia di
comunicazione dati a basso livello (in questo caso ethernet) il quale ha
bisogno in molti casi (ethernet, token ring) del protocollo ARP per associare
gli indirizzi del mezzo di collegamento con gli indirizzi internet.
Quando due computer instaurano un collegamento utilizzando il TCP/IP il flusso di dati originato dalle applicazioni passa attraverso tutti i livelli e i protocolli del TCP/IP.
A ciascun livello i protocolli incapsulano i dati che
ricevono dal livello soprastante in un frame che contiene le opportune
informazioni di intestazione e terminanazione.
A partire dai dati dell’applicazione percorrendo i livelli
dal piu’ alto al piu’ basso, il livello di applicazione puo’ se lo ritiene
opportuno aggiungere un’intestazione (che puo’ contenere codici di controllo di
errore rindondanti dall’applicazione), lo stesso fanno sempre sia il TCP (o nel
caso UDP) e l’IP.
Quando il frame IP (come in questo caso) viene trasmesso
attraverso ethernet viene aggiunta sia un’intestazione sia una terminazione che
comprende il codice di controllo di errore.
I protocolli IP TCP e UDP utilizzano all’interno di ciascuno delle loro intestazioni un semplice controllo di rilevazione di errore basato su un checksum a 16bit denominato internet checksum.
Le caratteristiche e i dettagli di implementazione sono
descritti nel documento Internet Request for Comments (RFC) 1071 disponibile
online in internet all’indirizzo http://www.rfc-editor.org/
Sostanzialmente le caratteristiche percui e’ stato scelto
questo metodo di controllo e rilevazione dell’errore (tenendo conto anche della
capacita’ di elaborazione dei sistemi di quando questo protocolli furono
realizzati) sono l’estrema semplicita’ dell’algoritmo che realizza il controllo
(sia in hardware che in software) unito al fatto che il controllo del checksum
produce lo stesso tipo di controllo sia su macchine big endian che little
endian che a loro volta possono eseguire il controllo tramite somme in
aritmetica binaria con complemento a 1 o 2.
Inoltre l’impiego del checksum (al contrario ad esempio di
un codice ciclico CRC) consente in caso di modifica di un singolo valore il
ricalcolo parziale del checksum senza dove procedere all’intero ricalcolo del
cheksum. Questa operazione e’ spesso necessaria quando il frame viene
trasferito in rete per mezzo da dispositivi di instradamento (router) che
necessitano di modificare alcuni parametri contenuti nell’intestazione IP.
Il checksum contenuto all’interno dell’intestazione IP e’ calcolato solo sull’intestazione IP (20 byte). Il calcolo del checksum non viene eseguito su nessuno dei byte che seguono l’intestazione IP.
Per calcolare il checksum IP di un frame in uscita per
prima cosa il valore viene posto a zero, quindi la somma a 16bit con
complemento a uno dell’intera intestazione viene calcolata (l’intestazione
viene considerata sempre come sequenze di parole a 16bit). Il complemento a 1
di questa somma viene quindi memorizzata nel campo checksum dell’intestazione
IP. Quando il frame IP viene ricevuto la somma a 16bit con complemento a uno
viene calcolata. Essendo il checksum calcolato da chi ha trasmesso il frame,
gia’ compreso nel frame stesso, il checksum calcolato dal ricevitore dovra’
avere tutti i bit a 1 (ffff in notazione esadecimale, cioe’ uno dei due possibili valori di 0 nella
rappresentazione dell’aritmetica a complemento a 1) se l’intestazione e’ stato
ricevuta correttamente.
Se il checksum contiene un solo bit diverso da 1 allora il
frame viene scartato e non viene generato nessun errore. Sara’ compito di uno
dei protocolli soprastanti IP (es TCP)
a richiedere la ritrasmissione del frame.
L’ordine di precisione nella rilevazione dei possibili
errori nell’internet checksum e’ di 1 bit ogni 65536 bit cioe’ la probabilita’
di un errore ogni 2^16-1 bit (cioe’ circa 3 x 10^-5), valore ritenuto
accettabile poiché gli errori a livello di frame IP sono da considerarsi rari
perché i frame IP sono a loro volta incapsulati in frame con un controllo piu’
efficace (es: il frame ethernet IEEE 802.3 esegue il controllo di errore usando
un CCITT CRC a 32 bit).
ICMP, IGMP, UDP e TCP tutti usano lo stesso metodo per
calcolare il checksum contenuto della loro intestazione.
Il checksum di TCP al contrario di quello calcolato e
verificato in IP contiene l’intero segmento TCP cioe’ sia l’intestazione che i
dati. Il checksum e’ un campo obbligatorio dell’intestazione IP e deve essere
calcolato e incluso dal mittente del frame e calcolato e verificato dal
destinatario del frame.
Il protocollo di trasporto TCP al contrario di UDP
fornisce un servizio di trasporto affidabile, basato su un collegamento logico
garantito e in grado di trasmettere dati in forma di byte o multipli di essi,
liberando completamente l’applicazione dalla verifica dell’integrita’ dei dati,
il loro recapito nella giusta sequenza.
Con collegamento logico si intende che le due applicazioni
che instaurano il collegamento devono collegarsi prima di cominciare a
scambiarsi i dati e se durante lo scambio dei dati il collegamento viene
abbattuto ambedue le applicazioni sono informate e non c’e’ modo che esse
ricevano dati errati. Il tipico esempio e’ dato da una comunicazione telefonica
dove prima di parlare si deve attendere che il chiamante componga il numero
telefonico da chiamare, attenda che la rete esegua la selezione, che il
chiamato risponda e che si identifichi.
In una comunicazione basata su TCP i due sono i soggetti
che stabiliscono la comunicazione bidirezionare utilizzando il TCP si affidano
completamente al protocollo in quanto questo fornisce le seguenti garanzie in
termini di integrita’ dei dati e affidabilita’ della comunicazione:
In un flusso di dati a 8 bit tra due applicazioni i dati
sono scambiati attraverso la connessione TCP direttamente tra le due
applicazioni. La comunicazione e’ totalmente trasparente. Non esiste alcun
carattere di fine linea o record inserito dal TCP. Se una applicazione trasmette
prima 10 byte, poi 20 byte e infine 30 byte, il ricevitore ricevera’ in totale
60 byte non potendo sapere le dimensioni originarie dei dati cosi’ come sono
stati inseriti dal mittente, in questo modo egli potra’ decidere di ricevere i
60byte tutti insieme oppure in 3 parti ognuna di 20byte.
Il mittente invia un certo numero di byte e gli stessi
arriveranno a destinazione.
Il TCP come detto e’ completamente trasparente, nel senso
che non esegue nessuna interpretazione sui dati trasmessi o ricevuti.
L’internet checksum usato da TCP (e anche da UDP) viene
calcolato come nel caso di IP. Rispetto a IP dove viene calcolato solo
sull’intestazione che ha lunghezza fissa e pari (20byte) i frame TCP o UDP
potrebbero risultare dispari. In questo caso il calcolo del checksum viene
normalizzato comunque a un numero pari di byte inserendo un byte a 0 come
ultimo. Inoltre sia TCP che UDP contengono una pseudo intestazione che serve
solo a calcolare il checksum. Questa pseudo intestazione include alcuni campi
presi dall’intestazione IP. Questo serve a far si che UDP o TCP verifichi
(oltre alla verifica fatta da IP sugli indirizzi) che il frame sia giunto alla
corretta destinazione.
UDP e’ un semplice protocollo di trasporto destinato a
trasmettere frame singoli senza garanzie di affidabilita’. I dati trasmessi da
un frame UDP non e’ garantito che vengano consegnati al destinatario ne esiste
una funzionalita’ propria di UDP che convalidi al mittente l’avvenuta ricezione
di un frame da parte del destinatario. Tutti gli eventuali controlli dovranno
venir svolti dall’applicazione soprastante. Come nel caso di TCP, UDP convalida
i frame che riceve utilizzando l’internet checksum sull’intero frame
(intestazione e dati) solo che mentre nel caso di TCP il checksum e’
obbligatorio in UDP esso e’ opzionale.
Controllo
e verifica dei dati nel protocollo ethernet IEEE 802.3
Un frame ethernet IEEE 802.3 contiene un codice di controllo e rivelazione di errore basato sul CCITT CRC 32bit.
Tutti i frame passati ai livelli superiori sono da considerare liberi da errori in quanto tutti i frame ricevuti con errori sono scartati.
L’ordine di precisione nella rilevazione dei possibili
errori del CCITT CRC a 32bit è il seguente:
Le comunicazioni dati realizzate mediante i protocolli di
comunicazione internet quando il mezzo di comunicazione e’ a sua volta un
protocollo che garantisce comunicazioni libere di errori come l’ethernet IEEE
802.3 sono da considerarsi affidabili e sicure per quanto riguarda l’integrità’
e il trasporto dei dati.
Il grado di sicurezza assoluto nel caso in cui i dati
siano trasportati in un bus ethernet IEEE 802.3 e’ pari a quello dell’ethernet
stesso, poiché tutte le elaborazioni successive (IP e TCP) vengono svolte a
livello hardware o software all’interno dei computer e comunque dove il
semplice internet checksum e’ in grado di garantire piena affidabilita’.
Se viceversa il frame IP dovesse essere trasmesso attraverso mezzi di comunicazione diversi quali modem o fibre ottiche occorre valutare caso per caso il grado di affidabilita’ del protocollo di collegamento utilizzato.
Appendice
Somma a complemento a 1
Somma a complemento a 2
Big-endian
e little-endian
I termini big-endian e little-endian servono a distinguere
quale tra i byte di un dato multi-byte (es una word a 16 byte o una double word
a 32bit) viene considerato piu’ significativo. In little-endian (usato ad
esempio nelle architetture Intel) il byte piu’ significativo e’ quello con
indirizzo piu’ alto (o nella rappresentazione scritturale piu’ a destra). In
big-endian (usato nelle architetture motorola (non PowerPC che sono bi-endian)
o nei mainframe IBM) il byte piu’ significativo e’ quello con indirizzo piu’
basso (o nella rappresentazione scritturale piu’ a sinistra).
Es:
il valore:
00000010
01000000 00010000 00000001 2401001 hex
Indirizzo |
Rappresentazione big-endian |
Rappresentazione little-endian |
00 |
00000010 |
00000001 |
Distanza di Hamming
L’efficienza di protezione di un codice (espressa dal
tasso di errore residuo, corrispondente agli errori non rilevati) è tanto
maggiore quanto piu’ le combinazioni significative del codice sono distinte le
une dalle altre. Si definisce distanza tra due combinazioni di un codice il
numero di posizioni in cui esse hanno simboli diversi. Per esempio, le
combinazioni 10101 e 11001 hanno distanza 2 perche’ differiscono nella seconda
e nella terza posizione, cio’ significa che sono necessari 2 errori semplici
per trasformare una di esse nell’altra. Per un dato codice si definisce
distanza di Hamming D, la minima distanza tra tutte le possibili combinazioni
significative. L’efficienza di protezione di un codice dipende dalla sua
distanza di Hamming, il minimo di protezione si ha per D = 2 corrispondente
alla possibilita’ di rilevazione di tutti gli errori singoli. E’ questo il caso
dei codici di controllo di parita’ nei quali le combinazioni differiscono tra
loro in almeno due posizioni, poiche’ il cambiamento di un bit di codice
comporta il cambiamento anche del bit di parita’. Per D=1 il codice è privo di
ridondanza e quindi di protezione.
Distanza di Hamming |
Ordine di molteplicita’ degli errori rivelabili |
Ordine di molteplicita’ degli errori correggibili |
1 |
- |
- |
2 |
1 |
- |
3 |
2 |
1 |
4 |
3 |
1 |
5 |
4 |
2 |