LabVIEWForum.de - TCP - UDP Checksumme

LabVIEWForum.de

Normale Version: TCP - UDP Checksumme
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo,

kann mir jemand sagen wie sich die TCP, bzw. UDP Blöcke bezüglich der Checksumme verhalten?

Muss bei UDP die Checksumme mit in den Daten liegen, bzw. sind die Daten die Rohdaten incl. Header oder packt LV den Header drum herum? Vermutlich nicht, sonst könnte man ja irgendwo den Port für Ziel und Quelle angeben, oder?

Wie ist das beim TCP-Block? Wird dort die Checksumme automatisch generiert und mit geschickt, bzw. geprüft beim Empfangen?

Vielen Dank.
Gruß
Michael
Hallo Michael,

wenn du ein UDPWrite aufrufst, dann übergibst du hier NUR deine Nutzdaten. Alles weitere erledigt entweder LabVIEW oder der Netzwerktreiber des Betriebssystems!

Du musst dir über irgendwelche Checksummen in den Datenpaketen, die dann über den Ethernet-Port gehen, keinerlei Gedanken machen…

Zitat:könnte man ja irgendwo den Port für Ziel und Quelle angeben, oder?
Das kann man doch: Ports werden beim Öffnen der UDP-Referenz angegeben - und beim UDPWrite…
Hallo GerdW,

nutzt denn LV die CRC bei UDP? Es besteht ja auch die Möglichkeit in das CRC-Feld 0 einzutragen, dann wird die CRC nicht berücksichtigt.
Wenn die CRC genutzt wird, nach welchem Verfahren wird sie gebildet? Wie es unter Wikipedia UDP beschrieben ist?

Berechnung der Prüfsumme (Quelle Wikipedia: http://de.wikipedia.org/wiki/User_Datagram_Protocol )

Die Berechnung der Prüfsumme beim Sender erfolgt nach folgendem Algorithmus:

Setze das Prüfsummenfeld im UDP-Header auf 0000 0000 0000 0000.
Erzeuge eine vorzeichenlose 32-Bit-Zahl für die Prüfsumme, initialisiere sie mit Nullen.
Fasse direkt benachbarte Bytes des UDP-Paketes zu 16-Bit-Blöcken zusammen. Falls der letzte Block weniger als 16 Bit hat, dann fülle ihn von hinten mit Nullen auf, bis er 16 Bit hat.
Speichere das Ergebnis der Addition aller 16-Bit-Blöcke mit Übertrag in der Prüfsumme.
Fasse direkt benachbarte Bytes des Pseudo-Headers zu 16-Bit-Blöcken zusammen.
Speichere das Ergebnis der Addition dieser 16-Bit-Blöcke und der bisherigen Prüfsumme mit Übertrag in der Prüfsumme.
Fasse direkt benachbarte Bytes der Prüfsumme zu zwei 16-Bit-Blöcken zusammen, addiere diese und speichere das Ergebnis mit Übertrag in der Prüfsumme, bis kein Übertrag mehr bei der Addition entsteht.
Die signifikantesten 16 Bit der 32-Bit-Prüfsumme sind nun Nullen. Die weniger signifikanten Bits sind die eigentliche Prüfsumme; speichere diese als vorzeichenlose 16-Bit-Zahl.
Wenn diese 16-Bit-Zahl nicht nur aus Einsen besteht, dann speichere ihr Einerkomplement im UDP-Header (sowohl 1111 1111 1111 1111 und das Einerkomplement hiervon, 0000 0000 0000 0000, symbolisieren die Zahl 0). In IPv4 UDP wird 0000 0000 0000 0000 auch verwendet, um zu signalisieren, dass keine Prüfsumme berechnet wurde. IPv6-UDP-Pakete mit der Prüfsumme 0000 0000 0000 0000 sind ungültig (RFC 6935).

Der Empfänger prüft zunächst, ob das Prüfsummenfeld des empfangenen Paketes nur aus Nullen besteht. Wenn ja, kann er das Paket als richtig empfangen werten, da keine Prüfsumme vorhanden ist. Wenn nicht, so wendet er den oben beschriebenen Algorithmus auf das empfangene Paket und den zugehörigen Pseudo-Header an, lässt den letzten Schritt weg und addiert die selbst berechnete Prüfsumme auf die im Prüfsummenfeld empfangene, was durch die Einerkomplementdarstellung einer Subtraktion entspricht. Erhält der Empfänger 0 als Ergebnis der Addition (bzw. Subtraktion), so wertet er die empfangenen Daten als mit den gesendeten übereinstimmend.
Hallo Michael,

noch einmal:
- Du stellst in LabVIEW NUR das Datenfeld in der UDP-Botschaft bereit.
- Alles andere macht der Netzwerktreiber des Betriebssystems…

Was willst du EIGENTLICH erreichen und wissen?
Ich muss mit einem embedded System kommunizieren. Zuerst war UDP angedacht, womit die Frage aufkam nach welchem Verfahren die CRC gebildet werden muss.
Dann dachte ich an TCP, weil ich davon ausging das bei TCP die CRC automatisch generiert wird. Nachdem ich aber im Netz nichts ausagekräftiges gefunden habe, habe ich mich hier ans Forum gewandt.
Hallo michael,

ich musste bei Nutzung von UDP (zwischen verschiedensten Rechnern und "EmbeddedControls") bisher nie irgendeine Checksumme ausrechnen/bereitstellen…
Wenn Du in dem CRC-Feld eine 0 eingetragen hast, wird die auch nicht geprüft. Ergo funktioniert alles.

Hast Du nur die eignetlichen Nutzdaten übertragen?

Ein UDP-Datagramm besteht ja aus Quell-Port, Ziel-Port, Länge, Prüfsumme und Daten.

Oder hast Du den Header aus Quell-Port, Ziel-Port, Länge und Prüfsumme davor gepackt?
Hallo Michael,

ich wiederhole mich erneut:
Zitat:wenn du ein UDPWrite aufrufst, dann übergibst du hier NUR deine Nutzdaten
Nein, keine zusätzlichen Header.
Die Zieladresse wird woanders festgelegt!

Auf einem cRIO sieht das bei mir so aus:
[attachment=51446]
Das "Format MSG"-VI erzeugt den String mit den NUTZDATEN…
Referenz-URLs