和楼主交流一下我的限速脚本
#*********脚本功能**********#脚本在全局变量“Invs”的控制下,每隔“Invs”秒获取一次wan口发送与收到的流量。
#连取10次后取平均值,即wan口在10次采样中的平均发送与收到流量。
#然后根据总上/下行流量阀值调整每个IP的限速值。
#*********使用方法**********
#网关广域网口名:wan ;局域网口名: lan
#在 \ip firewall address-list> 下建立名称为“userlist”的地址列表
#当有新IP加入这个列表时会自动在 \queue simple>下建立相应的限速项目
#定义变量
#脚本停止开关
:global IsRun true
#循环间隔秒数除以10的数
:global Invs 10;
#当前下行总流量变量
:global RxCurRate 1000000
#当前限定的单IP下行带宽
:global RxCurSet 5000000
#单IP最大下行带宽
:global RxMaxRate 8000000
#单IP最小下行带宽
:global RxMinRate 500000
#总下行流量阀值
:global RxSwRate 18000000
#下行步进值
:local RxStepRate 10
#当前上行总流量变量
:global TxCurRate 1000000
#当前限定的单IP上行带宽
:global TxCurSet 5000000
#单IP最大上行带宽
:global TxMaxRate 8000000
#单IP最小上行带宽
:global TxMinRate 500000
#总上行流量阀值
:global TxSwRate 18000000
#上行步进值
:local TxStepRate 10
#合法用户地址列表名称
:global ListName "userlist"
#临时存放地址列表项的变量
:local ul
#临时存放地址的变量
:local tadd
#临时的循环变量
:local i 0
#临时存放总流量的变量
:local CurRate 10
#临时存放旧下行限定
:local OldRxSet 10
#临时存放旧上行限定
:local OldTxSet 10
:set RxStepRate ($RxCurSet / 10);
:set TxStepRate ($TxCurSet / 10);
:while ($IsRun) do={
:set OldRxSet $RxCurSet
:set OldTxSet $TxCurSet
:if ($RxCurRate<$RxSwRate) do={
:if ($RxCurSet<$RxMaxRate) do={
:set RxCurSet ($RxCurSet + $RxStepRate);
:set RxStepRate ($RxCurSet / 10);}
} else={
:if ($RxCurSet>$RxMinRate) do={
:set RxStepRate ($RxCurSet / 10);
:set RxCurSet ($RxCurSet - $RxStepRate)}}
:if ($TxCurRate<$TxSwRate) do={
:if ($TxCurSet<$TxMaxRate) do={
:set TxCurSet ($TxCurSet + $TxStepRate);
:set TxStepRate ($TxCurSet / 10);}
} else={
:if ($TxCurSet>$TxMinRate) do={
:set TxStepRate ($TxCurSet / 10);
:set TxCurSet ($TxCurSet - $TxStepRate)}}
:if (($OldRxSet!=$RxCurSet)||($OldTxSet!=$TxCurSet)) do={
:foreach ul in= do={
:set tadd
:if ([:len ] > 0) do={
/queue simple set $tadd limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
burst-time=30/30
} else={
/queue simple add name=$tadd dst-address=$tadd \
limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
burst-time=30/30
}
}
}
:set RxCurRate 0
:set TxCurRate 0
:for i from=0 to=9 do={
/interface monitor-traffic wan once do={:set CurRate $received-bits-per-second}
:set RxCurRate ($RxCurRate + $CurRate)
/interface monitor-traffic wan once do={:set CurRate $sent-bits-per-second}
:set TxCurRate ($TxCurRate + $CurRate)
:delay $Invs
}
:set RxCurRate ($RxCurRate / 10)
:set TxCurRate ($TxCurRate / 10)
}
我的最新改版
#定义变量#脚本停止开关
:global IsRun true
#循环检测WAN口流量间隔秒数
:global Invs 5;
#循环检测WAN口流量次数
:global ChkTimes 60
#当前下行总流量变量
:global RxCurRate 10
#当前限定的单IP下行带宽
:global RxCurSet 10000000
#单IP最大下行带宽
:global RxMaxRate 20000000
#单IP最小下行带宽
:global RxMinRate 1000000
#总下行流量上阀值
:global RxUpSwRate 60000000
#总下行流量下阀值
:global RxDwSwRate 30000000
#下行步进值
:local RxStepRate 10
#当前上行总流量变量
:global TxCurRate 10
#当前限定的单IP上行带宽
:global TxCurSet 1000000
#单IP最大上行带宽
:global TxMaxRate 1000000
#单IP最小上行带宽
:global TxMinRate 500000
#总上行流量上阀值
:global TxUpSwRate 50000000
#总上行流量下阀值
:global TxDwSwRate 30000000
#上行步进值
:local TxStepRate 10
#合法用户地址列表名称
:global ListName "userlist"
#临时存放地址列表项的变量
:local ul
#临时存放地址的变量
:local tadd
#临时的循环变量
:local i 0
#临时存放总流量的变量
:local CurRate 10
#临时存放旧下行限定
:local OldRxSet 0
#临时存放旧上行限定
:local OldTxSet 0
:while ($IsRun) do={
:set RxStepRate ($RxCurSet / 3);
:set TxStepRate ($TxCurSet / 3);
:if (($OldRxSet!=$RxCurSet)||($OldTxSet!=$TxCurSet)) do={
:foreach ul in= do={
:set tadd
:if ([:len ] > 0) do={
/queue simple set $tadd limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
burst-time=30/30
} else={
/queue simple add name=$tadd dst-address=$tadd \
limit-at=[:tostr ($RxCurSet . "/" . $TxCurSet)] \
max-limit=[:tostr (($RxCurSet + $RxStepRate) . "/" . ($TxCurSet + $TxStepRate))] \
burst-limit=[:tostr (($RxCurSet * 2) . "/" . ($TxCurSet * 2))] \
burst-threshold=[:tostr (($RxCurSet - $RxStepRate) . "/" . ($TxCurSet - $TxStepRate))] \
burst-time=30/30
}
}
}
:set RxCurRate 0
:set TxCurRate 0
:for i from=1 to=$ChkTimes do={
/interface monitor-traffic wan once do={:set CurRate $received-bits-per-second}
:set RxCurRate ($RxCurRate + $CurRate)
/interface monitor-traffic wan once do={:set CurRate $sent-bits-per-second}
:set TxCurRate ($TxCurRate + $CurRate)
:delay $Invs
}
:set RxCurRate ($RxCurRate / $ChkTimes)
:set TxCurRate ($TxCurRate / $ChkTimes)
:set OldRxSet $RxCurSet
:set OldTxSet $TxCurSet
:if ($RxCurRate<$RxDwSwRate) do={:set RxCurSet ($RxCurSet + $RxStepRate);}
:if ($RxCurRate>$RxUpSwRate) do={:set RxCurSet ($RxCurSet - $RxStepRate);}
:if ($TxCurRate<$TxDwSwRate) do={:set TxCurSet ($TxCurSet + $TxStepRate);}
:if ($TxCurRate>$TxUpSwRate) do={:set TxCurSet ($TxCurSet - $TxStepRate);}
:if ($RxCurSet<$RxMinRate) do={:set RxCurSet $RxMinRate;}
:if ($RxCurSet>$RxMaxRate) do={:set RxCurSet $RxMaxRate;}
:if ($TxCurSet<$TxMinRate) do={:set TxCurSet $TxMinRate;}
:if ($TxCurSet>$TxMaxRate) do={:set TxCurSet $TxMaxRate;}
} 谢谢LZ
也许这里的资料不一定符合每个人的网络环境,但我相信都是发帖者的心血,我们必须去尊敬他们的劳动。
重要的是大家去体会理解里面的启发意义,自己加以修改利用才是对作者的尊重也是对自己负责的态度。也只有这样才会有进步。
本人复制了LZ的第一版回去仔细研究了,发现并不适合自己用,但却从其中得到了不少的启发。在此谢谢LZ为大家所作的努力。 这样的人,才叫无私。 我觉得该顶的文章 我楼上的兄弟,
#在 \ip firewall address-list> 下建立名称为“userlist”的地址列表
这个要怎么做?
NAME userlist
ADDRESS 0.0.0.0 是这样吗?
还是:
NAME userlist
ADDRESS 192.168.1.0/24
哪个?////
////////
楼上在兄弟,我不确定是不是我哪里搞错了,我这里你的算法好像有问题/ 我2M ADSL
#定义变量
#脚本停止开关
:global IsRun true
#循环检测WAN口流量间隔秒数
:global Invs 5;
#循环检测WAN口流量次数
:global ChkTimes 60
#当前下行总流量变量
:global RxCurRate 10
#当前限定的单IP下行带宽
:global RxCurSet 1000000
#单IP最大下行带宽
:global RxMaxRate 1400000
#单IP最小下行带宽
:global RxMinRate 500000
#总下行流量上阀值
:global RxUpSwRate 1600000
#总下行流量下阀值
:global RxDwSwRate 1100000
#下行步进值
:local RxStepRate 10
#当前上行总流量变量
:global TxCurRate 10
#当前限定的单IP上行带宽
:global TxCurSet 400000
#单IP最大上行带宽
:global TxMaxRate 500000
#单IP最小上行带宽
:global TxMinRate 300000
#总上行流量上阀值
:global TxUpSwRate 510000
#总上行流量下阀值
:global TxDwSwRate 300000
这样的设置 有时最大的下载值会到1866666有时才666666
请问是我哪里设错了吗?
[ 本帖最后由 z125454760 于 2008-12-19 15:27 编辑 ] 不是很明白 顶一下留个记号。
回复 111# 的帖子
都不是,你这是一次加一组地址(256个).这个脚本应该是一个一个加IP,因为每个IP都要限速的,如你有十台电脑上网IP为:192。168。0。1-----192。168。0。10
应使用命令:ip fir addadd list=userlist address=192.168.0.1
ip fir addadd list=userlist address=192.168.0.2
ip fir addadd list=userlist address=192.168.0.3
........
ip fir addadd list=userlist address=192.168.0.10
依次添加每个地址 有人用过ADSL 4M的有效果吗?谢谢。。。 ....... 还行 5条adsl效果很好 正需要动态的限速控制啊!不管行不行都谢谢先! 强人。利害哇,顶你。 动态限速思路很好。学习中。 以前用过,还不错