Wie baue ich eine UDP-Verbindung ein, um den Widerstand gegen Paketverlust zu verbessern?

1275
Vi.

Angenommen, es gibt eine UDP-Verbindung, die nicht viel Paketverlust erwartet.

Gibt es bereits Tools, die das Umschließen einer UDP-Verbindung ermöglichen, um bei Bandbreiten und Overhead mehr Zuverlässigkeit zu erzielen, z. B. mithilfe von Reed-Solomon-Codes.

Erwartete Nutzung:

host1$ someprogram --listen-udp 127.0.0.1:1234 host1$ reedsolomon_udp --listen 0.0.0.0:1235 --connect 127.0.0.1:1234  host2$ reedsolomon_udp --connect host1:1235 --listen 127.0.0.1:1234 host2$ someprogram --connect-udp 127.0.0.1:1234 

Es ist nicht zu erwarten, dass die Lösung Verluste vollständig beseitigt. Es wird erwartet, dass sie diese Verluste reduziert, insbesondere wenn mehr als 50% der Pakete verloren gehen.

2
Es wurden einige Papiere dazu geschrieben, aber ich habe noch nie eine tatsächliche Implementierung gesehen: https://tools.ietf.org/html/rfc6865 und http://www.mai.ru/science/trudy/eng/published .php? ID = 14801 & eng = Y, was leider nur eine Zusammenfassung ist AaronLS vor 9 Jahren 0

2 Antworten auf die Frage

2
John

Wenn das Programm zuverlässige Verbindungen erwartet, muss TCP und nicht UDP verwendet werden. UDP ist auf Protokollebene nicht gegen Verlust geschützt - es ist nur ein Best-Delivery-System. TCP ist ein System mit garantierter Lieferung.

Das UDP-Programm kann mit einem Verlust von beispielsweise etwa 2% rechnen. Der tatsächliche Verlust kann beispielsweise 70% betragen. Ich muss ein sehr unzuverlässiges Netzwerk "Gedankenhämmern". Es wird nicht erwartet, dass das fragliche Programm die Verluste beseitigt, sondern die Anzahl der Verluste verringert. Vi. vor 11 Jahren 0
Eigentlich wird TCP innerhalb des UDP-Tunnels sein. TCP funktioniert jedoch schlecht, wenn viele Pakete verloren gehen. Ich überlege mir, "reedsolomon_udp" selbst zu implementieren, aber zuerst hier zu fragen, weil vielleicht jemand irgendwo nach so etwas bereits etwas implementiert hat. Vi. vor 11 Jahren 0
TCP in einem UDP-Tunnel? Du fragst nach Problemen. Wenn Sie den Paketverlust reduzieren möchten, müssen Sie das fehlerhafte Netzwerk bereinigen. Wenn Sie eine TCP-Verbindung innerhalb eines UDP-Tunnels einschließen (es gibt wirklich nichts), und dann versuchen, sie erneut umzuwickeln, um Paketverluste zu reduzieren, werden Sie aufgrund des exponentiellen Back-Off sehr schnell in einen Endlos-Wartezustand versetzt Eigenschaften der TCP-Sitzung. John vor 11 Jahren 0
I want this as a solution to "clean up dirty network" that I can't control (as workaround). And what's wrong with "TCP inside UDP tunnel"? It's not TCP inside TCP. For example, Teredo uses this and doesn't seem to trouble... Vi. vor 11 Jahren 0
Was Sie wollen, existiert nicht. TCP in UDP ist schlecht. Teredo ist für IPv6-Inside-IPv4 vorgesehen, das sich auf einer anderen Schicht des Protokollstapels befindet, also nicht zutreffend. Du steckst fest. Bereinigen Sie das Netzwerk oder lassen Sie es bereinigen oder behandeln Sie den Paketverlust. Dies sind Ihre einzigen praktischen Entscheidungen. John vor 11 Jahren 0
It will be TCP inside TUN/TAP inside UDP. `Clean up the network` -> not always possible. `What you want doesn't exist.` -> OK. I just don't like to discover after a while that a program was actually already written (but I didn't known about that). Vi. vor 11 Jahren 0
Das Implementieren eines Zuverlässigkeitsprotokolls auf Anwendungsebene über UDP ist manchmal besser als TCP. TCP leidet stark unter kleinen Paketverlusten, da der gesamte Stream angehalten wird, während die Zeitgeber für die erneute Übertragung ablaufen, um verlorene Pakete erneut zu senden. Das Fenster wird in dieser Zeit häufig gefüllt, sodass die Leistung erheblich beeinträchtigt wird. Durch die Implementierung der Vorwärtsfehlerkorrektur können Sie einen kleinen Paketverlust tolerieren und möglicherweise eine höhere Leistung erzielen. Natürlich wäre eine solche Implementierung, die alles erledigt, was TCP tut, eine große Herausforderung. AaronLS vor 9 Jahren 0
0
Beel

ARQ ist der Name einer Methodenfamilie, von der eine Variante von TCP verwendet wird. Einige Varianten werden manchmal verwendet, um UDP zu "wickeln".

Beim Videostreaming kann beispielsweise UDP verwendet werden, um den TCP-Aufwand zu vermeiden. In einigen Fällen wird eine Vielzahl von ARQ verwendet, um die Zuverlässigkeit eines MPEG-Transportstroms zu erhöhen, der Video über das Internet transportiert. Eine solche Vielzahl von ARQ soll einen geringeren Overhead als TCP erzeugen und gleichzeitig die Zuverlässigkeit des Empfangens des Videostroms erhöhen.

Eine ausführlichere Diskussion und eine Liste der Referenzen finden Sie in diesem Wikipedia-Artikel: https://en.wikipedia.org/wiki/Automatic_repeat_request