文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>用tc+iptables+HTB解决ADSL宽带速度瓶颈技术

用tc+iptables+HTB解决ADSL宽带速度瓶颈技术

时间:2006-10-09  来源:huanghaojie

http://bbs.chinaunix.net/viewthread.php?tid=482589&extra=page%3D1&page=1

#!/bin/bash
#脚本文件名: tc2
#########################################################################################
#用TC(Traffic Control)解决ADSL宽带速度技术 Ver. 1.0        by KindGeorge 2004.12.27        #
#########################################################################################
#此脚本经过实验通过,更多的信息请参阅http://lartc.org
#tc+iptables+HTB+SFQ
#
#一.什么是ADSL? ADSL(Asymmetric Digital Subscriber Loop,非对称数字用户环路)
#用最简单的话的讲,就是采用上行和下行不对等带宽的基于ATM的技术.
#举例,我们最快的其中一条ADSL带宽是下行3200Kbit,上行只有320Kbit.带宽通常用bit表示.
#
#1、下行3200K 意味着什么?
#因为 1Byte=8Bit ,一个字节由8个位(bit)组成,一般用大写B表示Byte,小写b表示Bit.
#所以 3200K=3200Kbps=3200K bits/s=400K bytes/s.
#2、 上行320K 意味着什么?
# 320K=320Kbps=320K bits/s=40K bytes/s.
#就是说,个人所能独享的最大下载和上传速度,整条线路在没任何损耗,最理想的时候,
#下载只有400K bytes/s,上传只有最大40K bytes/s的上传网速.
#这些都是理想值,但现实总是残酷的,永远没有理想中那么好.至少也有损耗,何况内部网有几十台
#电脑一起疯狂上网.
#
#3.ADSL上传速度对下载的影响
#(1)TCP/IP协议规定,每一個封包,都需要有acknowledge讯息的回传,也就是说,传输的资料,
#需要有一个收到资料的讯息回复,才能决定后面的传输速度,並决定是否重新传输遗失
#的资料。上行的带宽一部分就是用來传输這些acknowledge(确认)資料模?鄙闲懈涸毓?
#大的时候,就会影响acknowledge资料的传送速度,并进而影响到下载速度。这对非对称
#数字环路也就是ADSL这种上行带宽远小于下载带宽的连接来说影响尤为明显。
#(2)试验证明,当上传满载时,下载速度变为原来速度的40%,甚至更低.因为上载文件(包括ftp
#上传,发邮件smtp),如果较大,一个人的通讯量已经令整条adsl变得趋向饱和,那么所有的数据
#包只有按照先进先出的原则进行排队和等待.这就可以解释为什么网内其中有人用ftp上载文件,
#或发送大邮件的时候,整个网速变得很慢的原因。
#
#二.解决ADSL速度之道
#1. 为解决这些速度问题,我们按照数据流和adsl的特点,对经过线路的数据进行了有规则的分流.
#把本来在adsl modem上的瓶颈转移到我们linux路由器上,可以把带宽控制的比adsl modem上的小一点,
#这样我们就可以方便的用tc技术对经过的数据进行分流和控制.
#我们的想象就象马路上的车道一样,有高速道,还有小车道,大车道.需要高速的syn,ack,icmp等走
#高速道,需要大量传输的ftp-data,smtp等走大车道,不能让它堵塞整条马路.各行其道.
#2. linux下的TC(Traffic Control)就有这样的作用.只要控制得当,一定会有明显的效果.
#tc和iptables结合是最好的简单运用的结合方法.
#我们设置过滤器以便用iptables对数据包进行分类,因为iptables更灵活,而且你还可以为每个规则设
#置计数器. iptables用mangle链来mark数据包,告诉了内核,数据包会有一个特定的FWMARK标记值(hanlde x fw),
#表明它应该送给哪个类( classid x : x),而prio是优先值,表明哪些重要数据应该优先通过哪个通道.
#首先选择队列,cbq和htb是不错的选择,经过实验,htb更为好用,所以以下脚本采用htb来处理
#3. 一般系统默认的是fifo的先进先出队列,就是说数据包按照先来先处理的原则,如果有一个大的数
#据包在前面,#那么后面的包只能等前面的发完后才能接着发了,这样就算后面即使是一个小小的ack包,
#也要等待了,这样上传就影响了下载,就算你有很大的下载带宽也无能为力.
#HTB(Hierarchical Token Bucket, 分层的令牌桶)
#更详细的htb参考 http://luxik.cdi.cz/~devik/qos/htb/
#HTB就象CBQ一样工作,但是并不靠计算闲置时间来整形。它是一个分类的令牌桶过滤器。它只有很少的参数
#他的分层(Hierarchical)能够很好地满足这样一种情况:你有一个固定速率的链路,希望分割给多种不同的
#用途使用,为每种用途做出带宽承诺并实现定量的带宽借用。
#4. 结构简图:
#~~~~~~ |
#~~~~~ __1:__
#~~~~ |~~~~~ |
#~  _ _ _1:1~~~ 1:2_ _ _ _ _ _ _ _
#  | ~ ~ |  ~ ~ ~ |  ~ ~ | ~ ~ | ~ ~ |
#1:11~1:12~~1:21~1:22~1:23~1:24
#优先顺序是1:11 1:12   1:21 1:22  1:23 1:24
#
#--------------------------------------------------------------------------------------------
#5.根据上面的例子,开始脚本   
#通常adsl用pppoe连接,的得到的是ppp0,所以公网网卡上绑了ppp0
#关于参数的说明
#(1)rate: 是一个类保证得到的带宽值.如果有不只一个类,请保证所有子类总和是小于或等于父类.
#(2)ceil: ceil是一个类最大能得到的带宽值.
#(3)prio: 是优先权的设置,数值越大,优先权越小.如果是分配剩余带宽,就是数值小的会最优先取得剩余
#的空闲的带宽权.
#具体每个类要分配多少rate,要根据实际使用测试得出结果.
#一般大数据的话,控制在50%-80%左右吧,而ceil最大建议不超过85%,以免某一个会话占用过多的带宽.
#rate可按各类所需分配,
#1:11 是很小而且最重要的数据包通道,当然要分多点.甚至必要时先全部占用,不过一般不会的.所以给全速.
#1:12 是很重要的数据道,给多点,最少给一半,但需要时可以再多一点.
#rate 规划 1:2 = 1:21 + 1:22 + 1:23 + 1:24  一般总数在50%-80%左右
#1:21 http,pop是最常用的啦,为了太多人用,而导致堵塞,我们不能给得太多,也不能太少.
#1:22 我打算给smtp用,优先低于1:21 以防发大的附件大量占用带宽,
#1:23 我打算给ftp-data,和1:22一样,很可能大量上传文件,所以rate不能给得太多,而当其他有剩时可以给大些,ceil设置大些
#1:24 是无所谓通道,就是一般不是我们平时工作上需要的通道了,给小点,防止这些人在妨碍有正常工作需要的人
#上行 uplink 320K,设置稍低于理论值
DEV="ppp0"
UPLINK=300
#下行downlink 3200 k 大概一半左右,以便能够得到更多的并发连接
DOWNLINK=1500

