tc的学习原来是想着直接从用户态学习的,但是万万没想到哇,qdisc class两个概念直接把我给搞晕了,直接看代码吧

调用:tc qdisc add dev tap0 root handle 1: htb default 2

%stc 0xffffffff81744fe0 : qdisc_create+0x0/0x410 [kernel]
0xffffffff81745597 : tc_modify_qdisc+0x1a7/0x5b0 [kernel]
0xffffffff8172b336 : rtnetlink_rcv_msg+0xe6/0x230 [kernel]
0xffffffff8174ee24 : netlink_rcv_skb+0xa4/0xc0 [kernel]
0xffffffff8172b248 : rtnetlink_rcv+0x28/0x30 [kernel]
0xffffffff8174e5da : netlink_unicast+0x12a/0x1b0 [kernel]
0xffffffff8174eb01 : netlink_sendmsg+0x4a1/0x5f0 [kernel]
0xffffffff816fe098 : sock_sendmsg+0x38/0x50 [kernel]
0xffffffff816feb41 : ___sys_sendmsg+0x281/0x290 [kernel]
0xffffffff816ff491 : __sys_sendmsg+0x51/0x90 [kernel]
0xffffffff816ff4e2 : sys_sendmsg+0x12/0x20 [kernel]
0xffffffff818244f2 : entry_SYSCALL_64_fastpath+0x16/0x71 [kernel]

在增加tc class的时候的调用栈是:

tc
0xffffffff81741950 : qdisc_create_dflt+0x0/0x80 [kernel]
0xffffffffc0a87abf [sch_htb]
0xffffffff81744d85 : tc_ctl_tclass+0x3b5/0x400 [kernel] (inexact)
0xffffffff8172b336 : rtnetlink_rcv_msg+0xe6/0x230 [kernel] (inexact)
0xffffffff81706bd7 : __alloc_skb+0x87/0x1f0 [kernel] (inexact)
0xffffffff8172b250 : rtnetlink_rcv_msg+0x0/0x230 [kernel] (inexact)
0xffffffff8174ee24 : netlink_rcv_skb+0xa4/0xc0 [kernel] (inexact)
0xffffffff8172b248 : rtnetlink_rcv+0x28/0x30 [kernel] (inexact)
0xffffffff8174e5da : netlink_unicast+0x12a/0x1b0 [kernel] (inexact)
0xffffffff8174eb01 : netlink_sendmsg+0x4a1/0x5f0 [kernel] (inexact)
0xffffffff813912f1 : aa_sock_msg_perm+0x61/0x150 [kernel] (inexact)
0xffffffff816fe098 : sock_sendmsg+0x38/0x50 [kernel] (inexact)
0xffffffff816feb41 : ___sys_sendmsg+0x281/0x290 [kernel] (inexact)
0xffffffff8120018b : mem_cgroup_try_charge+0x6b/0x1b0 [kernel] (inexact)
0xffffffff8119dfd7 : lru_cache_add_active_or_unevictable+0x27/0xa0 [kernel] (inexact)
0xffffffff811bf87a : handle_mm_fault+0xcaa/0x1820 [kernel] (inexact)
0xffffffff816ff491 : __sys_sendmsg+0x51/0x90 [kernel] (inexact)
0xffffffff816ff4e2 : sys_sendmsg+0x12/0x20 [kernel] (inexact)
0xffffffff818244f2 : entry_SYSCALL_64_fastpath+0x16/0x71 [kernel] (inexact)

在qdisc中打点,发现每创建一个分类都会导致创建一个新的qdisc,然后这个qdisc会放到哪里?

rt_netlink

4068 static int __net_init rtnetlink_net_init(struct net *net)
4069 {
4070 struct sock *sk;
4071 struct netlink_kernel_cfg cfg = {
4072 .groups = RTNLGRP_MAX,
4073 .input = rtnetlink_rcv,
4074 .cb_mutex = &rtnl_mutex,
4075 .flags = NL_CFG_F_NONROOT_RECV,
4076 };
4077
4078 sk = netlink_kernel_create(net, NETLINK_ROUTE, &cfg);
4079 if (!sk)
4080 return -ENOMEM;
4081 net->rtnl = sk;
4082 return 0;
4083 }

注册了这样的一种网络的协议,然后这种协议专门处理网络收发包的策略

htb_qdisc_ops函数的原型如下:

