# tc - traffic control _Команды · LinuxLab Knowledge Base_ **TL;DR:** `tc` управляет очередями пакетов на сетевых интерфейсах: лимиты bandwidth, задержки, потери, классификация. Часть iproute2. ## Понятийный минимум - **qdisc** (queueing discipline) - правило очереди на интерфейсе. На каждом интерфейсе ВСЕГДА есть qdisc - по умолчанию `pfifo_fast` или `fq_codel`. - **class** - иерархия внутри qdisc (для деления bandwidth между трафиком) - **filter** - что в какой class попадает (по портам, IP, маркеру) ## Просмотр ```bash tc qdisc show # qdisc на всех интерфейсах tc qdisc show dev eth0 tc -s qdisc show dev eth0 # -s: со статистикой (bytes, packets, dropped) tc class show dev eth0 tc filter show dev eth0 ``` ## netem: симуляция плохой сети Самый частый use-case для CI / chaos-тестов: ```bash sudo tc qdisc add dev eth0 root netem delay 200ms sudo tc qdisc add dev eth0 root netem delay 100ms 20ms # +-20ms jitter sudo tc qdisc add dev eth0 root netem loss 5% sudo tc qdisc add dev eth0 root netem corrupt 1% sudo tc qdisc add dev eth0 root netem duplicate 1% sudo tc qdisc add dev eth0 root netem reorder 25% 50% # Комбо - сразу несколько эффектов: sudo tc qdisc replace dev eth0 root netem delay 50ms loss 1% # Снять: sudo tc qdisc del dev eth0 root ``` Проверить эффект - пинговать через интерфейс, смотреть retransmits в [cmd-ss](/kb/cmd-ss.md) `-ti`. ## tbf: лимит bandwidth Token Bucket Filter - простой rate-limiter: ```bash sudo tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms # → 1 Mbit/s outgoing, очередь до 400мс ``` ## htb: иерархическое деление полосы ```bash # 100Mbit на интерфейсе, разделено: 70 для класса 1:10, 30 для 1:20 sudo tc qdisc add dev eth0 root handle 1: htb default 20 sudo tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit sudo tc class add dev eth0 parent 1:1 classid 1:10 htb rate 70mbit ceil 100mbit sudo tc class add dev eth0 parent 1:1 classid 1:20 htb rate 30mbit ceil 100mbit # Распихать трафик: SSH (port 22) - в premium-класс sudo tc filter add dev eth0 parent 1: protocol ip prio 1 \ u32 match ip dport 22 0xffff flowid 1:10 ``` ## Применение к loopback (для тестов) netem на `lo` - самый быстрый chaos-тест локально, без подъёма топологии: ```bash sudo tc qdisc add dev lo root netem delay 200ms ping -c 3 127.0.0.1 # → RTT теперь ~200ms sudo tc qdisc del dev lo root ``` ## Capability Для всех `tc add/del` нужен `CAP_NET_ADMIN`. В контейнерах - `--cap-add=NET_ADMIN`. ## Команды ```bash tc -s qdisc show dev eth0 ``` Текущий qdisc + статистика (dropped/overlimits показывают перегрузку) ```bash sudo tc qdisc add dev eth0 root netem delay 100ms loss 1% ``` Симулировать плохую сеть: задержка + потери (для тестов) ```bash sudo tc qdisc replace dev eth0 root netem rate 10mbit ``` Жёсткий лимит 10 Mbit/s - replace создаёт или меняет ```bash sudo tc qdisc del dev eth0 root ``` Снять все правила - вернуть дефолтный qdisc ```bash sudo tc -s -d qdisc show dev eth0 ``` Подробный вывод с detailed-статистикой и параметрами ## См. также - [Routing table](/kb/routing-table.md) - [ip - швейцарский нож сетевой настройки](/kb/cmd-ip.md) - [TCP states (LISTEN, ESTABLISHED, TIME_WAIT)](/kb/tcp-states.md)