echo "==================== Packetfilter and Traffic Control 流量控制 By 网络技术部 Ver. 1.0===================="

start_routing() {
        echo -n "队列设置开始start......"
        #1.增加一个根队列,没有进行分类的数据包都走这个1:24是缺省类:
        tc qdisc add dev $DEV root handle 1: htb default 24
        #1.1增加一个根队下面主干类1: 速率为$UPLINK k
        tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0

        #1.1.1 在主干类1下建立第一叶子类,这是一个最高优先权的类.需要高优先和高速的包走这条通道,比如SYN,ACK,ICMP等
        tc class add dev $DEV parent 1:1 classid 1:11 htb rate $[$UPLINK]kbit ceil ${UPLINK}kbit prio 1
        #1.1.2 在主类1下建立第二叶子类 ,这是一个次高优先权的类。比如我们重要的crm数据.
        tc class add dev $DEV parent 1:1 classid 1:12 htb rate $[$UPLINK-150]kbit ceil ${UPLINK-50}kbit prio 2

        #1.2 在根类下建立次干类 classid 1:2 。此次干类的下面全部优先权低于主干类,以防重要数据堵塞.
        tc class add dev $DEV parent 1: classid 1:2 htb rate $[$UPLINK-150]kbit prio 3

        #1.2.1 在次干类下建立第一叶子类,可以跑例如http,pop等.
        tc class add dev $DEV parent 1:2 classid 1:21 htb rate 100kbit ceil $[$UPLINK-150]kbit prio 4

        #1.2.2 在次干类下建立第二叶子类。不要太高的速度,以防发大的附件大量占用带宽,例如smtp等
        tc class add dev $DEV parent 1:2 classid 1:22 htb rate 30kbit ceil $[$UPLINK-160]kbit prio 5

        #1.2.3 在次干类下建立第三叶子类。不要太多的带宽,以防大量的数据堵塞网络,例如ftp-data等,
        tc class add dev $DEV parent 1:2 classid 1:23 htb rate 15kbit ceil $[$UPLINK-170]kbit prio 6

        #1.2.4 在次干类下建立第四叶子类。无所谓的数据通道,无需要太多的带宽,以防无所谓的人在阻碍正务.
        tc class add dev $DEV parent 1:2 classid 1:24 htb rate 5kbit ceil $[$UPLINK-250]kbit prio 7

        #在每个类下面再附加上另一个队列规定,随机公平队列(SFQ),不被某个连接不停占用带宽,以保证带宽的平均公平使用:
        #SFQ(Stochastic Fairness Queueing,随机公平队列),SFQ的关键词是“会话”(或称作“流”) ,
        #主要针对一个TCP会话或者UDP流。流量被分成相当多数量的FIFO队列中,每个队列对应一个会话。
        #数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会。这种方式非常公平,保证了每一
        #个会话都不会没其它会话所淹没。SFQ之所以被称为“随机”,是因为它并不%C
相关阅读 更多 +
排行榜 更多 +
英雄大乱斗

英雄大乱斗

飞行射击 下载
汤姆猫跑酷手机版

汤姆猫跑酷手机版

冒险解谜 下载
小小村民TinyFolks

小小村民TinyFolks

模拟经营 下载