Wie erkenne ich, ob das Netzwerk UDP-Pakete verwirft?

8

Ich habe eine Video-Streaming-Anwendung, die in meinem Büro einwandfrei funktioniert, aber beim Kunden kläglich ausfällt. Das Symptom ist, dass ich alle paar Sekunden 2 Sekunden lang keine UDP-Pakete mehr empfange und der Stream dann fortgesetzt wird, als ob nichts falsch wäre.

Ich habe http://www.pingtest.net/ am Kundenstandort ausgeführt und es kam ausgezeichnet zurück. Keine verworfenen Pakete und geringe Latenz. Der einzige Unterschied, den ich zwischen unseren beiden Standorten festgestellt habe, ist die ping google.caZeitüberschreitung an ihrem Standort, die jedoch in meinem funktioniert.

Wie teste ich, ob das Netzwerk, in dem ich mich befinde, eingehende UDP-Pakete blockiert? Gibt es eine Möglichkeit für mich zu isolieren, wer die Pakete verwirft?

Gili
quelle
Klingt für mich nach einem Firewall-Problem. Haben Sie Software- oder Hardware-Firewalls?
Pitto
Sie können den Kunden nicht fragen, auf welche Netzwerkkonfiguration er eingestellt ist?
Ramhound
@ Ramhound, im Idealfall nicht. Ich möchte nicht jedes Mal, wenn ich mein Produkt
Gili
2
Leute, bitte erklärt eure negativen Stimmen, sonst kann ich nicht antworten.
Gili

Antworten:

4

Sie können versuchen, eine UDP-Verbindung mit herzustellen netcat.

Auf einem Computer A außerhalb des Verbrauchernetzwerks laufen:

nc -u -l -p 1234            # if using netcat-traditional
nc -u -l 1234               # if using netcat-openbsd (as pointed out by @JamesHaigh)

Beachten Sie, -uwas netcat anweist, UDP zu verwenden. (Und beachten Sie auch, dass es verschiedene Versionen von gibt netcat, die den -pParameter benötigen oder nicht; angegeben sind die Varianten für die beiden häufigsten (?), Die beide in Debian enthalten sind.)

Am Verbraucherstandort : nc -u [addr of machine A] 1234.

Versuchen Sie, Text zu senden, oder verwenden Sie Pipes, um eine Datei zwischen beiden Speicherorten zu senden, und führen Sie anschließend einen Diff durch.

mpy
quelle
Ihr Remote-Befehl schlägt für mich fehl. Die Manpage sagt für -l" It is an error to use this option in conjunction with the -p, -s, or -z options.", also habe ich den Befehl auf einen korrigiert, den ich getestet habe, um zu funktionieren. Außerdem habe ich 'ip' in 'addr' geändert, da auch Hostnamen verwendet werden können und gewissermaßen eine 'Adresse' sind.
James Haigh
@ JamesHaigh: Ich stimme dir in Bezug auf den addrvs.- ipPunkt zu. Aber jetzt mit Ihrem Befehl erhalte ich eine Fehlermeldung: listen needs -p arg(Ich habe meine in der Antwort angegebenen Befehle auch getestet ;)). Es gibt verschiedene NCs da draußen. Wenn Sie weitere Details wie die NC-Version und / oder Ihre Distribution angeben, werde ich meiner Antwort eine Notiz hinzufügen.
Mpy
Oh, richtig, es ist eine Schande, dass sie nicht miteinander kompatibel sind! :-( Ok, mein Remote-Computer ist Debian. Der Standardbefehl ncist Symlink, /bin/nc -> /etc/alternatives/nc -> /bin/nc.openbsdder vom Debian-Paket bereitgestellt wird netcat-openbsd. Mein lokaler Ubuntu-Computer hat nc.openbsdstandardmäßig auch. Keiner akzeptiert -l -p. Ich habe auch ncatauf beiden Computern aus dem nmapUbuntu / Debian-Paket installiert . Ein Die ältere Debian-Maschine ncatlehnt ab -l -p, ncatakzeptiert aber unter Ubuntu beide Möglichkeiten. Obwohl die Debian-Version uralt sein muss, da sie ärgerlicherweise keine --sctpOption hat .: - /
James Haigh
Ps Was ist deine Distribution und ncVariante? Ich stelle fest, dass es auch ein netcat-traditionalPaket gibt, aber das habe ich nicht ausprobiert.
James Haigh
@ JamesHaigh: Ich benutze tatsächlich netcat-traditional(v 1.10-38), da es mit Debian geliefert wird. Vielen Dank für Ihren Hinweis, ich habe jetzt beide Varianten in die Antwort aufgenommen.
Mpy
13

Richten Sie auf der Serverseite einen UPD-Server mit ein

iperf -s -u

Überprüfen Sie auf der Clientseite die UDP-Verbindung mit

iperf -u -c <IP Address of Server>
ckarrie
quelle
1
Das ist die wahre Antwort. Es erfordert Serverzugriff auf der anderen Seite. Sie erhalten jedoch eine direkte Rückmeldung zum Paketverlust. Und Sie können damit auch die TCP-Bandbreite testen.
DragonFax
0

Die netcatBefehle in der Antwort von mpy sind für Diagnosezwecke nützlich, aber ich ergänze diese Antwort mit einem anderen Ansatz für Ihr zugrunde liegendes Problem.

Es kann sich lohnen, Ihre Anwendung auf SCTP oder sogar TCP zurückzugreifen. Ich habe diese Frage tatsächlich gefunden, weil ich nach Möglichkeiten gesucht habe, eingehende UDP-Pakete von Benutzern abzulehnen, die mehr als ihren Anteil am Downlink verwenden, wenn dieser überlastet ist, da UDP im Gegensatz zu SCTP und TCP keine Überlastungskontrolle hat, was es sehr schwierig macht, den Downlink zu priorisieren der Verkehr.

Sowohl SCTP als auch TCP verfügen über eine Überlastungskontrolle und spielen gut mit QoS. SCTP bietet jedoch gegenüber TCP den zusätzlichen Vorteil, dass es für Echtzeit-Streaming-Anwendungen entwickelt wurde und somit ein guter Ersatz für TCP und UDP ist. Tatsächlich ist SCTP das beste der beiden am häufigsten verwendeten Transportprotokolle.

Es kann keine schlechte Idee sein, einen Fallback zu haben, anstatt sich nur auf UDP zu verlassen. Selbst wenn Sie nur auf TCP zurückgreifen, können Sie zumindest sagen, dass es funktioniert, vielleicht einfach nicht optimal.

James Haigh
quelle