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?
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
.
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.
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 .
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.
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 .
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.
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.
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.
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)