Skip to content

DonYum/flow_counter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Android系统上,在wifi热点模式下,监控每个连接设备的实时网速

一个很有趣的业余小项目,展示了awk的一种另类用法。

Enjoy!

问题描述

Android系统上,在wifi热点模式下,如何监控每个连接设备的实时网速? 接口返回:mac地址 + 实时网速

可行方案

修改传输层代码做统计

流量统计不止是根据MAC地址做统计,还需要考虑到通信协议。因此在数据链路层嵌入代码是不妥的,最合适的地方是传输层。 但是无论是数据链路层还是传输层代码,都位于内核空间,修改成本太大。 因此该方案不以考虑。

使用流量统计工具

由于需要在wifi热点模式下统计各个连接终端的实时网速,目前没有找到合适的工具可以直接使用。 PS:正在跟以前做AP路由器的同事探讨,目前没有结论。

使用siniffer工具做统计

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脚本的逻辑大致如下:

    1. 在BEGIN代码块中配置环境;
    2. 在代码主体中按行做统计,然后在恰当的时机(比如传输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
    

About

使用抓包的方式做流量统计。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages