ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
本节介绍BandwidthControlCmd(简称bwcc)和IdletimerControlCmd(简称icc)。这两个命令都利用了iptables的扩展模块,所以相应功能基本上完全是靠iptables来实现的。 **1.BandwidthControlCmd命令** bwcc用于Android系统中的带宽控制。目前4.2系统中的带宽控制可针对设备、某个应用。另外还可以设置预警值,当带宽使用超过该值时会收到相应的通知(见2.2.2节中的NETLINK_NFQLOG)。 和流量控制类似,带宽控制的实现也是利用iptables。它利用了iptables中扩展模块libxt_quota2的功能,属于iptables的高级用法。这些内容对于非从事网络管理专业工作的人来说难度相当大。考虑到这个因素,本节将把bwcc当做一个黑盒,仅介绍其提供的各项功能。想深入研究的读者可在此基础上结合参考资料进一步了解。 bwcc提供的选项如下。 - enable和disable:开启或关闭带宽控制。 - removequota、getquota、getiquota、setquota、setquotas、removequotas、removeiquota:删除、查询和添加带宽配额。选项中的'i'针对一个或多个interface。选项中的's'代表该选项可携带多个interface参数。 - addnaughtyapps和removenaughtyapps:以uid为目标,开启或关闭单个进程的带宽控制。 - setglobalalert、removeglobalalert、setsharedalert、removesharedalert、setinterfacealert、emoveinterfacealert:预警值添加/删除有关。可以设置全局(即所有网络接口,例如Wi-Fi、3G等)带宽预警值,或者单个设备(如仅针对wlan0)的带宽预警值。 - gettetherstats:获取绑定(Tether)设备的数据统计。后文将介绍Tether的相关知识点。 图2-21所示为利用ndc命令为Galaxy Note 2 setglobalalert后的结果。图中为bwcc设置了全局配额是1000字节,当使用测试机下载数据超过1000字节时,将得到如图2-22所示的警告消息。 :-: ![](https://box.kancloud.cn/35c607a1984e4251d7657732ad250d9c_1185x392.jpg) 图2-21 bwcc setglobalalert结果 :-: ![](https://box.kancloud.cn/fd8beb012c154259fab078962a5e1f07_472x460.jpg) 图2-22 ndc monitor得到的警告消息 图2-22所示最后一行打印了来自Kernel的qlog UEvent消息,以通知在wlan0设备上数据流量已超过配额。 * * * * * **提示** bwcc应该是Netd中难度最大的模块了,其难点是如何利用iptables进行带宽控制。相比其内部实现而言,掌握bwcc的功能对绝大多数Android开发者来说也许更加实用。 * * * * * **2.IdletimerControlCmd命令** icc利用了iptables另一个扩展模块libxt_idletimer,其对应的iptables命令格式如下。 ~~~ iptables-t raw-A idletimer-i nic-j IDLETIMER--timeout--label lable--send_nl_msg 1 ~~~ 其中,各个参数的含义如下。 - timeout:超时时间,单位是秒。 - label:用来标示该rule的唯一名字。 - send_nl_msg:如果超时,则通过/sys/net/xt_idletimer触发UEvent消息(回顾2.2.2节中关于"xt_idletimer"UEvent消息的介绍)。 * * * * * **提示** 奇怪的是,笔者在模拟器和Galaxy Note 2上利用ndc测试icc命令均不能添加超时规则。而同样的命令放到Ubuntu 12.04上却工作正常(但Ubuntu上的iptable却不支持--send_nl_msg选项)。看来这个新颖的功能在目前的系统中支持得还不够好。 * * * * *