Utilisez tc pour simuler le retard du réseau et la perte de paquets sous Linux

1. Introduction à la transmission analogique retardée

netem et tc: netem est un module de fonction de simulation de réseau fourni par Linux 2.6 et versions supérieures du noyau. Ce module de fonction peut être utilisé pour simuler des performances de transmission Internet complexes dans un réseau local avec de bonnes performances, telles qu'une faible bande passante, un retard de transmission et une perte de paquets. De nombreuses distributions Linux qui utilisent le noyau Linux 2.6 (ou supérieur) ont cette fonctionnalité de noyau activée, comme Fedora, Ubuntu, Redhat, OpenSuse, CentOS, Debian, etc. tc est un outil du système Linux, le nom complet est contrôle du trafic (contrôle de flux). tc peut être utilisé pour contrôler le mode de travail de netem. Autrement dit, si vous voulez utiliser netem, vous avez besoin d'au moins deux conditions, l'une est que la fonction netem dans le noyau soit incluse, et l'autre est d'avoir tc.

Il convient de noter que le contrôle de flux présenté dans cet article ne peut contrôler que l'action d'envoi de paquets, mais pas l'action de réception de paquets. En même temps, il prend effet directement sur l'interface physique. Si eth0 physique est contrôlé, la carte réseau logique (telle que eth0: 1) sera également Impact, au contraire, si vous contrôlez sur la carte réseau logique, le contrôle peut être invalide. (Remarque: plusieurs cartes réseau dans la machine virtuelle peuvent être considérées comme plusieurs cartes réseau physiques dans la machine virtuelle).

tc qdisc add dev eth0 root netem delay 100ms

//该命令将 eth0 网卡的传输设置为延迟 100 毫秒发送
  • 1
  • 2
  • 3

Dans une situation plus réaliste, la valeur de retard ne sera pas si précise, il y aura certaines fluctuations, nous pouvons utiliser la situation suivante pour simuler la valeur de retard avec volatilité:

tc qdisc add dev eth0 root netem delay 100ms 10ms

//该命令将 eth0 网卡的传输设置为延迟 100ms ± 10ms (90 ~ 110 ms 之间的任意值)发送
  • 1
  • 2
  • 3

Vous pouvez encore renforcer le caractère aléatoire de cette fluctuation:

tc qdisc add dev eth0 root netem delay 100ms 10ms 30%

//该命令将 eth0 网卡的传输设置为 100ms , 同时大约有 30% 的包会延迟 ± 10ms 发送
  • 1
  • 2
  • 3

2. Simulez la perte de paquets réseau

tc qdisc add dev eth0 root netem loss 1%

//该命令将 eth0 网卡的传输设置为随机丢掉 1% 的数据包
  • 1
  • 2
  • 3

Vous pouvez également définir le taux de réussite de la perte de paquets:

tc qdisc add dev eth0 root netem loss 1% 30%

//该命令将 eth0 网卡的传输设置为随机丢掉 1% 的数据包, 成功率为 30% 
  • 1
  • 2
  • 3

3. Supprimez la configuration appropriée sur la carte réseau

Modifiez ajouter dans la commande précédente à del pour supprimer la configuration

tc qdisc del dev eth0 XXXXXX(自己加的配置)

//该命令将 删除 eth0 网卡的相关传输配置
  • 1
  • 2
  • 3

À ce stade, nous pouvons déjà simuler un certain retard de réseau et une perte de paquets dans l'environnement de test via TC. Voici d'autres applications et introductions à propos de tc.

4. Répétez le package de simulation

tc qdisc add dev eth0 root netem duplicate 1%

//该命令将 eth0 网卡的传输设置为随机产生 1% 的重复数据包 
  • 1
  • 2
  • 3

5. Corruption de paquets de données simulés

tc qdisc add dev eth0 root netem corrupt 0.2%

//该命令将 eth0 网卡的传输设置为随机产生 0.2% 的损坏的数据包(内核版本需在 2.6.16 以上)
  • 1
  • 2
  • 3

6. Les paquets de données analogiques sont hors service

tc qdisc change dev eth0 root netem delay 10ms reorder 25% 50%

//该命令将 eth0 网卡的传输设置为有 25% 的数据包(50%相关)会被立即发送,其他的延迟10 秒
  • 1
  • 2
  • 3

