2.2.3 UDP-Prüfsumme

Anders als bei IP fließen bei UDP und TCP das gesamte Paket, also Kopf und Daten, sowie ein Pseudo-Kopf (Pseudo-Header) in die Berechnung der Prüfsumme ein. Bei UDP ist die Prüfsumme optional, bei TCP dagegen obligatorisch. Der Algorithmus zur Berechnung der UDP-Prüfsumme ähnelt stark dem bei IP verwendeten Verfahren:

Die UDP-Prüfsumme ist das 16-Bit-Einerkomplement der durch Addition benachbarter 16-Bit-Wörter berechneten Einerkomplement-Summe von Pseudo-Kopf, UDP-Kopf und Daten. Bei einer ungeraden Länge des UDP-Datagramms wird ein Null-Byte am Ende angehängt, um immer 16 Bit addieren zu können.

Dieser an sich sehr einfache Algorithmus hat einige interessante Eigenschaften, die verschiedene Optimierungen in den Implementierungen zulassen. Im RFC 1071 werden mehrere Techniken und Algorithmen diskutiert, die eine effizientere Berechnung der Internet-Prüfsumme gestatten. Diese Feinheiten wollen wir allerdings hier nicht weiter vertiefen.

Diejenigen unter Ihnen, die sich für eine praktische Realisierung der Prüfsummenberechnung interessieren, sollten sich die C-Funktion udpcksum aus dem Betriebssystem XINU ansehen, die auch im zweiten Band des Buches Internetworking with TCP/IP von Douglas Comer und David Stevens enthalten ist. Eine leicht modifizierte, mit deutschen Kommentaren versehene Version dieser Routine finden Sie in der Datei udpcks.c.

Die XINU-Implementierung zeichnet sich nicht durch besondere Effizienz, sondern durch Übersichtlichkeit aus, so daß ein C-Programmierer den Code schnell analysieren und ggf. portieren kann. In vielen anderen Systemen wurde die Routine entweder sehr stark optimiert bzw. direkt in Assembler geschrieben, was nicht gerade zum Verständnis beiträgt. Die Wahl der Sprache C erfolgte übrigens nicht zufällig. In der praktischen Netzwerk-Programmierung findet sie sehr häufig Verwendung.

Der bereits erwähnte Pseudo-Kopf umfaßt einige Felder des IP-Kopfes. Dadurch soll seitens UDP sichergestellt werden, daß ein Paket auch beim richtigen Empfänger angekommen ist. Fälschlicherweise kann es passieren, daß die IP-Schicht ein Datagramm akzeptiert, obwohl es nicht an den betreffenden Host adressiert ist, oder dessen Nutzlast einem falschen Transportprotokoll (z.B. UDP statt TCP) zuleitet.

Der Pseudo-Kopf hat folgende Struktur:

Da die Länge des UDP-Datagramms sowohl im UDP-Kopf als auch im Pseudo-Kopf enthalten ist, geht sie doppelt in die Berechnung der Prüfsumme ein.

Sofern sich als Ergebnis der Prüfsummenberechnung eine Null ergibt, so wird statt dessen eine 65535 (alle Bits gleich 1) übertragen. In der Einerkomplement-Darstellung entspricht das der negativen Null (ja, die gibt es wirklich). Die Null (alle Bits gleich 0) hat eine Sonderbedeutung. Dieser Wert signalisiert, daß überhaupt keine Prüfsumme berechnet wurde.

Trifft beim Empfänger ein Datagramm mit einer falschen Prüfsumme ein, so wird es stillschweigend verworfen, d.h., UDP generiert keine Fehlermeldung. Diesbezüglich verhält es sich wie IP.

Die UDP-Prüfsumme hat End-zu-End-Charakter. Sie wird vom Sender berechnet und durch den Empfänger geprüft. Sie dient der Feststellung von Veränderungen des Datagramms während des Transports. Deshalb empfiehlt es sich, die optionale Prüfsumme immer zu verwenden.

Da die Prüfsummenberechnung natürlich eine gewisse Rechenleistung "verbraucht", verzichteten einige Hersteller z.B. bei NFS-Implementierungen darauf, um eine bessere "Performance" nachweisen zu können. Im LAN mag das noch gutgehen, weil die heute üblichen LAN-Technologien (Ethernet, ...) eine eigene Prüfung vornehmen. Bei WAN-Anwendungen hingegen ist dringendst davon abzuraten (z.B das bekannte SLIP-Protokoll enthält keine eigene Prüfung).


© Holger Trapp, 22.5.1998