Lowlevel

Lowlevel => Lowlevel-Coding => Thema gestartet von: supernicky am 17. October 2015, 14:08

Titel: Berechnung der Prüfsumme im TCP Header
Beitrag von: supernicky am 17. October 2015, 14:08
Hallo zusammen,

ich beschäftige mich zur Zeit mit der Netzwerkprogrammierung und möchte (muss) zum senden von Packeten
die Prüfsumme berechnen. Die Wikipedia Artikel sind wirklich gut, jedoch verstehe ich den Satz
Zitat
Die Prüfsumme ist das 16-Bit-Einerkomplement der Einerkomplement-Summe aller 16-Bit-Wörter im Header und der Nutzdaten des unterliegenden Protokolls
nicht ganz...

Hier erstmal mein empfangenes Packet als Beispiel:

Zitat
Ethernet Frame (14 Byte)
Ziel Mac                  Quelle Mac              Type
44:94:FC:13:61:AE    00:1E:C9:5C:3B:FB   0800

Zitat
IP Header (20 Byte)
Version       IHL       Gesamtlänge
0x45          0x0       0x34:0x0
Ident.         Flags/Fragment
0x1D85       0x4000
TTL/Prot     Prüfsumme
0x80/0x06   0x4C23
QuellIP  A:10:A8:C0         
ZielIP   58:8C:11:34


Zitat
TCP Header (20 Byte)
s-port         d-port
0xC01Ch      0x0050h
seqnr          0xE64C007Ch
acknr          0x3830A282h
off/flag        window
0x80/0x10    0x00FE
checksum     u-pointer
0xB06A        0x0

Zitat
Nutzerdaten (32 Byte)
0x1    0x1   0x5    0xA   0x38  0x30  0xA2  0x6D
0x38  0x30  0xA2  0x82  0x8B  0x8   0x25  0xF3
0x30  0x39  0x3A  0x33  0x38  0xAA 0xF2  0x22
0xB4  0xAB  0x99  0xD4  0x30  0x31 0x39  0x30

Zur Berechnung der Prüfsumme benötige ich die fett markierten Daten (Pseudoheader)
QuellIP  A:10:A8:C0         
ZielIP    58:8C:11:34
Prot       0x006
Länge    0x3400
0x1    0x1   0x5    0xA   0x38  0x30  0xA2  0x6D
0x38  0x30  0xA2  0x82  0x8B  0x8   0x25  0xF3
0x30  0x39  0x3A  0x33  0x38  0xAA 0xF2  0x22
0xB4  0xAB  0x99  0xD4  0x30  0x31 0x39  0x30

Nun liegen alle Header Daten im BigEndian Format vor. Müssen die Header Daten vorher nach LittleEndian
umgewandelt werden? Wie verfahre ich dann weiter?

Gruß und Danke

Nicky

Titel: Re: Berechnung der Prüfsumme im TCP Header
Beitrag von: kevin am 17. October 2015, 14:47
Ja, du musst die Big-Endian-Words zusammenzählen, also auf x86 erstmal jeweils in LE umwandeln, und erst ganz am Ende die Checksumme wieder in BE konvertieren. Falls die Anzahl der Bytes ungerade ist, musst du hinten mit einem 0x00 padden.

Außerdem musst du für die Checksumme nicht nur den Pseudoheader und die Daten, sondern auch den richigen TCP-Header berücksichtigen (und zwar in der Reihenfolge Pseudoheader, Header, Daten - falls die Länge der Daten ungerade ist, macht das einen Unterschied).