Dans la nouvelle version, les commandes suivantes perturberont également l'ordre d'envoi des paquets dans une certaine mesure:

tc qdisc add dev eth0 root netem delay 100ms 10ms
  • 1

7. Affichez les conditions de réseau configurées

tc qdisc show dev eth0

//该命令将查看并显示 eth0 网卡的相关传输配置
  • 1
  • 2
  • 3

8. Introduction au contrôle de flux TC

Sous Linux, TC a deux méthodes de contrôle CBQ et HTB HTB est conçu pour remplacer CBQ. Il s'agit d'un cadre de filtrage hiérarchique.

TC comprend trois éléments de base: la discipline de file d'attente qdisc (discipline de file d'attente), la classe (classe) et le classificateur (classificateurs)

(1) Discipline de file d'attente en TC

Utilisé pour atteindre la vitesse de transmission et de réception du réseau de contrôle. Grâce à la file d'attente, Linux peut mettre en cache les paquets de données réseau, puis selon les paramètres de l'utilisateur, fluidifier le trafic réseau sans interrompre autant que possible la connexion (comme TCP).

Il convient de noter que Linux ne contrôle pas bien la file d'attente de réception, donc nous n'utilisons généralement que la file d'attente d'envoi, c'est-à-dire que "le contrôle de l'envoi ne contrôle pas la réception". Il encapsule les deux autres principaux composants TC (classes et classificateurs). Si le noyau doit envoyer un paquet de données via une interface réseau, il doit ajouter le paquet de données à la file d'attente conformément au qdisc (règle de mise en file d'attente) configuré pour cette interface. Ensuite, le noyau prendra autant de paquets de données de qdisc que possible et les donnera au module de pilote de carte réseau.

Le QDisc le plus simple est pfifo. Il n'effectue aucun traitement sur les paquets de données entrants. Les paquets de données transitent par la file d'attente selon le principe du premier entré, premier sorti. Cependant, il enregistre les paquets que l'interface réseau ne peut pas gérer pendant un certain temps.

Les règles de file d'attente incluent FIFO (premier entré, premier sorti), RED (détection précoce aléatoire), SFQ (file d'attente aléatoire équitable) et compartiment de jetons (Token Bucket), file d'attente basée sur les classes (CBQ), CBQ est une super file d'attente, c'est-à-dire qu'elle peut contenir Autres files d'attente (même autres CBQ).

(2) Classe en TC

La classe est utilisée pour représenter la stratégie de contrôle. De toute évidence, il peut arriver que nous devions implémenter différentes stratégies de contrôle de flux pour différentes adresses IP. À ce stade, nous devons utiliser différentes classes pour représenter différentes stratégies de contrôle.

(3) Filtrer les règles dans TC

Le filtre est utilisé pour classer les utilisateurs en stratégies de contrôle spécifiques (c.-à-d. différentes classes). Par exemple, nous voulons implémenter différentes stratégies de contrôle (A, B) pour les deux adresses IP xxa et xxb. À ce stade, nous pouvons utiliser le filtre pour classer xxa dans la stratégie de contrôle A, xxb dans la stratégie de contrôle B et l'indicateur de division de filtre. Les bits peuvent être implémentés avec la fonction de marquage u32 ou la fonction set-mark IPtables (principalement en utilisant iptables pour le marquage).

À l'heure actuelle, les filtres que TC peut utiliser sont: le classificateur fwmark, le classificateur u32, le classificateur basé sur la route et le classificateur RSVP (respectivement utilisés pour IPV6, IPV4), etc. Le classificateur fwmark nous permet d'utiliser le code netfilter Linux pour sélectionner le trafic, tandis que le classificateur u32 nous permet de sélectionner le trafic en fonction de l'en-tête ANY. Il convient de noter que les filtres sont à l'intérieur de QDisc et qu'ils ne peuvent pas être utilisés comme sujets.

(4) Processus de demande de TC

Paquet de données-> iptables (lors du passage d'iptables, iptables définit une marque différente selon différents ip-> TC (classe) -> TC (file d'attente)

(5) Application

Il est supposé que le bit eth0 est l'interface réseau externe du serveur. Avant de commencer, effacez d'abord toutes les règles de file d'attente eth0

tc qdisc del dev eth0 root 2> /dev/null > /dev/null
  • 1

1) Définissez la règle de file d'attente la plus haute (racine) et spécifiez le numéro de catégorie par défaut

