IP-Header Checksum



  • Hallo Forenmitglieder,

    ich weiß zu diesem Thema gibt es hunderte Beiträge und Artikel im Netz, aber helfen können sie mir trotzdem nicht wirklich. Ich weiß das sich die Prüfsumme aus der Summe aller 16 Bit Halbwörtern + 0 und dessen Einerkomplement ergibt. Allerding stoße ich immer wieder beim Thema Raw Sockets auf folgenden checksum Algorithmus:

    unsigned short csum(unsigned short *buf, int nwords)
    {       //
            unsigned long sum;
            for(sum=0; nwords>0; nwords--)
                    sum += *buf++;
            sum = (sum >> 16) + (sum &0xffff); // Ab dieser Stelle beginnt das Unverständnis
            sum += (sum >> 16);
            return (unsigned short)(~sum);
    }
    

    Ab der Stelle (

    sum = (sum >> 16) + (sum &0xffff);
    

    ), an der ,die um 16 Bit nach recht verschobene Summe mit der ,mit -0 verglichenen Summe addiert wird, versteh ich nichts mehr. Wenn ich diesen Algorithmus mit Beispielwerten bestücke kommt bei der Prüfung niemals -0 raus. Und die nächste Anweisung versteh ich auch nicht

    sum += (sum >> 16);
    

    Könnte man nicht einfach folgendes schreiben:

    unsigned short csum(unsigned short *buf, int nwords)
    {       //
            unsigned short sum;
            for(sum=0; nwords>0; nwords--)
                    sum += *buf++;
            return ~sum;
    }
    


  • luggas schrieb:

    Könnte man nicht einfach folgendes schreiben:

    Damit würdest du die bei der Addition entstehenden Überträge wegwerfen. Einerkomplement-Addition funktioniert leider etwas anders.



  • MFK schrieb:

    edit: Unsinn

    Was ist unsinnig?
    Dieser Kommentar bringt mich nicht wieter.



  • luggas schrieb:

    Was ist unsinnig?

    Was ich zuerst dort geschrieben hatte.

    luggas schrieb:

    Dieser Kommentar bringt mich nicht wieter.

    Entschuldige bitte, ich werde daran arbeiten, den Service zu verbessern. Von jetzt an lasse ich meinen Unsinn stehen, das ist offenbar besser für dich.



  • luggas schrieb:

    Entschuldige bitte, ich werde daran arbeiten, den Service zu verbessern. Von jetzt an lasse ich meinen Unsinn stehen, das ist offenbar besser für dich.

    Tut mir leid ich bin der Foren-Syntax nicht ganz mächtig 🙂

    Ich dachte es wär auf meinen Beitrag bezogen.



  • luggas schrieb:

    Könnte man nicht einfach folgendes schreiben:
    ...

    Solange bei der vorhergehenden Addiererei der Wertebereich von 16 bit nicht überschritten wird, läuft das mM aufs Selbe hinaus.
    Anderenfalls wird sum noch mal in linke und rechte 16 bits zerlegt und die beiden Werte addiert.
    Das wird dann gleich nochmal mal gemacht, für den Fall, dass bei dieser Addition ein weiterer Überlauf auftritt. So wird verhindert, dass Informationen einfach verloren gehen.



  • Achso danke 👍
    Das ist sehr einleuchtend.

    Und bei der Prüfung wird der gleich Algorithmus verwendet und einfach mit der empfangenen Prüfsumme addiert, und da muss dann 0 raus kommen oder?



  • luggas schrieb:

    Und bei der Prüfung wird der gleich Algorithmus verwendet und einfach mit der empfangenen Prüfsumme addiert, und da muss dann 0 raus kommen oder?

    Ich habe da keine Ahnung von, ich habe lediglich das obige Stückchen analysiert und zu verstehen versucht.



  • OK du hast mir trotzdem geholfen dank 😃


Log in to reply