IP Header Checksum Algorithmus

Hallo.
Vor kurzem hab ich mich mal in WinPCAP eingelesen und jetzt auch versucht ein IP-Paket zu erstellen. Klappt alles wunderbar nur die Checksumme ist bei mir immer Grundsätzlich falsch. Mit Raw Sockets gabs dieses Problem nicht, da der Kernel den IP Header ja selbst berechnet aber ich find keinen Algo der mir den berechnet.
Die beschreibung hab ich bereits gefunden:
http://www.ietf.org/rfc/rfc791.txt (IP Protokoll)
Beim TCP Protokoll wird die Checksumme genauso berechnet:
http://www.ietf.org/rfc/rfc793.txt (TCP Protokoll)
Wenn ich aber den Algorithmus vom TCP Protokoll zum berechnen des IP-Headers verwende bekomm ich einen falschen Wert.
Google findet auch nur Funktionen zu für die TCP Checksumme und nicht für den IP Header.
Hat jemand ne Funktion oder noch besser, nen Sourcecode?
 
So, hab jetzt 3 verschiedene Funktionen mal ausprobiert (u.a. die von www.koders.com) aber immer liefert die Funktion mir eine total andere Checksumme zurück. Ich hab mal gegoogled aber es gibt wirklich keine Seite auf der der Algorithmus näher erklärt wird. Überall wird nur gelabert dass der Header auf 0 gesetzt wird und jeder Router die neu berechnen muss.
Ich muss doch nur der drecks Funktion den IP-Header übergeben und die Länge, also 20, oder? Klappt aber nicht. Gibts da auch so nen Pseudoheader wie bei TCP oder was geht da? Kann doch net sein dass noch nie jemand von euch selber ein IP Paket erstellt hat...
 
Original von v01d
Ich muss doch nur der drecks Funktion den IP-Header übergeben und die Länge, also 20, oder?
kommt drauf an. mit den optionalen zusatzangaben ist der header länger als 20 bytes.

hier ist ein extra RFC zur ckecksum: http://www.faqs.org/rfcs/rfc1071.html
unter 4.1 ist auch nochmal ein beispiel code. ist offensichtlich das grundgerüst des codes von koders.com, aber etwas anders (sieht einfacher aus).
probiers mal mit dem und überprüfe folgendes:
- addr zeigt auf den anfang des IP headers
- daten des headers müssen natürlich zusmammenhängend sein
- im checksum feld des headers muss vor der berechnung eine 0 stehen (0000000000000000)
 
Oh mann ich könnt mich so schlagen, ne...
Ich hatte nen ziemlich billigen Fehler im restlichen Code, der mir erst aufgefallen ist, nachdem ich tonnenweise codes durchgeguckt hatte. Ich hatte vergessen die Länge des IP Pakets im IP Header ins Big Endian Format umzuwandeln. Die Checksums waren dadurch natürlich komplett falsch. Die gesnifften Pakete hatten aber die richtige Länge eingetragen und somit die richtige Checksumme auch berechnet. Btw die IP Checksumme berechnet sich übrigends genauso wie die TCP/UDP Checksumme.
Danke trotzdem für die Hilfe.
 
Zurück
Oben