web-dev-qa-db-fra.com

Simuler des paquets retardés et abandonnés sous Linux

Je voudrais simuler le retard et la perte de paquets pour UDP et TCP sur Linux afin de mesurer les performances d'une application. Y a-t-il un moyen simple de faire cela?

231
Alec

netem exploite les fonctionnalités déjà intégrées à Linux et aux utilitaires d’espace utilisateur pour simuler des réseaux. C'est en fait ce à quoi la réponse de Mark fait référence, sous un nom différent.

Les exemples sur leur page d'accueil montrent déjà comment vous pouvez réaliser ce que vous avez demandé:

Exemples

Émulation des retards de réseau étendu

C'est l'exemple le plus simple, il ajoute simplement un délai fixe à tous les paquets sortant de l'Ethernet local.

# tc qdisc add dev eth0 root netem delay 100ms

Maintenant, un simple test de ping sur l'hôte sur le réseau local devrait indiquer une augmentation de 100 millisecondes. Le délai est limité par la résolution d'horloge du noyau (Hz). Sur la plupart des systèmes 2.4, l'horloge système fonctionne à 100 Hz, ce qui permet des retards par incréments de 10 ms. Sur 2.6, la valeur est un paramètre de configuration de 1000 à 100 Hz.

Les exemples suivants modifient simplement les paramètres sans recharger le qdisc

Les réseaux étendus réels présentent une variabilité, il est donc possible d'ajouter une variation aléatoire.

# tc qdisc change dev eth0 root netem delay 100ms 10ms

Cela provoque un retard supplémentaire de 100 ± 10 ms. La variation du délai réseau n'est pas purement aléatoire, donc émulons qu'il existe également une valeur de corrélation.

# tc qdisc change dev eth0 root netem delay 100ms 10ms 25%

Cela fait que le retard ajouté est de 100 ± 10 ms, le prochain élément aléatoire dépendant de 25% du dernier. Ce n'est pas une vraie corrélation statistique, mais une approximation.

Retarder la distribution

En règle générale, le retard dans un réseau n'est pas uniforme. Il est plus courant d'utiliser quelque chose comme une distribution normale pour décrire la variation du retard. La discipline netem peut prendre une table pour spécifier une distribution non uniforme.

# tc qdisc change dev eth0 root netem delay 100ms 20ms distribution normal

Les tables actuelles (normale, Pareto, parétonormale) sont générées dans le cadre de la compilation iproute2 et placées dans/usr/lib/tc; il est donc possible avec quelques efforts de créer votre propre distribution à partir de données expérimentales.

Perte de paquets

La perte de paquet aléatoire est spécifiée dans la commande 'tc' en pourcentage. La plus petite valeur possible non nulle est:

2−32 = 0.0000000232%

# tc qdisc change dev eth0 root netem loss 0.1%

Ceci provoque l’abandon aléatoire de 1/10ème de pour cent (1 sur 1000) paquets.

Une corrélation optionnelle peut également être ajoutée. Cela fait en sorte que le générateur de nombre aléatoire soit moins aléatoire et peut être utilisé pour émuler des pertes en rafales de paquets.

# tc qdisc change dev eth0 root netem loss 0.3% 25%

Cela entraînera la perte de 0,3% des paquets et chaque probabilité successive dépendra du quart de la dernière.

Probn = 0,25 × Probn-1 + 0.75 × au hasard

Notez que vous devez utiliser tc qdisc add si vous n'avez aucune règle pour cette interface ou tc qdisc change si vous avez déjà des règles pour cette interface. . Tenter d'utiliser tc qdisc change sur une interface sans règles générera l'erreur RTNETLINK answers: No such file or directory.

309
ephemient

Pour les paquets abandonnés, j'utiliserais simplement iptables et le module statistique .

iptables -A INPUT -m statistic --mode random --probability 0.01 -j DROP

Au-dessus, un paquet entrant sera abandonné avec une probabilité de 1%. Attention, tout ce qui dépasse 0.14 et la plupart des connexions TCP cesseront probablement complètement.

Jetez un coup d'œil à man iptables et recherchez "statistique" pour plus d'informations.

83

Un de mes collègues utilise tc pour cela. Reportez-vous à la page de manuel pour plus d'informations. Vous pouvez voir un exemple de son utilisation ici .

7
Mark

iptables (8) possède un module de statistiques qui peut être utilisé pour faire correspondre chaque nième paquet. Pour déposer ce paquet, ajoutez simplement - j DROP.

5
hillu

Ce tutoriel sur les simulations de physique en résea contient une classe C++ dans le exemple de code pour simuler le temps de latence et la perte de paquets dans une connexion UDP. Il peut être utile. Voir les variables public de latence et packetLoss des variables Classe Connection trouvée dans le fichier Connection.h de code source téléchargeable .

3
Judge Maygarden

Vous pouvez essayer http://snad.ncsl.nist.gov/nistnet/ C'est un projet assez ancien du NIST (dernière version en 2005), mais cela fonctionne pour moi.

1
Elalfer

L’un des outils les plus utilisés par la communauté scientifique à cette fin est DummyNet . Une fois que vous avez installé le module de noyau ipfw, pour introduire un délai de propagation de 50 ms entre 2 machines, exécutez simplement les commandes suivantes:

./ipfw pipe 1 config delay 50ms
./ipfw add 1000 pipe 1 ip from $IP_MACHINE_1 to $IP_MACHINE_2

Pour introduire également 50% des pertes de paquets, vous devez exécuter:

./ipfw pipe 1 config plr 0.5

Ici plus de détails.

1
gaetano

Je n'ai pas essayé moi-même, mais cette page a une liste de modules de plug-in qui s'exécutent dans le système de filtrage IP iptables intégré à Linux. L'un des modules s'appelle "nth" et vous permet de configurer une règle qui abandonnera un débit configurable des paquets. Peut-être un bon endroit pour commencer, au moins.

1
unwind

Un outil d’injection de panne de réseau facile à utiliser est Saboteur . Il peut simuler:

  • Partition réseau totale
  • Service distant hors service (n'écoute pas sur le port prévu)
  • Retards
  • Perte de paquet - délai de connexion TCP (comme cela arrive souvent lorsque deux systèmes sont séparés par un pare-feu avec état)
1
Alex Giotis