Forum: Mikrocontroller und Digitale Elektronik Fehlerkorrigierender Code


von Hamming (Gast)


Lesenswert?

Bei einer UDP-Übertragung möchten wir Übertragungsfehler erkennen und 
nach Möglichkeit auch korrigieren.

Wir suchen deshalb momentan ein oder mehrere gute Fachbücher und 
Webseiten, die zu diesem Thema praxisrelevante Informationen liefern.
Über entsprechende Tipps würden wir uns sehr freuen.

Schon mal Danke für alle Hinweise :-)

von Peter II (Gast)


Lesenswert?

das Hauptproblem bei UDP ist aber nicht das packet defekt sind, sondern 
das packete in der falschen reihenfolge oder doppelt oder überhaupt 
nicht ankommen. Wenn nichts ankommt kannst du auch nicht korrigieren.

Fehlerkorrektur hat mit UDP recht wenig zu tun, eventuell mal getrennt 
danach suchen.

von Hamming (Gast)


Lesenswert?

Peter II schrieb:
> Fehlerkorrektur hat mit UDP recht wenig zu tun, eventuell mal getrennt
> danach suchen.

Danke für den Hinweis, Du hast natürlich vollkommen recht.
Uns interessiert an dieser Stelle in erster Line die Vorgehensweise zur 
Fehlererkennung und -korrektur.

von Udo S. (urschmitt)


Lesenswert?

Erkennung über übliche CRC Verfahren. Oder Hash Funktionen.
Korrektur über redundante Daten. Müsste aber auch suchen was für 
Protokolle da existieren und am günstigsten sind.
Dazu müsstet ihr aber erst mal spezifizieren, welche Arten von Fehlern 
noch korrigiert werden sollen.
1 Bit pro Byte, 2 Bit pro Byte, einzelne Bytes pro Paket, ...
Eventuell auch mal bei fehlerkorrigierendem Ram oder bei RAID anschauen 
wie die es machen.

von Uwe (Gast)


Lesenswert?


von Frank K. (fchk)


Lesenswert?


von (prx) A. K. (prx)


Lesenswert?

Udo hat Recht: Es ergibt wenig Sinn, ohne eine Vorstellung von Art und 
Dimension auftretender Fehler jetzt alle möglichen Verfahren in die 
Runde zu werfen. So ist es beispielsweise ein erheblicher Unterschied, 
ob es eher Einzelbitfehler oder eher Burstfehler sind, oder ob man 
aufgrund des UDP-Verfahrens ohnehin immer ganze Frames abschreiben muss.

So sind ja UDP-Frames im Ethernet durch eine CRC abgesichert. Wenn die 
Fehler also auf dieser Übertragungsebene stattfinden, dann muss man 
immer komplette Frames abschreiben und sich Gedanken darüber machen, wie 
man komplette Frames ersetzt.

von Hamming (Gast)


Lesenswert?

@ A. K.

Überwiegend haben wir es mit einzelnen Bitfehlern zu tun. Burstfehler 
kommen aber auch vor.

Es ist ganz klar, dass wir nicht jedes UDP-Paket retten können. Trotzdem 
freuen wir uns über alle Daten, die (direkt oder restauriert) fehlerfrei 
ankommen.

von Udo S. (urschmitt)


Lesenswert?

Und ihr seid auch sicher daß UDP der richtige Weg ist? (TCP?)

von (prx) A. K. (prx)


Lesenswert?

Information-Hiding bringt dich hier nicht weiter. Mit normal betriebenen 
Ethernet-Interfaces sind defekte Frames nicht zu retten, egal ob 1 Bit 
futsch ist oder alle.

von Peter II (Gast)


Lesenswert?

Hamming schrieb:
> Überwiegend haben wir es mit einzelnen Bitfehlern zu tun. Burstfehler
> kommen aber auch vor.

wie kann das sein? damit sollte der die CRC auf der MAC ebende schon 
falsch sein und damit das Packet überhaupt nicht ankommen.

dann gibt es scheinbar sogar eine Prüfsumme im UDP selber:

http://de.wikipedia.org/wiki/User_Datagram_Protocol

wenn ihr bitfehler habt, dann habt ihr eventuell auf dem gerät defekten 
RAM.

von Hamming (Gast)


Lesenswert?

Udo Schmitt schrieb:
> Und ihr seid auch sicher daß UDP der richtige Weg ist? (TCP?)

Ja, wir können nur eine begrenzte Anzahl von Daten übertragen und 
möchten (trotz nicht vermeidbarer Störungen) möglichst viele fehlerfreie 
Daten erhalten.

von Han s. (Firma: HH) (puh)


Lesenswert?

Wenn ich Daten direkt über physikalische Leitungen übertrage (per SPI, 
I2C oder sowas), dann machen fehlerkorrigierende Kodierungen Sinn.

