reti calcolo dell`errore

Transcript

reti calcolo dell`errore
Controllo dell'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.
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’ stata 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.
ICMP, IGMP, UDP e TCP tutti usano lo stesso metodo per calcolare il checksum contenuto della
loro intestazione.
Il checksum di TCP o di UDP, al contrario di quello calcolato e verificato in IP, contiene l’intero
segmento TCP o UDP cioe’ sia l’intestazione che i dati.
Mediante il calcolo del Checksum il protocollo di Trasporto riesce ad assicurare (non al 100%...) la
correttezza dei segmenti inviati.
Il procedimento è il seguente (uguale a quello già detto precedentemente illustrato per l'IP):
• I byte adiacenti sono presi a due a due per formare elementi a 16 bit; si esegue poi la loro
somma in C1 (complemento a 1) sommando anche i carry;
• il campo checksum viene posto a 0 e viene scritto al suo interno il C1 della somma
effettuata;
• Il ricevente esegue la somma in C1 (questa volta con il checksum all'interno); se il risultato
è FFFF tutto è OK.
Facciamo un esempio:
Simuliamo il controllo dell'errore in un trasferimento tramite il protocollo UDP.
• Nel calcolo del checksum UDP dovremmo tener conto di HEADER, PSEUDO-HEADER,
DATI.
• Il datagramma trasferito sarà composto ad esempio da: 01 00 F2 03 F4 F5 F6 F7 00 00 (00
00 campo usato per il checksum).
• Formiamo le word a 16-bit : 0100 F203 F4F5 F6F7.
• Calcoliamo la somma: 0100 + F203 + F4F5 + F6F7 = DEEF con un carry di 0002.
• Sommiamo i carry accumulati 0002 per ottenere la somma in C1: DEEF + 002 = DEF1.
• Adesso calcoliamo il C1 della somma : ~DEF1 = 210E [CHECKSUM].
• Spediamo il pacchetto con incluso il checksum : 01 00 F2 03 F4 F5 F6 F7 21 0E.
• Il ricevente calcola il suo checksum : 0100 + F203 + F4F5 + F6F7 + 210E = 0002 FFFD
FFFD + 0002 = FFFF (tutto ok!!!).
Esercizio:
Una applicazione client/server utilizza il protocollo UDP. In un determinato istante un client con
indirizzo IP 160.80.10.11 utilizzando la porta numero 1025 invia un segmento UDP, contenente 2
byte di dati di valore 3 e 6 (in formato decimale), al server. Il server ha indirizzo 160.80.10.32 e
ascolta le richieste alla porta numero 7. Scrivete il formato del segmento UDP specificando in
particolare il valore dei campi contenuti nel segmento inviato dal suddetto client.
Pseudo-header
Source IP: A0 50 A B
Destination IP: A0 50 A 20
UDP-Header
Source port: 401
Destination port: 7
Lenght: 2
Checksum: A721
Data
3
6
401(source port)+
7(destination port)+
2(lenght)+
A050(client IP)+
A0B(client IP)+
A050(server IP)+
A20(server IP)+
3(data)+
6(data)=
58DE+1 di carry->58DFh=0101 1000 1101 1111b=>complemento a 1=>
1010 0111 0010 0000b=A721h