Use tc para simular el retraso de la red y la pérdida de paquetes en Linux

1. Introducción a la transmisión analógica retardada

netem y tc: netem es un módulo de función de simulación de red proporcionado por Linux 2.6 y versiones superiores del kernel. Este módulo de función se puede utilizar para simular el rendimiento complejo de transmisión de Internet en una red de área local con un buen rendimiento, como ancho de banda bajo, retraso de transmisión y pérdida de paquetes. Muchas distribuciones de Linux que usan el núcleo Linux 2.6 (o superior) tienen esta característica del núcleo habilitada, como Fedora, Ubuntu, Redhat, OpenSuse, CentOS, Debian, etc. tc es una herramienta en el sistema Linux, el nombre completo es control de tráfico (control de flujo). tc se puede utilizar para controlar el modo de trabajo de netem. Es decir, si desea usar netem, necesita al menos dos condiciones, una es que la función netem en el núcleo está incluida y la otra es tener tc.

Cabe señalar que el control de flujo introducido en este artículo solo puede controlar la acción de envío de paquetes, pero no la acción de recepción de paquetes. Al mismo tiempo, surte efecto directamente en la interfaz física. Si se controla el eth0 físico, la tarjeta de red lógica (como eth0: 1) también se verá afectada. Impacto, por el contrario, si controla la tarjeta de red lógica, el control puede ser inválido. (Nota: Múltiples NIC en la máquina virtual pueden considerarse múltiples NIC físicas en la máquina virtual).

tc qdisc add dev eth0 root netem delay 100ms

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

En una situación más realista, el valor del retraso no será tan preciso, habrá ciertas fluctuaciones, podemos usar la siguiente situación para simular el valor del retraso con volatilidad:

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

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

Puede fortalecer aún más la aleatoriedad de esta fluctuación:

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

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

2. Simule la pérdida de paquetes de red

tc qdisc add dev eth0 root netem loss 1%

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

También puede establecer la tasa de éxito de la pérdida de paquetes:

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

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

3. Elimine la configuración relevante en la tarjeta de red

Cambie agregar en el comando anterior a del para eliminar la configuración

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

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

En este punto, ya podemos simular un cierto retraso de red y pérdida de paquetes en el entorno de prueba a través de TC. Las siguientes son más aplicaciones e introducciones sobre tc.

4. Repita el paquete de simulación.

tc qdisc add dev eth0 root netem duplicate 1%

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

5. Corrupción de paquetes de datos simulados.

tc qdisc add dev eth0 root netem corrupt 0.2%

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

6. Los paquetes de datos analógicos están fuera de servicio

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

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

En la nueva versión, los siguientes comandos también interrumpirán el orden de envío de paquetes en cierta medida:

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

7. Ver las condiciones de red configuradas

tc qdisc show dev eth0

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

8. Introducción al control de flujo TC

En Linux, TC tiene dos métodos de control CBQ y HTB: HTB está diseñado para reemplazar a CBQ. Es un marco de filtrado jerárquico.

TC incluye tres componentes básicos: disciplina de cola qdisc (disciplina de colas), clase (clase) y clasificador (clasificadores)

(1) Disciplina de colas en TC

Se utiliza para lograr la velocidad de transmisión y recepción de la red de control. A través de la cola, Linux puede almacenar en caché los paquetes de datos de la red y, de acuerdo con la configuración del usuario, suavizar el tráfico de red sin interrumpir la conexión (como TCP) tanto como sea posible.

Cabe señalar que Linux no controla bien la cola de recepción, por lo que generalmente solo usamos la cola de envío, es decir, "controlar el envío no controla la recepción". Encapsula los otros dos componentes TC principales (clases y clasificadores). Si el kernel necesita enviar paquetes a través de una interfaz de red, necesita agregar los paquetes a la cola de acuerdo con la qdisc (regla de cola) configurada para esta interfaz. Luego, el núcleo tomará tantos paquetes de datos de qdisc como sea posible y los entregará al módulo controlador del adaptador de red.

El QDisc más simple es pfifo. No realiza ningún procesamiento en los paquetes de datos entrantes. Los paquetes de datos pasan a través de la cola de una manera de primero en entrar, primero en salir. Sin embargo, guarda paquetes que la interfaz de red no puede manejar por un tiempo.

Las reglas de la cola incluyen FIFO (primero en entrar, primero en salir), ROJO (detección temprana aleatoria), SFQ (cola justa aleatoria) y depósito de tokens (Token Bucket), cola basada en clases (CBQ), CBQ es una súper cola, es decir, puede contener Otras colas (incluso otras CBQ).

(2) Clase en TC

La clase se utiliza para representar la estrategia de control. Obviamente, muchas veces, es posible que tengamos que implementar diferentes estrategias de control de flujo para diferentes IP. En este momento, tenemos que usar diferentes clases para representar diferentes estrategias de control.

(3) Reglas de filtro en TC

El filtro se utiliza para clasificar a los usuarios en estrategias de control específicas (es decir, diferentes clases). Por ejemplo, queremos implementar diferentes estrategias de control (A, B) para las dos IP xxa y xxb. En este momento, podemos usar el filtro para clasificar xxa en la estrategia de control A, xxb en la estrategia de control B y el indicador de división de filtro. Los bits se pueden implementar con la función de marcado u32 o la función set-mark de IPtables (principalmente usando iptables para el marcado).