Bei Ethernet / UDP nicht. -> OSI-Schichtenmodell. Siehe auch Peter IIs 
Kommentar:

Peter II schrieb:
> wie kann das sein? damit sollte der die CRC auf der MAC ebende schon
> falsch sein und damit das Packet überhaupt nicht ankommen.

Das heisst mit eurer Fehlerkorrektur würdet ihr einfach nur Ressourcen 
verschwenden, ein bisschen Rechnen, aber ohne Sinn. Die Korrektur wird 
nie anspringen.

von (prx) A. K. (prx)


Lesenswert?

Hamming schrieb:
> Ja, wir können nur eine begrenzte Anzahl von Daten übertragen und
> möchten (trotz nicht vermeidbarer Störungen) möglichst viele fehlerfreie
> Daten erhalten.

Es wäre klüger, mal etwas über die Aufgabenstellung und die 
Übertragungsstrecke zu verraten.

von Han s. (Firma: HH) (puh)


Lesenswert?

A. K. schrieb:
> Übertragungsstrecke

Wahrscheinlich Ethernet.

von Hamming (Gast)


Lesenswert?

Han sel schrieb:
> Das heisst mit eurer Fehlerkorrektur würdet ihr einfach nur Ressourcen
> verschwenden, ein bisschen Rechnen, aber ohne Sinn. Die Korrektur wird
> nie anspringen.

Das verstehe ich nicht. Welchen Sinn macht dann die Prüfsumme in 
UDP-Paketen?

von Han s. (Firma: HH) (puh)


Lesenswert?

Hamming schrieb:
> Welchen Sinn macht dann die Prüfsumme in UDP-Paketen?

Die filtert fehlerhafte Paket heraus, so dass die selbstgebaute 
Fehlerkorrektur des TOs nichts zu korrigieren hätte.

von Hamming (Gast)


Lesenswert?

Han sel schrieb:
> Die filtert fehlerhafte Paket heraus,

Wir können aber versuchen, statt die fehlerhaften Pakete wegschmeißen zu 
lassen, diese Pakete zu retten.

von Han s. (Firma: HH) (puh)


Lesenswert?

Hamming schrieb:
> Wir können aber versuchen, statt die fehlerhaften Pakete wegschmeißen zu
> lassen, diese Pakete zu retten.

Dann ist das kein UDP mehr, sondern ein selbstgestricktes IP-Protokoll.
Im übrigen können UDP-Pakete an jedem Netzwerkknoten aufgrund 
fehlerhafter Prüfsumme verworfen werden. Das muss nicht zwingend am 
letzten (Ziel-)knoten passieren.

von Hamming (Gast)


Lesenswert?

Han sel schrieb:
> Im übrigen können UDP-Pakete an jedem Netzwerkknoten aufgrund
> fehlerhafter Prüfsumme verworfen werden.

Stimmt das wirklich?
Bei wikipedia ist zu lesen:
"Die Prüfsumme ist optional, wird aber in der Praxis fast immer benutzt, 
falls nicht, wird diese auf „0” gesetzt."

von (prx) A. K. (prx)


Lesenswert?

Hamming schrieb:
> Das verstehe ich nicht. Welchen Sinn macht dann die Prüfsumme in
> UDP-Paketen?

UDP ist einen Ebene oberhalb von Ethernet und auch mit anderen 
Übertragungsarten einsetzbar. Die optionale(!) UDP-Checksum ist keine 
effektive Sicherung gegen Übertragungsfehler, sondern nur eine grobe 
Konsistenzprüfung.

von (prx) A. K. (prx)


Lesenswert?

Hamming schrieb:
> Han sel schrieb:
>> Im übrigen können UDP-Pakete an jedem Netzwerkknoten aufgrund
>> fehlerhafter Prüfsumme verworfen werden.
>
> Stimmt das wirklich?

Eine fehlerhafte UDP-Prüfsumme ist nicht das Gleiche wie eine nicht 
vorhandene UDP-Prüfsumme.

von Udo S. (urschmitt)


Lesenswert?

Hamming schrieb:
> Udo Schmitt schrieb:
>> Und ihr seid auch sicher daß UDP der richtige Weg ist? (TCP?)
>
> Ja, wir können nur eine begrenzte Anzahl von Daten übertragen und
> möchten (trotz nicht vermeidbarer Störungen) möglichst viele fehlerfreie
> Daten erhalten.

Ja und? Was sollte da UDP an Vorteilen gegenüber TCP bieten?
UDP:
verbindungslos
keine Reihenfolge garantiert
Empfang von Daten nicht sicher
Pakete werden überall hingeschickt

TCP ist verbindungsorientiert, voll duplexfähig, Reihenfolge ist 
gesichert ...
hat also nur Vorteile.

Kling für mich wieder mal nach: "Ich will das aber mit dem Mittel A 
machen, auch wenn Methode B oder C besser sind"
Ich mag mich ja täuschen...

