You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 11 Next »

Skrevet av Vegard Flovikholm Farstad og Joar Krohn Mauseth

TDAT2004 - Datakommunikasjon med nettverksprogrammering

Tema 28 - Transportlaget: UDP header sjekksum

 

Litt om UDP

Oppbyggingen av en UDP-pakke (egentlig datagram):

Figur hentet fra forelesningsfoil: “Kapittel 4: Transportlaget”(Olav Skundberg, Innføring i datakommunikasjon)

 

UDP (User Datagram Protocol) er en protokoll som plasseres på transportlaget iht. OSI-modellen for lagdelt kommunikasjon. UDP er forbindelsesløst og upålitelig, men gir rask respons bl.a. p.g.a. lite pakkeoverhead, ingen tilstandsorientering og ingen retransmisjon av pakker.

 

Sjekksum er en headerlinje av pakkehodet som er frivillig (den kan settes til 0).
Sjekksum åpner opp for deteksjon av feil, og feilruting av pakker.

 De hovedsaklige prinsippene om UDPs virkemåte er nærmere forklart i forrige kapittel.

Ønsket funksjonalitet

Man ønsker å oppdage pakker som inneholder feil/har blitt utsatt for støy. Om man tar alle pakker for “god fisk”, kan man f.eks. ende opp med å sende svar til feil adresse, vise feil farger, spille høy lyd når det skulle vært stille, skyte en motspiller når man skulle skifte våpen, og lignende.

Virkemåte

RFC 768 - User Datagram Protocol sier at feltet checksum i UDP-datagrammet er beregnet på bakgrunn av:

  • En “pseudo-header”, med informasjon fra IP- og UDP-headeren

  • UDP-header

  • Nyttelast

 

Pseudo-headeren består av en samling av informasjon fra IP-headeren og UDP-headeren. Feltene som inngår i denne “pseudo-headeren” er:

  • Avsender- og mottakeradresse og protokollnummer fra IP-header.

  • Lengde fra UDP-header

 

Figur hentet fra UDP Checksum and Pseudo header

 

Sjekksummen beregnes hos sender og legges ved i feltet “checksum” i UDP pakken som sendes. Mottaker beregner selv en sjekksum og kontrollerer at denne utelukkende inneholder 1-ere. Hvis ikke, er vanlig praksis å forkaste pakken, eller sende pakken opp stakken til applikasjonslaget med en advarsel.

 

Metoden for å beregne sjekksummen er den samme som for TCP. Den går ut på å beregne en 16-bit 1-er komplement av summen av 1) “pseudo-headeren”, 2) UDP-headeren og 3) nyttelasten. Om nødvendig, paddes feltene med 0-oktetter for å operere med ledd av n*16-bits bredde.

Hvis sjekksummen angitt i UDP-headeren er 0, har ikke sender beregnet en sjekksum. Hvis sjekksummen beregnes til 0, skal den sendes som 0xFFFF, som er 1-er komplement til 0 (0x0000).

 

Eksempel på kalkulering og kontroll av sjekksum

Skal beregne sjekksummen til dette UDP datagrammet:

UDP-headere: Avsenderport: 60330, mottakerport: 80, lengde: 14. Nyttelast er ASCII for “HEI”. Vi skal sende fra IP adresse 192.168.1.45 til 192.168.1.22. UDP har protokollnummer 17 (0x21). Da ser pseudo-headeren vår slik ut:

 

 




Vi grupperer hvert felt av pseudo-headeren i segmenter på 16-bits hver.

(COA8+012D+C0A8+0116+0021+000E)16=183C216

Dere ser kanskje at summen på 20 bits, som gjør at vi får overflow på en 16-bits enhet. Vi gjør all mellomregning først, så tar vi hånd om dette til slutt, for husk; det er kun satt av 16-bits til checksum i UDP-headeren.

Nå som vi har summert feltene i pseudo-headeren, er det på tide å summere dette med feltene i UDP-headeren:

(183C2+EBAA+001E+000E+4845+0049)16=2B82616

Merk at vi har to tilfeller her. Når sender beregner sjekksum, er sjekksumfeltet i UDP headeren 0. Når mottaker beregner den, er den forskjellig fra 0.

 

Splitter summen i to deler: 0x47D9 og 0x0002, og summerer disse og får:

(1011 1000 0010 1000)2=B82816

Nå gjør vi en bitvis NOT operasjon og får 0x47D7

0x47D7 er sjekksummen.

 

Mottaker skal nå kontrollere at han har mottatt pakken uten feil. Da beregner han først sin egen sjekksum med samme framgangsmåte som beskrevet ovenfor.
La oss si at mottaker har mottatt pakken feil, slik at noen headerlinjer har feil verdier. Under beregning av sjekksum støter vi på følgende summering:

     1101 1000 1100 1101

+   0100 0010 1101 1011

=   0101 1011 1010 1000

(Dersom summen av 16. bit blir større enn 1, vil tillegget adderes inn bakfra)

=   0101 1011 1010 1001

= 0x5BA9

Adderer med sjekksummen oppgitt av sender:

   0101 1011 1010 1001

+ 0100 0111 1101 0111

= 1010 0011 1000 0000

1-er komplement av foreløpig sjekksum:

(0101 1100 0111 1111)2=5C7F16FFFF16

Sjekksummen inneholder ikke utelukkende 1-ere → mottaker vet at pakken inneholder feil.

Referanseliste

  • No labels