Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet 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
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:
Ethernet Frame (14 Byte)
Ziel Mac Quelle Mac Type
44:94:FC:13:61:AE 00:1E:C9:5C:3B:FB 0800
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
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
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
-
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).