tc qdisc add dev eth0 root handle 1: htb default 2
  • 1

2) La définition de la catégorie 1: 1 (vitesse) de la première couche était à l'origine de définir plus de catégories de feuilles de la deuxième couche, mais pour l'instant, cela suffit dans cette application.

tc class add dev eth0 parent 1:1 classid 1:2 htb rate 98mbit ceil100mbit prio 2 
tc class add dev eth0 parent 1:1 classid 1:3 htb rate 1mbit ceil 2mbit prio 2
  • 1
  • 2

Remarque: Ce qui précède est la vitesse à laquelle nous contrôlons le serveur de sortie, l'une est 98M, l'autre est 2M.

rate: est la valeur de bande passante garantie par une classe. S'il y a plus d'une classe, veuillez vous assurer que la somme de toutes les sous-classes est inférieure ou égale au
prio de la classe parent : utilisé pour indiquer la compétitivité lors de l'emprunt de bande passante, plus le prio est petit, plus la priorité est élevée, plus le
plafond de compétitivité est fort: c'est la plus grande classe La valeur de bande passante résultante

Dans le même temps, afin de ne pas faire en sorte qu'une session occupe définitivement la bande passante, la file d'attente équitable équitable sfq est ajoutée.

tc qdisc add dev eth0 parent 1:2 handle 2: sfq perturb 10 
tc qdisc add dev eth0 parent 1:3 handle 3: sfq perturb 10
  • 1
  • 2

3) Définir le filtre

Le filtre peut utiliser ses propres u32 ou iptables pour le marquer.
Spécifié dans la classe racine 1: 0, le filtre 192.168.0.2 utilise la règle 1: 2 pour lui donner une vitesse de 98M. L'écriture est la suivante:

tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src 192.168.0.2 flowid 1:2
tc filter add dev eth0 protocol ip parent 1:0 u32 match ip src 192.168.0.1 flowid 1:3
  • 1
  • 2

Si tout est ip écrit comme suit:

tc filter add dev eth0 protocol ip parent 1: prio 50 u32 match ip dst 0.0.0.0/0 flowid 1:10

//使用 Iptables 来配合过滤器
  • 1
  • 2
  • 3

Vous pouvez également utiliser cette méthode, mais vous devez utiliser la commande iptables suivante pour marquer

tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw flowid 1:2 
tc filter add dev eth0 parent 1: protocol ip prio 1 handle 2 fw flowid 1:3
  • 1
  • 2

iptables doit seulement être marqué

iptables -t mangle -A POSTROUTING -d 192.168.0.2 -j MARK --set-mark 10 iptables -t mangle -A POSTROUTING -d 192.168.0.3 -j MARK --set-mark 20
  • 1

(6) TC contrôle la vitesse la plus élevée

Plafond de taux Le
paramètre de limite de taux ceil spécifie la bande passante maximale qu'une classe peut utiliser pour limiter la bande passante qu'elle peut emprunter. Le plafond par défaut est le même que le taux.

Cette fonctionnalité est utile pour les FAI car elle limite généralement le nombre total d'utilisateurs desservis même si d'autres utilisateurs ne demandent pas de service. (ISPS veut que les utilisateurs paient plus cher pour un meilleur service.) Notez que les classes root ne sont pas autorisées à être empruntées, donc ceil n'est pas spécifié.

Remarque: La valeur du plafond doit être au moins aussi élevée que le taux de la classe à laquelle il appartient, c'est-à-dire que le plafond doit être au moins aussi élevé que n'importe laquelle de ses sous-classes.

(7) Rafale

Le matériel réseau ne peut envoyer qu'un seul paquet à la fois, cela ne dépend que du débit d'un matériel. Le logiciel de partage de liens peut utiliser cette capacité pour générer dynamiquement plusieurs connexions fonctionnant à des vitesses différentes. Le taux et le plafond ne sont donc pas une mesure instantanée, juste une moyenne de paquets envoyés à la fois. La situation actuelle est de savoir comment faire une classe avec un petit débit fournir à d'autres classes le taux maximum à un certain moment.

Les paramètres burst et cburst contrôlent la quantité de données pouvant être facilement envoyées à d'autres classes à la vitesse maximale du matériel. Si cburst est inférieur à un paquet de données théorique, la rafale qu'il forme ne dépassera pas le débit plafond, tout comme le débit maximal de TBF dans la même méthode.

