Linux - Kann ich UDP-Pakete duplizieren, senden und dann deduplizieren?

649
davidgo

Ich übertrage UDP-Daten über zwei auf Linux (Intel) basierende Router und erlebe geringe Paketverluste, die die Anwendung beeinträchtigen.

Gibt es eine Möglichkeit (idealerweise, aber nicht notwendigerweise mit iptables verbunden), kann ich jedes UDP-Paket empfangen und zwei Kopien davon senden, wobei das zweite Paket verworfen wird (wenn beide Pakete ankommen)? Mir ist bewusst, dass dies die doppelte Bandbreite benötigt und ich bin damit einverstanden.

2
Das ist eine schlechte Lösung. Wie gehen Sie mit dem Fall um, wenn beide Datagramme verloren gehen? Haben Sie sich mit Reliable UDP, RUDP oder RDP (Reliable Datagram Protocol) befasst? sawdust vor 6 Jahren 0
@sawdust - Vielen Dank für diese Optionen, aber ich sehe nicht, wie ich sie in meinem Anwendungsfall einsetzen kann. Ich habe versucht, die Offenlegung zu vermeiden, aber ich versuche, einen Hacker in einem VOIP-Netzwerk zu blockieren, in dem ich die Clients oder Server nicht ändern kann - und dabei einen sehr geringen Paketverlust (deutlich weniger als 1%) feststellen. Ich bin auch nicht in der Lage, mit dem starken Jitter umzugehen, der durch die erneute Übertragung verlorener Pakete über die mäßig lange Fernverbindung verursacht wird. Außerdem ist die Schaltung immer sehr überspannt und hat eine Flatrate von 100% CIR, daher ist es in Ordnung, Bits zu verschwenden. davidgo vor 6 Jahren 0
@sawdust - Die Verbindung wird NUR für VOIP verwendet. Sie müssen also keine Mischung aus großen und kleinen Paketen oder eine unruhige Verwendung abwickeln. davidgo vor 6 Jahren 0
Ich weiß wenig darüber, daher mag dies eine dumme Idee sein, aber ... Was wäre, wenn Sie UDP-Pakete über ein VPN übergeben, das TCP verwendet? Würden sie nicht effektiv die Zuverlässigkeit von TCP gewinnen? Kamil Maciorowski vor 6 Jahren 0
@ KamilMaciorowski - Danke für den Gedanken, aber das würde die Sache noch verschlimmern. Dadurch würden die UDP-Frames erneut gesendet, was zu mehr Jitter führt, was für eine VoIP-Verbindung nicht geeignet ist. davidgo vor 6 Jahren 0
Ich vermute, dass Sie ohne ARQ keine Zuverlässigkeit erreichen können. Wenn Sie jedoch Datagramme replizieren und als Paar senden, erhöhen Sie die Chance, beide zu verlieren (durch einen Rauschpuls von x-Dauer). Sie können die Wahrscheinlichkeit verringern, beide zu verlieren, indem Sie die doppelten Datagramme trennen, dh das Senden des replizierten Datagramms um den Zeitpunkt x verzögern. Aber vielleicht verstehen Sie besser, warum Sie überhaupt die Datagramme verlieren. IE möglicherweise gibt es etwas, das getan werden könnte, um die Verlustrate zu verringern. sawdust vor 6 Jahren 1
@sawdust Vielen Dank dafür. Ich akzeptiere, dass meine Lösung erhebliche Einschränkungen aufweist, aber da die Verbindungen nicht in die Nähe von drahtlosen Verbindungen gehen, gehe ich davon aus, dass das Problem damit zusammenhängt, dass Pakete von Upstream-Routern verworfen werden - über die ich keine Kontrolle habe - und ich erkenne, ob ich dies tun kann erneut senden ist die Chance groß, dass eine der 2 durchkommt. Ich habe gerade das "Abschlag" -Modul für iptables entdeckt und versuche jetzt herauszufinden, ob ich damit einen brauchbaren Hack ausspielen kann! davidgo vor 6 Jahren 0
Ich stimme @sawdust zu. Wenn Sie nicht sehr viel Datenverkehr durch die Verbindung schieben, sollten Sie nicht so viele UDP-Pakete verwerfen. Ich finde, auch Standard-Internetverbindungen übertragen UDP von Ende zu Ende nahezu fehlerfrei bei jeder für VoIP geeigneten Bandbreite. Sie können iPerf verwenden, um einige Tests der UDP-Qualität und Bandbreite durchzuführen. Ich denke, die Antwort darauf, um herauszufinden, warum Sie den Paketverlust haben. Ist es ein Router, ein QoS, eine verrauschte Leitung, ein ausgefallenes Modem usw. Ich wette, Sie könnten es sogar auf eine Seite der Verbindung eingrenzen, indem Sie das Problem an einem dritten Standort testen. Appleoddity vor 6 Jahren 1
@Appleoddity Der Grund, warum ich Probleme habe, ist, dass das terrestrische Internet in Australien unglaublich schlecht ist. Ich habe einen Paketverlust, weil die kabelgebundene Infrastruktur durch die Politik beeinträchtigt wurde (landesweites Glasfaser-Rollout in CBD nicht verfügbar?). Ich bekomme eine 5-mal schnellere Verbindung zu meinem Landhaus als das 3 (telco) gebündelte Paar in Melbourne CBD, das 5-mal so viel kostet - ich mache das nicht auf - https://delimiter.com.au/2016/03 / 24 / australia-huge-slip-global-breitband-rankings / davidgo vor 6 Jahren 0

