一个很有趣的业余小项目,展示了awk的一种另类用法。
Enjoy!
Android系统上,在wifi热点模式下,如何监控每个连接设备的实时网速? 接口返回:mac地址 + 实时网速
流量统计不止是根据MAC地址做统计,还需要考虑到通信协议。因此在数据链路层嵌入代码是不妥的,最合适的地方是传输层。 但是无论是数据链路层还是传输层代码,都位于内核空间,修改成本太大。 因此该方案不以考虑。
由于需要在wifi热点模式下统计各个连接终端的实时网速,目前没有找到合适的工具可以直接使用。 PS:正在跟以前做AP路由器的同事探讨,目前没有结论。
snniffer工具,比如tmpdump,具有很灵活的抓包能力,不止可以分析协议,还可以按主机、IP、端口做过滤,而且具有灵活的输出方式。
因此可以考虑抓包后使用grep、awk等工具做分析,然后写入文件,供上层调用。
代码见flowstats.sh
。
程序说明如下:
-
tcpdump
:抓包输出如下:
1555148383.759326 02:42:ac:11:00:02 > 02:42:aa:bd:a5:2c, IPv4, length 66: 172.17.0.2.41634 > 10.60.242.105.6379: tcp 0 1555148383.759546 02:42:ac:11:00:02 > 02:42:aa:bd:a5:2c, IPv4, length 841: 172.17.0.2.60034 > 10.60.242.105.6379: tcp 775 1555148383.759546 02:42:ac:11:00:02 > 02:42:aa:bd:a5:2c, IPv4, length 841: 172.17.0.2.60260 > 10.60.242.105.6379: tcp 775 1555148383.759638 02:42:aa:bd:a5:2c > 02:42:ac:11:00:02, IPv4, length 70: 10.60.242.105.6379 > 172.17.0.2.60034: tcp 4 1555148383.759657 02:42:ac:11:00:02 > 02:42:aa:bd:a5:2c, IPv4, length 66: 172.17.0.2.60034 > 10.60.242.105.6379: tcp 0 1555148383.759671 02:42:aa:bd:a5:2c > 02:42:ac:11:00:02, IPv4, length 70: 10.60.242.105.6379 > 172.17.0.2.60260: tcp 4 1555148383.759683 02:42:ac:11:00:02 > 02:42:aa:bd:a5:2c, IPv4, length 66: 172.17.0.2.60260 > 10.60.242.105.6379: tcp 0 1555148383.759697 02:42:aa:bd:a5:2c > 02:42:ac:11:00:02, IPv4, length 1674: 10.60.242.105.6379 > 172.17.0.2.59746: tcp 1608 1555148383.759704 02:42:ac:11:00:02 > 02:42:aa:bd:a5:2c, IPv4, length 66: 172.17.0.2.59746 > 10.60.242.105.6379: tcp 0 1555148383.759717 02:42:aa:bd:a5:2c > 02:42:ac:11:00:02, IPv4, length 1674: 10.60.242.105.6379 > 172.17.0.2.60028: tcp 1608
-
grep
:过滤IP数据 -
awk
:awk脚本的逻辑大致如下:
- 在BEGIN代码块中配置环境;
- 在代码主体中按行做统计,然后在恰当的时机(比如传输1000个数据包之后)记录统计信息。
统计结果输出:
flow_by_station.txt
:按照station统计到的结果。格式如下:station tx_bytes tx_packs rx_bytes rx_packs 0c:c4:7a:85:38:12 2244 34 894820 9333 d0:94:66:43:f4:5a 1239872 5022 909166 9484 ac:1f:6b:13:b6:3e 3411523 30665 3914813 17195 0c:c4:7a:cb:22:d2 3411523 30665 66 1 01:00:5e:6f:70:0c 3411523 30665 9042 137 74:1f:4a:a0:85:2a 184925 2087 675951 2132 9c:b6:54:0c:96:6c 1098 9 1746 15 d0:94:66:43:e7:7d 1241446 5033 910322 9498 0c:c4:7a:b5:14:ee 2244 34 910322 9498 0c:c4:7a:85:3b:92 2244 34 910322 9498 ac:1f:6b:13:c3:fa 2244 34 66 1 0c:c4:7a:85:38:1c 2310 35 66 1 d0:94:66:43:ea:d1 1247604 5046 914338 9536
flow_by_pair.txt
:按照pair(src > dst)统计到的结果。格式如下:src > dst bytes packs 0c:c4:7a:85:38:1c > 01:00:5e:6f:70:0c 2310 35 ac:1f:6b:13:b6:3e > 9c:b6:54:0c:96:6c 1746 15 0c:c4:7a:85:3b:92 > 01:00:5e:6f:70:0c 2244 34 74:1f:4a:a0:85:2a > ac:1f:6b:13:c3:fa 66 1 9c:b6:54:0c:96:6c > ac:1f:6b:13:b6:3e 1098 9 ac:1f:6b:13:b6:3e > d0:94:66:43:e7:7d 910322 9498 0c:c4:7a:b5:14:ee > 01:00:5e:6f:70:0c 2244 34 ac:1f:6b:13:b6:3e > 74:1f:4a:a0:85:2a 675951 2132 74:1f:4a:a0:85:2a > ac:1f:6b:13:b6:3e 184793 2085 74:1f:4a:a0:85:2a > 0c:c4:7a:cb:22:d2 66 1 d0:94:66:43:ea:d1 > ac:1f:6b:13:b6:3e 1247604 5046 ac:1f:6b:13:b6:3e > d0:94:66:43:ea:d1 914338 9536 0c:c4:7a:85:38:12 > 01:00:5e:6f:70:0c 2244 34 d0:94:66:43:f4:5a > ac:1f:6b:13:b6:3e 1239872 5022 ac:1f:6b:13:b6:3e > d0:94:66:43:f4:5a 909166 9484 d0:94:66:43:e7:7d > ac:1f:6b:13:b6:3e 1241446 5033