En la actualidad, los filtros que TC puede usar son: clasificador fwmark, clasificador u32, clasificador basado en ruta y clasificador RSVP (respectivamente utilizado para IPV6, IPV4), etc. El clasificador fwmark nos permite usar el código de filtro de red de Linux para seleccionar el tráfico, mientras que el clasificador u32 nos permite seleccionar el tráfico en función de CUALQUIER encabezado. Cabe señalar que los filtros están dentro de QDisc y no se pueden usar como sujetos.

(4) proceso de solicitud de CT

Paquete de datos-> iptables (al pasar iptables, iptables establece una marca diferente según diferentes ip-> TC (clase) -> TC (cola)

(5) Solicitud

Se supone que el bit eth0 es la interfaz de red externa del servidor. Antes de comenzar, primero borre todas las reglas de cola eth0

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

1) Defina la regla de cola superior (raíz) y especifique el número de categoría predeterminado

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

2) La definición de la categoría 1: 1 (velocidad) de la primera capa fue originalmente para definir más categorías de hojas de la segunda capa, pero por ahora, es suficiente en esta aplicación.

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

Nota: Lo anterior es la velocidad que controlamos el servidor de salida, uno es 98M, uno es 2M.

rate: es el valor de ancho de banda garantizado por una clase. Si hay más de una clase, asegúrese de que la suma de todas las subclases sea menor o igual que el
prio de la clase principal: se utiliza para indicar la competitividad al tomar prestado el ancho de banda, cuanto menor es el prio, mayor es la prioridad, mayor es el
límite de competitividad : es la clase más grande El valor de ancho de banda resultante

Al mismo tiempo, para que una sesión no ocupe permanentemente el ancho de banda, se agrega la cola justa aleatoria sfq.

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) Establecer filtro

El filtro puede usar su propio u32 o iptables para marcarlo.
Especificado en la clase raíz 1: 0, el filtro 192.168.0.2 usa la regla 1: 2 para darle una velocidad de 98M. La escritura es la siguiente:

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 todo es ip escrito de la siguiente manera:

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

También puede usar este método, pero debe usar el siguiente comando de iptables para marcar

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 solo necesita ser marcado

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 controla la velocidad más alta

Límite máximo de velocidad El límite
máximo de parámetro de límite de velocidad especifica el ancho de banda máximo que una clase puede usar para limitar la cantidad de ancho de banda que la clase puede tomar prestada. El límite máximo predeterminado es el mismo que la tasa.

Esta característica es útil para los ISP porque generalmente limitan el número total de usuarios que se atienden, incluso si otros usuarios no solicitan el servicio. (ISPS quiere que los usuarios paguen más por un mejor servicio). Tenga en cuenta que las clases raíz no pueden ser prestadas, por lo que no se especifica ceil.

Nota: El valor de ceil debe ser al menos tan alto como la tasa de la clase a la que pertenece, es decir, ceil debe ser al menos tan alto como cualquiera de sus subclases.

(7) ráfaga de ráfaga

El hardware de red solo puede enviar un paquete a la vez, solo depende de la velocidad de una pieza de hardware. El software de intercambio de enlaces puede usar esta capacidad para generar dinámicamente múltiples conexiones que se ejecutan a diferentes velocidades. Por lo tanto, la tasa y el límite máximo no son una medida instantánea, solo un promedio de paquetes enviados a la vez. La situación real es cómo hacer que una clase con una tasa de flujo pequeña proporcione a otras clases la tasa máxima en un momento determinado.

Los parámetros burst y cburst controlan la cantidad de datos que se pueden enviar fácilmente a otras clases a la velocidad máxima del hardware. Si cburst es menor que un paquete de datos teórico, la ráfaga formada por él no excederá la tasa de límite, por lo que es la tasa máxima de TBF en el mismo método.

Puede preguntar por qué se necesitan explosiones. Porque puede aumentar fácilmente la velocidad de respuesta en un enlace muy lleno. Por ejemplo, el tráfico WWW es explosivo. Visita la página de inicio para obtener y leer de repente, y la ráfaga se "cargará" nuevamente en su tiempo libre.

Nota: burst y cburst deben ser al menos tan grandes como los valores de sus subclases.

(8) formato de comando TC

Unirse

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

Mostrar

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

Ver el estado de TC

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

Eliminar regla tc

tc qdisc del dev eth0 root
  • 1

Ejemplos

1) Use la descarga TC para limitar una sola IP para el control de velocidad

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

Puede limitar la velocidad de descarga de 192.168.1.2 a 30Mbit hasta 60Mbit, donde r2q se refiere a la raíz sin valor predeterminado, de modo que el ancho de banda de toda la red no esté limitado.

2) Use TC para controlar la velocidad de toda la 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

Puede limitar el ancho de banda de 192.168.111.0 a 255 a 3000k, y la velocidad de descarga real es de aproximadamente 200k. En este caso, todas las máquinas de este segmento comparten el ancho de banda de 200k.

También puede unirse a un sfq (cola justa aleatoria)

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 4

sfq, puede evitar que una ip en un segmento ocupe todo el ancho de banda.

3) Use TC para controlar la velocidad externa del servidor a 10M

De la siguiente manera, quiero administrar un servidor, solo puedo enviar datos de 10 millones

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 4
  • 5 5
  • 6 6

Lo anterior, deje que 220.181.xxx.xx / 32 ejecute el valor predeterminado, principalmente para que esta conexión IP no esté controlada

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

Por defecto, todo el tráfico pasará por este
 

Fuente de referencia: http://blog.csdn.net/weiweicao0429/article/details/17578011

13 artículos originales publicados · Me gusta6 · Visitantes más de 10,000

Supongo que te gusta

Origin blog.csdn.net/majianting/article/details/105452671
Recomendado
Clasificación