ICMP Header Probleme
-
Ich baue gerade in mein Netzwerkmodul eine Ping-Funktion ein auf Basis von
http://www.c-worker.ch/tuts/raw_icmp.phpProblem ist, dass ich nicht C nutze. Also ich habe das ganze in meiner Sprache nachgebastelt und konnte nun die meisten Fehlerquellen ausschließen. Der Echo Request wird richtig gesendet usw. und dann bleibt er bei recvfrom stehen, wartet das Timeout ab und dann kommt SOCKET_ERROR mit WSAGetLastError() = 0.
Ich denke, das Problem liegt bei ICMP genauer bei der Checksum. So sieht der Buffer aus, den ich versende:
http://vertex.dreamfall.at/icmp.gifBzw. nochmal alles unter der Lupe:
08 00 34 1B DC 07 00 00 05 46 B2 00 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 21 00 Type = 0x08 -> ECHO_REPLY Code = 0x00 Checksum = 0x341B ID = 0xDC07 -> CurrentProcessId() Sequency = 0x0000 Timestamp = 0x0546 -> GetTickCount() Data = 0xB20048656C6C6F2C20776F726C642100 -> "Hello, world!"Die Prüfsumme wird so berechnet:
http://eth0.graegert.com/index.php?page=96#ICMP Header ChecksumDas habe ich nochmal manuell gemacht:
Checksum Feld zu 0x0000 setzen, Einer-Komplement bilden:08 00 -> F7 FF -> 63487 00 00 -> FF FF -> 65535 DC 07 -> 23 F8 -> 9208 00 00 -> FF FF -> 65535 05 46 -> FA B9 -> 64185 B2 00 -> 4D FF -> 19967 48 65 -> B7 9A -> 47002 6C 6C -> 93 93 -> 37779 6F 2C -> 90 D3 -> 37075 20 77 -> DF 88 -> 57224 6F 72 -> 90 8D -> 37005 6C 64 -> 93 9B -> 37787 21 00 -> DE FF -> 57087Die ganzen Komplemente nun zusammenaddieren ergibt 598876 dezimal bzw. 10010010001101011100 binär. Die letzten 16 Bit herausfiltern damit das in ein Short passt: 0010001101011100 und dann davon das Einer-Komplement bilden:
1101110010100011 ergibt 0xDCA3 was von 0x341B abweicht.Setze ich 0xDCA3 als Checksumme geht es übrigens auch nicht. Also habe ich mich vllt. auch hier verrechnet.
Kann mir jemand mit dem C Code die Prüfsumme berechnen? Ist der Header überhaupt richtig aufgebaut?
mfg olli
Edit: Ich habe mit Wireshark die Pakete abgefangen, die mit ping von Windows gesendet werden(also das Programm, was man in der Konsole mit ping google.de bspw. aufruft). Dann habe ich den ICMP Puffer kopiert, mit meinem Modul gesendet und es ging. Es liegt also zu 99% an der falsch berechneten Prüfsumme.
-
Vertex schrieb:
Edit: Ich habe mit Wireshark die Pakete abgefangen, die mit ping von Windows gesendet werden(also das Programm, was man in der Konsole mit ping google.de bspw. aufruft). Dann habe ich den ICMP Puffer kopiert, mit meinem Modul gesendet und es ging. Es liegt also zu 99% an der falsch berechneten Prüfsumme.
dann schau dir mal an, was wireshark zu deinen paketen sagt.
wireshark erkennt auch falsche prüfsummen...

-
Hehe, ja, auf die Idee hätte ich wohl kommen müssen ^^ Wireshark hat es angezeigt "Checksum: 0xca14 [incorrect, should be 0x14ca]" es lag also an der Byteorder. Hatte zudem den Pointer immer mit Buffer :+ 2 erhöht dabei hätte es Buffer :+ 1 sein müssen(ich war von 2 ausgegangen, da er ja immer um 2 Byte verschoben werden musste)