使用TC工具完成对特定多个目标ip的路径延迟增加

最近在做一些网络相关的研究,发现TC工具可以完成大量网络模拟和仿真的工作

然而大部分人对TC工具的使用场景都很简单,基本不涉及比较深入的TC用法

笔者需要使用TC工具完成server到多个特定ip的异构路径仿真,于是发现简单的TC使用已经不能满足需求,而网络上的资料对于这部分的使用非常模糊,有的甚至是错误的,于是记录一下较为复杂的TC用例如题目所示

#!/bin/bash

# delete tc configure now
tc qdisc del dev eth1 root

# 创建root qdisc
tc qdisc add dev eth1 root handle 1: htb #注意root qdisc的句柄固定为1:0

tc class add dev eth1 parent 1:0 classid 1:10 htb rate 48Mbit #新增一个htb class,隶属于root qdisc,设置带宽为48M
tc class add dev eth1 parent 1:0 classid 1:20 htb rate 12Mbit #新增一个htb class,隶属于root qdisc,设置带宽为12M

tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip dst 9.135.101.27 flowid 1:10 #在root qdisc下设置一个filter,连接qdisc 1:0和class 1:10,filter条件为目标ip:9.135.101.27
tc filter add dev eth1 protocol ip parent 1: prio 1 u32 match ip dst 9.135.103.161 flowid 1:20 #在root qdisc 下设置一个filter,连接qdisc 1:0和class 1:20,filter条件为目标ip:9.135.103.161

tc qdisc add dev eth1 parent 1:10 handle 10: netem delay 8ms loss 3% #给class 1:10新增qdisc,delay 8ms, loss 3%
tc qdisc add dev eth1 parent 1:20 handle 20: netem delay 58ms loss 10% #给class 1:20新增qdisc,delay 58ms, loss 10%

转载一部分tc的重要知识,转载链接:https://blog.csdn.net/qq_44577070/article/details/123967699

流量控制(Traffic Control, TC)以qdisc - class - filter的树形结构来实现对流量的分层控制。

当Linux内核接收数据包时,先根据过滤器进行分类,符合条件的数据包就被归为相应的类,而每一个类都对应一个相应的排队规则。如果一个数据包对于所有的过滤条件都不满足,则该数据包会被归为缺省类,将会使用缺省的队列规定对其进行处理(默认pfifo_fast)。

Linux在实现TC的时候,对“队列”进行了抽象,基本上它维护了两个回调函数指针,一个是enqueue入队操作,一个是dequeue出队操作。不管是enqueue还是dequeue,都并不一定真正将数据包排入队列,而仅仅是“执行一系列的操作”:

对于叶子节点,排入一个真实的队列或者从真正的队列拉出一个数据包;
递归调用其它抽象队列的enqueue/dequeue。
所以对于非叶子节点的qdisc,实际上是一个“不存在的队列”,数据包没有实际在此排队,只是递归调用子类的队列。只有在叶子节点上的队列才是真正能存放发出数据包的队列。

所以实际的树状结构如下:

在这里插入图片描述

一般为有子类的qdisc显式的分配一个句柄,方便添加过滤器和子类。

root qdisc 只是一个抽象队列,句柄为1:0。一个类有且仅有一个叶子 qdisc(可不显示分配句柄),默认为pfifo_fast。这个qdisc也可自行设置,此时就与父节点不再是同一个 qdisc 对象,随后将进行递归调用。若这个类有其他子类,那数据包就会通过类的过滤器进行分类进入子类,如果没有被成功归类,就会被排到这个类的叶子 qdisc 中。

同一个 qdisc 对象中,父节点的 filter 可以直接作用于子孙类,例如图中 root qdisc 的过滤器直接调用句柄为 1:6 的类。

数据包流入过程如下:
在这里插入图片描述

如上图所示,数据包从网卡进入后,首先经过 root qdisc 1:0,此处根上的是可分类队列,则会经过filter分到对应子类中。
若进入 class 1:2,则此类的规则生效后,直接进入这个类的叶子 qdisc 排队(默认pfifo_fast)。
若进入 class 1:1,则此类的规则生效后,进入一个新的 qdisc 2:0,这个qdisc 也是可分类队列,所以数据包会经过filter进入子类,后续过程即递归调用。
若进入class 1:3,则规则生效后会经过filter进入此类的子类,注意这里和root qdisc属于同一个对象。如果没有满足的分类规则,数据包会进入此类的默认叶子qdisc排队。
数据包进入 class 1:4,这里就会进入新的 qdisc 4:0,此qdisc 是无分类队列,所以没有过滤器和子类。这个队列下也可直接接新的无分类队列 qdisc z:0(此处是叶子队列,没有显式分配具柄),或者像 class 1:5 一样,qdisc 5:0 后接新的可分类队列 qdisc 6:0。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值