Vous pouvez vous demander pourquoi des rafales sont nécessaires. Parce qu'il peut facilement augmenter la vitesse de réponse sur une liaison très encombrée. Par exemple, le trafic WWW est en rafale. Vous visitez la page d'accueil pour obtenir et lire soudainement, et la rafale se "rechargera" à nouveau pendant votre temps libre.

Remarque: burst et cburst doivent être au moins aussi grands que les valeurs de leurs sous-classes.

(8) Format de commande TC

Rejoignez

tc qdisc [ add | change | replace | link ] dev DEV [ parent qdisc-id | root ] [ handle qdisc-id ] qdisc[ qdisc specific parameters ]
tc class [ add | change | replace ] dev DEV parent qdisc-id [ classid class-id ] qdisc [ qdisc specific parameters ]
tc filter [ add | change | replace ] dev DEV [ parent qdisc-id | root ] protocol protocol prio priorityfiltertype [ filtertype specific parameters ] flowid flow-id
  • 1
  • 2
  • 3

Afficher

tc [-s | -d ] qdisc show dev DEV 
tc [-s | -d ] class show dev DEV 
tc filter show dev DEV
  • 1
  • 2
  • 3

Afficher le statut de TC

tc -s -d qdisc show dev eth0
tc -s -d class show dev eth0
  • 1
  • 2

Supprimer la règle tc

tc qdisc del dev eth0 root
  • 1

Des exemples

1) Utilisez le téléchargement TC pour limiter une seule IP pour le contrôle de la vitesse

tc qdisc add dev eth0 root handle 1: htb r2q 1 
tc class add dev eth0 parent 1: classid 1:1 htb rate 30mbit ceil 60mbit 
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.1.2  flowid 1:1
  • 1
  • 2
  • 3

Vous pouvez limiter la vitesse de téléchargement de 192.168.1.2 à 30Mbit jusqu'à 60Mbit, où r2q fait référence à la racine sans défaut, afin que la bande passante de l'ensemble du réseau ne soit pas limitée.

2) Utilisez TC pour contrôler la vitesse de l'ensemble de l'IP

tc qdisc add dev eth0 root handle 1: htb r2q 1 
tc class add dev eth0 parent 1: classid 1:1 htb rate 50mbit ceil 1000mbit 
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.111.0/24 flowid 1:1
  • 1
  • 2
  • 3

Vous pouvez limiter la bande passante de 192.168.111.0 à 255 à 3000k, et la vitesse de téléchargement réelle est d'environ 200k. Dans ce cas, toutes les machines de ce segment partagent la bande passante de 200k.

Vous pouvez également rejoindre un sfq (file d'attente équitable équitable)

tc qdisc add dev eth0 root handle 1: htb r2q 1 
tc class add dev eth0 parent 1: classid 1:1 htb rate 3000kbit burst 10k 
tc qdisc add dev eth0 parent 1:1 handle 10: sfq perturb 10 
tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip dst 192.168.111.168 flowid 1:1
  • 1
  • 2
  • 3
  • 4

sfq, il peut empêcher une ip dans un segment d'occuper toute la bande passante.

3) Utilisez TC pour contrôler la vitesse externe du serveur à 10M

Comme suit, je veux gérer un serveur, je ne peux envoyer que 10 millions de données

tc qdisc del dev eth0 root 
tc qdisc add dev eth0 root handle 1:htb 
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit ceil 100mbit 
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 10mbit ceil 10mbit 
tc qdisc add dev eth0 parent 1:10 sfq perturb 10
tc filter add dev eth0 protocol ip parent 1: prio 2u32 match ip dst 220.181.xxx.xx/32 flowid 1:1 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Ce qui précède, laissez 220.181.xxx.xx / 32 exécuter la valeur par défaut, principalement pour rendre cette connexion IP non contrôlée

tc filter add dev eth0 protocol ip parent 1: prio 50 u32 match ip dst 0.0.0.0/0 flowid 1:10 
  • 1

Par défaut, tout le trafic passera par ce
 

Source de référence: http://blog.csdn.net/weiweicao0429/article/details/17578011

A publié 13 articles originaux · Likes6 · Plus de 10 000 visiteurs

Je suppose que tu aimes

Origine blog.csdn.net/majianting/article/details/105452671
conseillé
Classement