1582 static const struct Qdisc_class_ops htb_class_ops = {
1583     .graft      =   htb_graft,
1584     .leaf       =   htb_leaf,
1585     .qlen_notify    =   htb_qlen_notify,
1586     .get        =   htb_get,
1587     .put        =   htb_put,
1588     .change     =   htb_change_class,
1589     .delete     =   htb_delete,
1590     .walk       =   htb_walk,
1591     .tcf_chain  =   htb_find_tcf,
1592     .bind_tcf   =   htb_bind_filter,
1593     .unbind_tcf =   htb_unbind_filter,
1594     .dump       =   htb_dump_class,
1595     .dump_stats =   htb_dump_class_stats,
1596 };
1597
1598 static struct Qdisc_ops htb_qdisc_ops __read_mostly = {
1599     .cl_ops     =   &htb_class_ops,
1600     .id     =   "htb",
1601     .priv_size  =   sizeof(struct htb_sched),
1602     .enqueue    =   htb_enqueue,
1603     .dequeue    =   htb_dequeue,
1604     .peek       =   qdisc_peek_dequeued,
1605     .init       =   htb_init,
1606     .reset      =   htb_reset,
1607     .destroy    =   htb_destroy,
1608     .dump       =   htb_dump,
1609     .owner      =   THIS_MODULE,
1610 };

tc_ctl_tclass就是对class的处理!!!!!

子队列是怎么关联到父队列中去的?对于htb算法来说,到底是怎么管理的这棵树的?