von (prx) A. K. (prx)


Lesenswert?

Hamming schrieb:
> Wir können aber versuchen, statt die fehlerhaften Pakete wegschmeißen zu
> lassen, diese Pakete zu retten.

Nur wenn du es schaffst, sie aus dem Ethernet-Controller überhaupt raus 
zu fischen.

von (prx) A. K. (prx)


Lesenswert?

Udo Schmitt schrieb:
> Ja und? Was sollte da UDP an Vorteilen gegenüber TCP bieten?

TCP benötigt im Prinzip mehr Pufferspeicher. Offiziell mindestens 2 
Frames, sonst wirds hässlich.

Nur hat er das Problem dann natürlich an anderer Stelle. Jedes 
Verfahren, das verlorene UDP Frames retten kann, hat ein ähnliches 
Problem.

von Rene S. (Firma: BfEHS) (rschube)


Lesenswert?

Es ist doch eigentlich so wie Udo Schmitt es schreibt.

UDP ist per Definition für schnelleren Datenverkehr, dafür mit einigen 
Nachteilen bei der Sicherheit und Stabilität der Datenübertragung 
erfunden. UDP-Light auch...

TCP ist dann das entsprechende Gegenstück dazu.

Also sollte man überlegen welches Werkzeug man für welchen Zweck 
einsetzt.

Mit einem Flammenwerfer bekommt man ein BGA auch gelötet. Ob es sinnvoll 
ist muss jeder selbst entscheiden.

von Axel G. (axelg) Benutzerseite


Lesenswert?

was du eigentlich machen möchtest.

von Udo S. (urschmitt)


Lesenswert?

A. K. schrieb:
> TCP benötigt im Prinzip mehr Pufferspeicher. Offiziell mindestens 2
> Frames, sonst wirds hässlich.

Ok, ich habe das nicht im Kontext zu einem µC mit wenig Memory gesehen, 
mein Fehler :-).
Aber wie du gesagt hast, wenn er die Vorteile die TCP bietet von Hand 
drum herum stricken will, dann braucht er den Speicher genauso.

von (prx) A. K. (prx)


Lesenswert?

Rene Schube schrieb:
> UDP ist per Definition für schnelleren Datenverkehr,

Das ist eine mögliche Begründung von UDP, aber nicht die einzige. Bei 
NFS ist aber mittlerweile auch TCP recht verbreitet.

Auch bei 1:N Verbindungen kann UDP sinnvoller sein als TCP, unabhängig 
vom Tempo.

Wenn der IP-Layer auf einem Medium mit geduldigem Retry sitzt, dann kann 
TCP tödlich sein, weil bei zeitweiligen aber vom IP-Layer nicht 
identifizierbaren Ausfällen des Mediums sonst die TCP-Retries den Kanal 
regelrecht verstopfen können (ein Fall aus der Praxis, da gab es 3 
Retry-Layer übereinander, je tiefer desto geduldiger - das war falsches 
Design von A bis Z).

von (prx) A. K. (prx)


Lesenswert?

UDP kann auch dann (hier?) erforderlich sein, wenn es wichtiger ist, den 
neuesten Stand der Daten zu haben, als wirklich alle Daten zu haben.

von Hamming (Gast)


Lesenswert?

A. K. schrieb:
> UDP kann auch dann (hier?) erforderlich sein, wenn es wichtiger ist, den
> neuesten Stand der Daten zu haben, als wirklich alle Daten zu haben.

Das ist der Fall.

Bei nicht korrekt übertragenen Daten würden die fehlenden Daten durch 
die zuletzt gültigen Daten ersetzt werden.

von (prx) A. K. (prx)


Lesenswert?

Zwei einfache Beispiele dafür, wie man Blöcke fester Länge ohne grossen 
Rechenaufwand redundant übertragen kann, wenn jeder einzelne Block 
bereits per CRC gesichert ist - hier also einem UDP-Frame im Ethernet 
entspricht. Sie benötigen aber Puffer für einige Blöcke:

(1) N Blöcke übertragen und währenddessen einen weiteren Block aufbauen, 
der ein XOR-Summe über die Daten der Blöcke bildet. Also Byte 0 vom 
XOR-Block ist Byte 0 vom ersten Block XOR Byte 0 vom zweiten Block usw. 
Diesen XOR-Block anschliessend senden. Innerhalb dieser N+1 Gruppe ist 
ein Block rekonstruierbar.

(2) Wenn grössere Burst-Fehler wahrscheinlich sind (Funkstrecke, 
Bandspeicher) und daher oft zwei aufeinander folgende Blöcke defekt 
sind, dann kann man das eben beschriebene Verfahren modifizieren und die 
geraden und ungeraden Blöcke in zwei XOR-Blöcken getrennt akkumulieren. 
Dann sind zwei aufeinander folgende Blöcke immer rekonstruierbar.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.