移动性能测试 [tcpdump+Wireshark] 求解一个网上基本上搜不到的问题,希望大家能给点建议.

Yang · October 08, 2018 · Last by rywu replied at October 11, 2018 · 2405 hits

最近老板让我做一个关于统计分析安卓手机 app 应用流量统计的问题。

我的具体做法就是:

1.手机端打开应用软件 youtube,运行 1 小时

  1. linux 端用 tcpdump 捕获手机数据包,存成 pcap 文件,然后保存到 win 下,然后用 wireshark 分析

想要得到的结果是,在这 1 个小时里面,手机只在运行 youtube,但后台可能有其他 app 开启并且消耗流量。
如何根据 pcap 包和利用 wireshark 分析区别出主应用 youtube 和后台应用各自消耗了多少流量数据?

这个问题查了网上好多内容,基本没有找到合适的思路.....都说 tcpdump 得到的包很难做出这么细节的分析,求大家给点建议

共收到 18 条回复 时间 点赞
Yang #1 · October 08, 2018 Author

主要是 Wireshark 好像不能通过 pcap 包区别出不同的 appname,并给出流量数据。
利用会话统计能得到手机端不断发出的请求,但是根本没办法判断出这些每个请求是什么 app 下的
如下图
100.98.222.250 应该是手机端发起的,如果单纯直接将这一列求和的出来的流量只是 tcpdump 下手机整个系统的流量消耗,区分不出不同的后台应用。

Yang #2 · October 08, 2018 Author

另外如果看 TCP 流的话,如下

从发送方能看出里面包含字段 com.google.andriod.youtube..............但是这只是其中一个 TCP 流并且根本无法将全部的 TCP 流统计起来,将含有 com.google.andriod.youtube 字段的选出来算出流量.认为这是只用 youtube 的消耗流量。

所以现在有点苦恼,到底应该怎么做才能达到本来的目的呢......

我记得安卓自身或者一些第三方流量监控软件都可以实现?

Yang #4 · October 08, 2018 Author
hellcat 回复

但是那些好像不是特别准确,我知道有
$ cat /proc/uid_stat/uid/tcp_rcv

$ cat /proc/uid_stat/uid/tcp_snd

这样的命令可以看某个已经 uid 应用的流量,但是我不知道后台都有哪些应用在消耗流量。如果只是统计 youtube 和整个系统的流量的话,我可以用 wireshark 得到整个系统的流量和用上面的 2 个命令得到 youtube 的流量消耗,但是不知道的其他应用就没法统计了

Yang #5 · October 08, 2018 Author

另外我发现可以用这样的筛选器来得到一些有用的信息:
添加筛选器:tcp.flags.syn==1 然后如下图

红色方框里面内容:很显然的可以发现是 appname,是不是就可以根据这一点来得到不同 appname 的流量
更发现,如果表格里的协议是 TCP,则红色方框内不显示 appname,如果是 TLSv1.2 协议,则红色方框内显示 appname,这到底是为什么?到底哪个才是正在消耗的流量呢?为什么 TCP 协议反而不产生流量

Yang #6 · October 08, 2018 Author

是不是 youtube 在观看视频的时候,使用的 TLSv1.2 这样的安全传输协议?

Yang #7 · October 08, 2018 Author

但是当使用上述筛选器的时候又发现一个问题,就是用筛选器再次打开会话或者端点统计时,发现 TCP 栏下的数据包以及数据流量大小非常的少:

难道不能用这样的方式得到流量结果么?

Yang #8 · October 08, 2018 Author

如果我直接根据 tcp 流来看的话:我是不是可以从 1 开始不断看每个 TCP 流下的右下角是不是能出现 appname,然后分别加起来,但这样也太花时间了

app 与后台通信用的就是 TCP,无关 TLSv1.2。
目前一次性详细到查询具体哪个 app 消耗多少流量应该很困难,建议还是用 tcpdump+Wireshark,并禁用其他 app 流量。
或许可以试一下使用安卓自身提供的 TCP 收发长度统计功能,这个不需要禁用其他 app 流量

楼主是想统计手机里所有正在运行的应用各自消耗的流量么。。

想到的思路有用脚本获取所有正在运行的应用的 uid,然后用 $ cat /proc/uid_stat/uid/tcp_rcv 和 $ cat /proc/uid_stat/uid/tcp_snd 获取各自的流量。因为后台运行的系统应用太多了太复杂了,不太可能使用人工去统计吧

Yang #11 · October 09, 2018 Author
Ribosome 回复

所以还是分析 TCPdump 所获得的 pcap 包更加方便么?我现在正准备放弃 Wireshark 用 Python 的 dpkt 库来解析 pcap 包了,感觉 Wireshark 并不能得到这么详细的信息

Yang #12 · October 09, 2018 Author
Root_123 回复

我就是用的 tcpdump+Wireshark......现在感觉 Wireshark 处理 pcap 包并不能详细的得到我想要的各个 appname 以及所要的流量,所以打算用 Python 的 dpkt 库来解析 pcap 包,根据 SYN 得到 appname

Yang 回复

我感觉是。至于 pcap 包中要用哪些数据就没研究过了,查了一下 pcap 包里面还挺多东西。如果 dpkt 库能获取到 appname 的话那还是很方便的。

Yang #14 · October 09, 2018 Author
Ribosome 回复

dpkt 库也不能一下就能得到 appname,而且网上关于 dpkt 库的详解使用方面的实在太少了,大部分都得自己看源码来慢慢实现。我还在研究源码......

tcpdump,wireshark 是否可以 只筛选 youtube 对应的目标 ip。

tcpdump -i eth0 dst host hostname

tcpdump tcp port 23 and host 210.27.48.1

Yang #16 · October 11, 2018 Author
rywu 回复

port23 和 hos210.27.48.1 分别代表什么?

手机看 youtube 的时候手机 ip 应该是固定的,但是 youtube 的 ip 应该是不固定的吧,还有只要监听 hostname,抓住的流量就都是 youtube 产生的么

Yang 回复

监听 端口为 23 ,ip 为 210.27.48.1 ,youtube 每次出去的 ip 应该是同一个。如果有多个 ip 可以使用 or 加 ip。这块使用方法挺多的。

Yang 回复

你搜索下 tcpdump 用法就有了

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up