207 static struct htb_class *htb_classify(struct sk_buff *skb, struct Qdisc *sch,
如何htb_classify,把数据包放到对应的队列中去。

所以我们再整理一下看一下htb里面是怎么把数据包放到,首先会根据数据包skb->priority字段去找到这个数据包属于的class编号,确定了class之后,【这里有个疑问】为什么不是先做filter呢?

先找到这个priority对应的class,class上依附着这个class所有的filter,路由!

所以现在基本明白了qdisc/class/filter之间的关系,一个qdisc下有一个class,然后这个class中依附着一个路由表,这个表中指向的是多个新的qdisc。下面这些叶子qdisc中又有自己的class了,这个class了,这个class规定了自己的一些特性呢!所以一个qdisc一定关联着一个class,这个class定义着这个qdisc的发送的速率等参数。

所以clas这个结构体是一定要存在的!看下,像htb这样的tc算法,如果filter直接放在qdisc上面的话,那么子class流量共享与不共享就只能选择其中一个了,但是如果此时创建了一个class

那么其实还有个问题,在skb中标志了这个major:minor号码,那么为什么不直接找到这个号码呢?看下tc filter是怎么操作的!是怎么把这个priory放到了skb->priority域中的?!tc filter add dev

__ip_make_skb<--ip_make_skb

https://blog.csdn.net/eydwyz/article/details/53320910

所以在htb_enqueue时设置了优先级的概念priority:

skb->priority:

19 #define TC_PRIO_BESTEFFORT      0
 20 #define TC_PRIO_FILLER          1
 21 #define TC_PRIO_BULK            2
 22 #define TC_PRIO_INTERACTIVE_BULK    4
 23 #define TC_PRIO_INTERACTIVE     6
 24 #define TC_PRIO_CONTROL         7
这个就是skb->priority中设置的数据包

有一个例子:

#tc qdisc add dev eth0 root handle 1: htb default 21

#tc class add dev eth0 partent 1: classid 1:1 htb rate 20mbit ceil 20mbit

#tc class add dev eth0 parent 1: classid 1:2 htb rate 80mbit ceil 80mbit

#tc class add dev eth0 parent 1: classid 1:21 htb rate 40mbit ceil 20mbit

#tc class add dev eth0 parent 1:2 classid 1:22 htb rate 40mbit ceil 80mbit

#tc filter add dev eth0 protocol parent 10 prio 1 u32 match ip dport 80 0xffff flowid 1:21

#tc filter add dev eth0 protocol parent 1:0 prio 1 u32 match ip dport 25 0xffff flowid 1:22

#tc filter add dev eth0 protocol parent 1:0 prio 1 u32 match ip dport 23 0xffff flowid 1:1

数据包中根本就没有代表,但是tc也是肯能打标的

那么就再看htb_enqueue

tc:逼良为娼的更多相关文章

  1. H TC並沒有成為下一個摩托羅拉或諾基亞。

    關於2014年第四季度,H T C在三季度財報說明中提到,“年度旗艦H T CO ne(M 8)與中端機型H T C D esire系列在競爭日趨激烈的智能手機市場保持穩定的銷售,市占率有所提升,延續 ...

  2. TC(Total Commander)文件管理神器

    TC文件管理神器 Total Commander是一个会显著提高文件操作效率的工具,而文件操作是应用计算机最基本的功夫,也是伴随一生的操作.因此花一点时间学习,而会受益一世. Total Comman ...

  3. Linux TC基于CBQ队列的流量管理范例

    参考了TC的很多文档,自己也整理了一篇配置记录.在实际使用过程中效果还不错,在此分享给大家以备参考.环境:局域网规模不是很大40多台机器. NAT共享上网(内网:eth0 外网:eth2)CBQ是通过 ...

  4. Linux TC流量控制HOWTO中文版

    <本文摘自Linux的高级路由和流量控制HOWTO中文版 第9章节>网人郭工进行再次编译: 利用队列,我们可以控制数据发送的方式.记住我们只能对发送数据进行控制(或称为整形).其实,我们无 ...

  5. 蒟蒻修养之tc蓝名计划

    开一个新坑......(听说tc是智商高的人才能玩的QAQ显然我是被屠的... 1 [645DIV2]这个能说是裸模拟吗... 弃坑= =做了一些题感觉没必要放上来了= =等div1先吧....... ...

  6. 使用 TC 对LInux中vpn 上传下载进行限速(转)

    TC 无需安装,Linux 内核自带 例:将vpn IP地址段192.168.1.0/24 上传下载限速为 5M 将以下内容添加到/etc/ppp/ip-up文件exit 0上面. down=5Mbi ...

  7. 电影TS、TC、SCR、R5、BD、HD等版本是什么意思

    在很多电影下载网站的影片标题中我们都能看到,比如<刺杀希特勒BD版>.<游龙戏凤TS版>等,这些英文缩写都是什么意思呢?都代表什么画质?以下就是各个版本的具体含义: 1.CAM ...

  8. Linux下TC使用说明

    Linux下TC使用说明   一.TC原理介绍 Linux操作系统中的流量控制器TC(Traffic Control)用于Linux内核的流量控制,主要是通过在输出端口处建立一个队列来实现流量控制. ...

  9. TC Hash Filter

    Overview The u32 filter allows you to match on any bit field within a packet, so it is in some ways ...

随机推荐

  1. docker swarm的应用----docker集群的构建

    一.docker安装 这里我们安装docker-ce 的18.03版本 yum    -y remove docker  删除原有版本 #安装依赖包 [root@Docker ~]# yum -y i ...

  2. 4-c++教程起航篇-学习笔记

    c++教程起航篇 我们会讲C++那些事,C++与C语言的关系. C++诞生于贝尔实验室. C++之父: 本贾尼·斯特劳斯特卢普 C++社区排行榜 最新排行,c++排名第三,Python排名第四 C++ ...

  3. HttpClient的Content-Type设置

    HttpClient的Content-Type设置 最近在对接公司内容的一个云服务的时候,遇到一个问题,就是如果使用HttpClient如何设置post时候的Content-Type? public ...

  4. Applied Cloud Deep Semantic Recognition: Advanced Anomaly Detection(应用云深层语义识别:高级异态检测)

    亚马逊链接 引言 (by Mehdi Roopaei & Paul Rad) 异态检测与情境感知 在数据分析领域,异态检测讲的是在一个数据集中,发现到其中不符合预期模式的物体,动作,行为或事件 ...

  5. 为什么我要放弃javaScript数据结构与算法(第十章)—— 排序和搜索算法

    本章将会学习最常见的排序和搜索算法,如冒泡排序.选择排序.插入排序.归并排序.快速排序和堆排序,以及顺序排序和二叉搜索算法. 第十章 排序和搜索算法 排序算法 我们会从一个最慢的开始,接着是一些性能好 ...

  6. 【转】Odoo装饰器: one装饰

    one装饰器的作用是对每一条记录都执行对应的方法,相当于traditional-style中的function,无返回值! 应用举例: 定义的columns now = fields.Datetime ...

  7. ProtoBuffer由.proto文件生成.cc/.h

    ProtoBuffer由.proto文件生成.cc/.h 一:编译源码下载地址:http://code.google.com/p/protobuf/downloads/list 下载后,根据编译说明进 ...

  8. java 类装饰

    package TestIo; public class Test8 { public static void main(String[] args) { System.out.println(&qu ...

  9. eclipse插件SCON的SConscript文件和头文件以及C文件包含路径

    1. 本次的头文件路径\Hi2110-B657SP3-SDK\src_release_657SP3\src\lib\onenet\public,以此例子作为研究,本次开发使用eclipse,用到SCO ...

  10. DSP5509的GPIO学习-第5篇

    1. 使用CCS V6.1版本,目前已经不局限于仅仅把实验搞清楚了,要深入去探究内部的原理,本章看下GPIO实验 2. 在CCS启动的时候,提示,这个问题是什么,XDAIS是什么?XDAIS (eXp ...