我自己分析内核tc的一点心得(2)
其实我前段时间才真正开始研究网络。以前看过情景分析,把socket层基本搞清楚。往下是inet socket层,也不是很难。再往下就是传输层,TCP/UDP,虽然看过TCP/IP详解的一,二卷本,但仍一头雾水,看不懂(原因估计是太庞大,又盘根错节)。决定再从下往上。
先看了net/core/*.c,许多都看不同,但总算有了一些认识。然后看drivers/net/ne.c,loopback.c驱动,知道了驱动大概情况。
再往上就是qos了,也就是net/sched/*.c.从简单的看起,sch_generic.c(其中有noop_disc,noqueue_qdisc,pfifo_fast_qdisc),sch_fifo.c。这些基本内容之后就看sch_sfq.c,sch_tbf.c,这两个稍微复杂一点,但是和别的东西独立(只是牵涉到af_netlink,sch_api.c),因此也比较容易理解.
再往后看了sch_prio.c,这是一个可分类的规则,很简单,但也很重要。因为能够分类(能够挂接其他队列规则),因此又涉及到分类器。于是从前天到昨天花了两天时间集中研究了u32分类器(cls_u32.c),这个分类器功能很强大,因此结构异常复杂。然后附带研究了一下fw分类器,这个分类器原理很简单。
分析的时候我同时进行试验,先在在virtual pc上,然后实战。我们学校的网关是我装的,redhat 7.2(2.4.7-10smp).以前照葫芦画瓢建了两个简单tc规则.
tc qidsc add dev eth0 root sfq perturb 10
tc qidsc add dev eth1 root sfq perturb 10
eth0接外网,eth1接内网,iptables做nat和过滤包。
现在稍微懂了一些qos后,修改了一下规则
#!/bin/bash -x
for i in 0 1
do
/sbin/tc qdisc del dev eth$i root
/sbin/tc qdisc add dev eth$i handle 1: root prio bands 3 priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
/sbin/tc qdisc add dev eth$i parent 1:1 sfq perturb 10
/sbin/tc qdisc add dev eth$i parent 1:2 sfq perturb 10
/sbin/tc qdisc add dev eth$i parent 1:3 sfq perturb 10
if [ $i -eq 0 ];then port="dport";addr="16";else port="sport";addr="12";fi
/sbin/tc filter add dev eth$i parent 1: pref 10 protocol ip u32 match ip protocol 6 0xff match ip $port 80 0xffff flowid 1:1
/sbin/tc filter add dev eth$i parent 1: pref 10 protocol ip u32 match u32 0xaabbccdd 0xffffffe0 at $addr flowid 1:2
done
这样可以对校内的流量进行象样的qos了,保证http流量优先,其次是访问我们自己的公网服务器的流量,后是其他流量,这些流量都是通过u32分类器进行分类.当然也可以使用fw分类器来完成这些任务。试验的时候有些命令不会用就看Linux的路由和流量控制HOWTO.pdf,然后在对照iproute2中tc的源代码,可以起到事半功倍的效果,而不是以前的抓瞎了(tc比较难用,有没有正规的手册)。
接下来我准备继续把其他的几个算法看完,包括cls_route,cls_tcindex,sch_red,sch_gred,sch_teql,sch_dsmask,sch_cbq(这个麻烦了),sch_ingress.等等。
把这些看完就了后,往上到邻居子系统层(arp),再到ip层(包括路由子系统,netfilter子系统,icmp,igmp,ipip,等等),后再猛攻UDP/TCP.
路还很长,但我有信心走下去。
文章来源CU社区:我自己分析内核tc的一点心得
相关文章