1
GrayXu OP 问这个问题,也是觉得这个需求看起来对于路由系统来说似乎是并不难实现的 feature 。但确实没有找到能满足需求的方案。
|
2
neroxps 2023-02-18 18:43:41 +08:00 via iPhone 1
你这个问题是路由如何感知准确的出口宽带。这是个悖论。
如果路由定时测速来获得准确的出口宽带,那么肯定会影响网络体验。 |
3
1423 2023-02-18 18:56:42 +08:00 1
|
4
billlee 2023-02-18 20:30:26 +08:00 via Android 1
这个就是很难实现。因为限速就是靠丢包实现的,QoS 需要把限速设置得比运营商提供的带宽小,自己主动选择丢哪些包,避免运营商随便丢。
|
5
piku 2023-02-18 20:33:33 +08:00 via Android
没理解,根据来源 ip 给数据包打优先级不是路由器的基本功能吗?队列又不是限速,和带宽有什么关系?
|
6
fortitudeZDY 2023-02-18 21:04:00 +08:00 via Android 1
试试 tc hfsc
|
7
hfl1995 2023-02-18 23:46:49 +08:00
不如这些 ip 分流到国外。
|
8
datocp 2023-02-19 02:00:08 +08:00 via Android 1
openwrt 下的 qos 有带有 prio 优先级的 htb ,还有一个高深莫测的 hfsc 。最终我认为便于理解的只有 htb 简单到设置 prio 0 ~ 9 ?优先级就可以了。去年发现 hfsc 没有优先级概念,不能有效的分配有限的带宽,后来上行又改回 htb 。hfsc 是一个太数学化的东西,我看了 N 遍文档依然不大会设置,特别是如何测定准确的延迟。hfsc 实现了精确的延迟设置,htb 实现的是模糊的流量和延迟对比关系。其实如果你能悟到 adsl 线路,当前带宽 60%实现低延迟,80%达到流量和延迟的平衡。于是会发现 htb 比 hfsc 简单,在 20m 光纤能实现,随着带宽到了 100m/1000m 更是量更足一切都能按预定的优先级限速跑,高优先级的流量也更有保障。
然后这么多年玩下来,真正能用于学习的 qos 规则,我是从 tomato 开始学习的。其它的如果站在 tomato 的规则来看其它家的 qos 实现上多少有缺陷。即便大家用 htb 写得规则也是各异,性能也因为规则耗 cpu 性能导致各种呑吐异常。 爱快是没有 ssh 的吧,那么想尝试用 shell 脚本去改这个应该是不可能的。 使用 htb,现实情况会出现多并发的低优级流量和低并发的高优先级流量抢夺。从经验上判断,如果之前设定总带宽大,后来带宽变小了,此时低优先级的设置值可能能达到变化后的低带宽的 100%,才有可能出现迅雷淹没了高优先级的游戏数据。不然 prio 对于低并发的不同优先级流量应该还是能正常工作的。 我觉得这对于会写 qos 规则+shell 应该是小菜一碟,至于下行的测试可以随便在凌晨。iptables 只允许,im.qq.com 下载。通过 iptables connbytes 是非常简单的事。 |
9
life90 2023-02-19 19:53:06 +08:00 via Android
mikrotik ROS 可以实现你的需求。需要会写脚本。不难的
|
10
ericbize 2023-02-19 22:09:04 +08:00
你可能研究一下这个功能能不能满足
https://wiki.mikrotik.com/wiki/Manual:Queue HTB Properties parent (Name of parent simple queue, or none) : assigns this queue as a child queue for selected target {{{...}}}. Target queue can be HTB queue or any other previously created simple queue. In order for traffic to reach child queues, parent queues must capture all necessary traffic. priority (1..8) : Prioritize one child queue over other child queue. Does not work on parent queues (if queue has at least one child). One is the highest, eight is the lowest priority. Child queue with higher priority will have chance to reach its max-limit before child with lower priority. Priority have nothing to do with bursts. |
11
EvineDeng 2023-02-20 14:14:36 +08:00 1
如果你用爱快的话,这个脚本中可以通过其他 Linux 机器设置 crontab 来自动检测上行带宽:
``` #!/usr/bin/env bash ## netlimit.sh 用法: ## ./netlimit.sh <限速值,单位 KB/s> 如 ./netlimit.sh 12800 ## 脚本依赖于以下软件包,请自行安装好:curl openssl ## 限速上限,可以依靠其他脚本测得限速上限,然后以参数 1 传入 upload_limits="$1" ## 爱快用户名 ik_username="" ## 爱快密码 ik_password="" ## 登陆爱快网址,形如: http://192.168.1.1:10000 url_ikuai="" ## 这个 body 是设置“智能流控”模式的提交 body ,请先通过浏览器开发工具在爱快的“流控分流->智能流控”这里抓取你爱快系统的 body ,修改为你的 parent/interface/download/id 等 data_raw="{\"func_name\":\"layer7_intell\",\"action\":\"set_iface\",\"param\":{\"parent\":\"wan1\",\"interface\":\"wan1\",\"upload\":\"$upload_limits\",\"download\":128000,\"qos_switch\":1,\"comment\":\"\",\"id\":39358639}}" ## 登陆 ik_login() { local ik_username="$1" local ik_password="$2" local passwd=$(echo -n "$ik_password" | openssl md5 -hex | awk '{print $2}') local pass=$(echo -n "salt_11${ik_password}" | base64) local cookie=$(curl $url_ikuai/Action/login -Ssi --data "{\"username\":\"$ik_username\",\"passwd\":\"$passwd\",\"pass\":\"$pass\",\"remember_password\":\"true\"}" | awk '/Set-Cookie:/{print $2}' 2>/dev/null) [[ $cookie ]] && echo $cookie } ## 获取 cookie login_cookie=$(ik_login "$ik_username" "$ik_password") ## 设置限速 if [[ $login_cookie ]]; then echo -n "设置爱快限速为 $upload_limits KB/s ,结果:" curl $url_ikuai/Action/call --header "Cookie: $login_cookie" --data-raw "$data_raw" else echo "未能成功登陆爱快" fi ``` |
12
EvineDeng 2023-02-20 14:15:56 +08:00 1
说错了,通过其他 Linux 机器设置 crontab 来自动检测上行带宽后设置爱快的智能模式的宽带上限。如何检测宽带上限你可以用其他现成的工具。
|