1 Antwort auf die Frage

1
dirkt

Wenn eine Anwendung UDP-Pakete überträgt, muss sichergestellt sein, dass einige (oder sogar viele) dieser Pakete verworfen werden.

Die Anwendung muss sich also damit befassen (z. B. Echtzeit-Audio- oder -Videodaten, bei denen die fehlenden Informationen einfach ignoriert werden und die Qualität beeinträchtigen, weil Sie Pakete nicht erneut senden können), oder sie muss ihr eigenes Protokoll implementieren, um eine erneute Übertragung zu gewährleisten. oder es muss ein anderes Protokoll verwenden, das eine eventuelle Lieferung garantiert.

Das Implementieren eines externen Layers "Senden Sie nur 2 Kopien" ist keine Lösung. Ja, ich weiß, dass du das nicht hören willst, aber es stimmt.

Schreiben Sie also die Anwendung neu, um das richtige Protokoll zu verwenden.

Alternativ können Sie die Pakete über eine andere Anwendung tunneln, die ein ordnungsgemäßes Protokoll (Tun / Tap-Schnittstelle) implementiert. Wenn Sie darauf bestehen, "nur Pakete zu duplizieren", um ein ordnungsgemäßes Protokoll zu sein (es ist nicht schwierig, eine solche Anwendung zu schreiben, google für Beispielprogramme für TUN / TAP), probieren Sie es aus und prüfen Sie, ob es funktioniert (es funktioniert nicht).

Dies beantwortet die Frage in keiner Weise. Ich könnte dies als Kommentar akzeptieren, aber keine Lösung. Wie bereits gesagt, habe ich keine Möglichkeit, die Clients (SIP-Telefone) oder den Server zu ändern. Dies sind in der Regel standardmäßige SIP-Komponenten (die von einem Drittanbieter gesteuert werden). Möchten Sie Ihre Antwort löschen und einen Kommentar abgeben? davidgo vor 6 Jahren 0
Wenn es sich um SIP-Telefone handelt, geben Sie dies bitte in die Frage ein. Fügen Sie keine zusätzlichen Informationen in Kommentaren ein, bearbeiten Sie die Frage. Und die Antwort bleibt gleich: Wenn Sie einen starken UDP-Paketverlust feststellen, muss die Anwendung damit umgehen. dirkt vor 6 Jahren 0
Es geht nicht um SIP-Telefone. Es geht darum, UDP-Pakete zu duplizieren und zu deduplizieren. Als Netzwerkadministrator möchte ich die Leistung eines Links verbessern, über den ich eingeschränkte Kontrolle ausüben kann. davidgo vor 6 Jahren 0