Comment détecter si le réseau perd des paquets UDP?

8

J'ai une application de streaming vidéo qui fonctionne bien dans mon bureau mais échoue lamentablement chez le client. Le symptôme est que toutes les deux secondes, j'arrête de recevoir des paquets UDP pendant 2 secondes, puis le flux reprend comme si de rien n'était.

J'ai couru http://www.pingtest.net/ chez le client et il est revenu excellent. Pas de paquets perdus et faible latence. La seule différence que j'ai remarquée entre nos deux sites est que les ping google.cadélais d'attente à leur emplacement mais fonctionnent dans le mien.

Comment puis-je tester si le réseau sur lequel je suis bloque les paquets UDP entrants? Existe-t-il un moyen pour moi d'isoler qui abandonne les paquets?

Gili
la source
Cela ressemble à un problème de pare-feu pour moi. Avez-vous des pare-feu logiciels ou matériels?
Pitto
Vous ne pouvez pas demander au client à quoi sa configuration réseau est définie?
Ramhound
@Ramhound, idéalement pas. Je ne veux pas avoir à fouiller dans les paramètres de routeur d'un client potentiel chaque fois que je veux faire une démonstration de mon produit :)
Gili
2
Les gars, veuillez expliquer vos votes négatifs, sinon je ne peux pas répondre.
Gili

Réponses:

4

Vous pouvez essayer d'établir une connexion UDP avec netcat.

Sur une machine A en dehors du réseau du consommateur, exécutez:

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

Notez le -uqui indique à netcat d'utiliser UDP. (Et sachez également qu'il existe différentes versions de netcat, qui auront besoin du -pparamètre ou non; étant donné les variantes des deux plus courantes (?), Toutes deux incluses dans Debian.)

Sur place des consommateurs: nc -u [addr of machine A] 1234.

Essayez d'envoyer du texte ou, mieux encore, utilisez des canaux pour envoyer un fichier entre les deux emplacements et effectuez ensuite une différence.

mpy
la source
Votre commande à distance échoue pour moi. La page de manuel indique -l« It is an error to use this option in conjunction with the -p, -s, or -z options.», j'ai donc corrigé la commande en une que j'ai testée pour fonctionner. De plus, j'ai changé «ip» en «addr» parce que les noms d'hôtes peuvent également être utilisés et sont en quelque sorte une «adresse».
James Haigh
@JamesHaigh: Je suis d'accord avec vous sur le point addrvs. ipMais maintenant, avec votre commande, j'obtiens une erreur: listen needs -p arg(j'ai également testé mes commandes données dans la réponse ;)). Il existe différents nc, si vous donnez plus de détails comme la version nc et / ou votre distribution, j'ajouterai une note à ma réponse.
mpy
Ah oui, c'est dommage qu'ils ne soient pas compatibles entre eux! :-( Ok, donc ma machine distante est Debian. La nccommande par défaut est un lien symbolique /bin/nc -> /etc/alternatives/nc -> /bin/nc.openbsdfourni par le paquet Debian netcat-openbsd. Ma machine Ubuntu locale a aussi nc.openbsdpar défaut. Aucun des deux n'acceptera -l -p. J'ai également installé ncatsur les deux machines à partir du nmappaquet Ubuntu / Debian. l'ancienne machine Debian, ncatrefuse -l -p, mais ncatsur Ubuntu accepte les deux façons. Bien que la version Debian doit être ancienne car elle n'a pas la --sctppossibilité de gêner.: - /
James Haigh
Ps Quelle est votre distribution et ncvariante? Je remarque qu'il existe également un netcat-traditionalpackage ' ', mais je n'ai pas essayé cela.
James Haigh
@JamesHaigh: J'utilise en effet netcat-traditional(v 1.10-38) car il est livré avec debian. Merci pour votre indice, j'ai maintenant inclus les deux variantes dans la réponse.
mpy
13

côté serveur, établissez un serveur UPD avec

iperf -s -u

côté client, vérifiez la connexion UDP avec

iperf -u -c <IP Address of Server>
ckarrie
la source
1
Telle est la vraie réponse. Cela nécessite d'avoir un accès au serveur de l'autre côté. Mais cela vous donne un retour direct sur la perte de paquets. Et vous pouvez également l'utiliser pour tester la bande passante TCP.
DragonFax
0

Les netcatcommandes de la réponse de mpy sont utiles à des fins de diagnostic, mais je complète cette réponse par une autre approche de votre problème sous-jacent.

Il peut être utile de faire retomber votre application sur SCTP , ou même TCP. J'ai trouvé cette question parce que je cherchais comment rejeter les paquets UDP entrants des utilisateurs utilisant plus que leur part de la liaison descendante lorsqu'elle est congestionnée, car contrairement à SCTP et TCP, UDP n'a pas de contrôle de congestion, ce qui rend très difficile la priorisation de la liaison descendante trafic.

SCTP et TCP ont tous deux un contrôle de la congestion et fonctionnent bien avec QoS, mais SCTP a l'avantage supplémentaire par rapport à TCP qu'il a été conçu pour les applications de streaming en temps réel, ce qui en fait un bon remplacement pour TCP et UDP. En effet, SCTP est le meilleur des deux protocoles de transport les plus courants.

Ce n'est pas une mauvaise idée d'avoir un repli, plutôt que de compter uniquement sur UDP. Même si vous ne retombez que sur TCP, vous pouvez au moins dire que cela fonctionne, peut-être tout simplement pas de manière optimale.

James Haigh
la source