通用技术 [centos7][nginx][tshark] 基于 tshark 的页面流量统计

bauul · 2018年05月15日 · 最后由 重来看雨 回复于 2018年07月20日 · 4093 次阅读
本帖已被设为精华帖!

缘由

因为收到反馈说我们的app页面刷新慢,初步分析呢是因为运营的小伙伴上传了较大的图片导致的,然后就引发了一堆优化:

  • ERP上传限制 ==> 开发
  • 文件服务器针对大图片自动压缩 ==> 运维
  • app流量统计 ==> 测试

怎么做

既然问题来了,那么怎么做呢?
以前做过app性能获取的工具,但是不理想,兼容性差:

  • android 5.0的手机上没问题的方法可能到了6.0的版本不适用
  • 小米手机上成功的,可能在华为手机上不行

开启一个代理服务器,通过抓包过滤出被测设备产生的流量,进行统计相对靠谱的多

如何设置一个代理服务器

windows, linux, mac都可以设置代理服务器,我选择的是centos,
由于公司的服务目前是基于http协议的,所以需要搭建一个http的代理服务,我选择了nginx

安装nginx

yum install nginx

修改nginx配置

# 访问nginx安装目录
cd /etc/nginx
# 保存一份默认的配置文件
cp nginx.conf nginx.origin.conf
# 编辑配置文件,并增加http正向代理
vi nginx.conf

# server下面增加resolver,在location中增加proxy_passproxy_set_header
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name _;
root /usr/share/nginx/html;

resolver 8.8.8.8;
resolver_timeout 5s;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;
}

error_page 404 /404.html;
location = /40x.html {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}

修改好配置文件后,可以测试一下,并启动nginx

# 测试
nginx -t
# 启动
nginx
# 重启启动nginx
nginx -s reload
# 查看nginx访问日志,这个文件位置是在nginx.conf里面配的
tail -f /var/log/nginx/access.log

代理配置

这里我在win7的机器上打开浏览器,修改代理设置:centos机器ip,端口是上面配的80端口

修改代理后,成功访问163.com
注意了,我只代理了http协议,https不能正常访问是正常的

抓包工具的选择

wireshark
tcpdump
我希望最好是一个命令行工具,而不是GUI操作的工具,
tcpdump和tshark大部分场景基本一致,最后选择了wireshark自带的tshark

安装wireshark

yum install wireshark
yum install wireshark-gnome

查看帮助

tshark -h

查看IP地址

ifconfig

查询本机支持抓包的硬设

tshark -D

通过网卡

tshark -i 1
tshark -i enp2s0

抓包并输出到文件

tshark -i enp2s0 -w packets.pcap
tshark -i enp2s0 -w packets.pcap -c10 #只抓10个,抓满10即自动停止

查看packets.pcap文件中的内容

tshark -r packets.pcap
tshark -r packets.pcap -c5 #读取前5

通过-V参数查看具体信息

tshark -r p.pcap -V
tshark -r p.pcap -V -c1 #结合之前的-c,可以查看第一个包的具体内容

根据mac地址,ip地址,端口等条件抓包

The following values are available when using this option:
m MAC address resolution
n Network address resolution
t Transport layer (port name) resolution
N Use external resolvers
C Concurrent DNS lookups
tshark -i enp2s0 -n

抓包过滤:-f

tshark -ni 5 -w pack.pcap -f "tcp port 9980"

显示过滤:-Y

tshark -r pack.pcap -Y "tcp.dstport == 9980"

显示时间格式

tshark -r p.pcap -t ad

查看统计帮助

tshark -z help

http,tree Displays statistics related to HTTP requests and responses

tshark自带的统计方法

tshark -r pack.pcap -qz conv,tcp
================================================================================
TCP Conversations
Filter:<No Filter>
| <- | | -> | | Total | Relative | Duration |
| Frames Bytes | | Frames Bytes | | Frames Bytes | Start | |
192.168.1.189:57399 <-> 192.168.1.171:9980 1332 2008853 341 22849 1673 2031702 0.196315903 0.4847
192.168.1.189:57400 <-> 192.168.1.171:9980 376 565847 126 8770 502 574617 0.196795638 0.1422
192.168.1.189:57397 <-> 192.168.1.171:9980 231 340320 78 7273 309 347593 0.000000000 0.4854
192.168.1.189:57402 <-> 192.168.1.171:9980 86 123830 37 3437 123 127267 0.197292575 0.2728
192.168.1.189:57403 <-> 192.168.1.171:9980 59 85650 25 2711 84 88361 0.197415689 0.0599
192.168.1.189:57401 <-> 192.168.1.171:9980 50 71782 24 2660 74 74442 0.197162662 0.0567
================================================================================

上面按tcp协议统计,将Total下面的Bytes那一列求和,可得总计使用的流量信息
下面按ip统计

tshark -r pack.pcap -qz conv,ip
================================================================================
IPv4 Conversations
Filter:<No Filter>
| <- | | -> | | Total | Relative | Duration |
| Frames Bytes | | Frames Bytes | | Frames Bytes | Start | |
192.168.1.171 <-> 192.168.1.189 631 47700 2134 3196282 2765 3243982 0.000000000 0.6811
================================================================================

服务端展示


已将tshark服务端抓包,解析结果完成,
这里是基于tshark原生的分析汇总结果,还需要更多的分析和处理,得出我们需要关注的数据

我的一点分析

由于我们的问题点主要是防止线上有大图片(文件大小),所以tshark自带的结果分析不符合我们的目标
我们的期望是得出哪些响应的大小超过了阀值(比如0.5M),那么可能是需要关注的重点
原来tshark是通过frame(帧)来记录所有的请求及响应的

tshark -r pack.pcap -Y "http.request_in != 0" -T fields -e "frame.number" -e "http.request_in" -e "http.response_in" -e "http.request_number" -e "http.response_number" -e "http.response.code" -e "http.host.uri"
Running as user "root" and group "root". This could be dangerous.
22 4 200
121 23 200
190 149 200
397 151 200

这里的22是response的frame number,4是请求的frame number,这样一个请求就和一个响应对应起来了,响应帧的长度即响应消耗流量(frame.len)

更多玩法

过滤sql语句

tshark -i 5 -n -f 'tcp dst port 3306' -T fields -e mysql.query
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp2s0'


SELECT project_name as projectName FROM tb_project

根据mysql 默认的3306端口过滤sql语句

根据被测机器ip以及目标域名进行过滤

tshark -i enp2s0 -t ad -w 2018.pcap -f "ip src host 被测机器ip(例:192.168.1.189)"
tshark -r 2018.pcap -R 'http.host==目标域名(例:www.xxx.com)' -qz conv,ip

拓展

  • 将本功能放到服务端,可在线配置,获取结果
  • 数据存库
    • 同品对比
    • 竞品对比
    • 可视化展示

Reference

《Practical Packet Analysis, 3rd Edition》
tshark 官网地址
wireshark 过滤器
wireshark display fields => 常用的:frame, http, tcp

附言 1  ·  2018年05月18日

已将tshark服务端抓包,原生解析展示完成,接下来是结果分析,感觉用java分析命令行结果,有点醉醉的

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 26 条回复 时间 点赞

马克,回头研究一下

hello 回复

你们测流量怎么玩的?

bauul 回复

我们目前米有搞这块😂

楼主为什么会选择tshark,而不是用tcpdump呢?tshark有什么特定场景是tcpdump不能完成的么?

若水三千 回复

嗯,大部分场景下,tshark和tcpdump都可以完成目的,可供考虑的因素:

  1. OS:
    • tshark支持win, mac, linux;
    • tcpdump在windows上的版本叫windump,即使同样的功能,也需要修改脚本或在脚本中加入系统判断
  2. tshark支持时间格式输出,tcpdump没有
  3. tshark支持的协议更丰富

总之,tshark功能相对tcpdump更强大一丢丢😈

没看懂这个工具能解决 缘由;感觉是主站工具使用说明摘抄;
挂上代理,看看慢的那个接口优化后同样的图片传输是否真的压缩了,
压缩后手机反应如何;
另外你们敢在正式服务器上搞着东西么

hellohell 回复

我这只是分享流量统计的方法,不知道你的问题点在哪里

我的问题点是感觉这个工具帽子太大;
想看的是 用这个工具后得出测量结果,是如何分析的;否则, 和开发改完后在手机上直接点点看看反应 有何本质区别?

hellohell 回复

噢,我明白你意思了,抓包是第一步,之后可以进一步分析,具体结果分析还没做好,等做好了我再更新到本帖

恒温 将本帖设为了精华贴 05月17日 16:48

使用adb 统计流量不行吗,为什么弄这么复杂?

bauul #12 · 2018年05月17日 作者
马俊锋 回复

android 5.0的手机上没问题的方法可能到了6.0的版本不适用
小米手机上成功的,可能在华为手机上不行

bauul 回复

基于/proc/net/xt_qtaguid/stats解析就好了,只要UID是独立的就可以统计。shell+busybox可以解决通用性

bauul #14 · 2018年05月22日 作者
浮云 回复

各个厂家的手机都有这个文件吗?
另外你说的独立UID,嗯,某些APP是超过一个进程的,所以对应的UID好像也是不一样的

bauul 回复

这是安卓的统计节点,目前都有,只是看谷歌P介绍会限制app对此节点的读取。

为什么不用fildder或者charles呢?

bauul #17 · 2018年05月28日 作者
yangjing 回复

知道这两个可以抓,手工测没问题,不过自动化方便吗?

bauul 回复

你说的自动化是指?

bauul #19 · 2018年05月28日 作者
yangjing 回复

测试流量的过程,在这里就是抓包,分析,出结果的过程自动化

bauul 回复

我觉得如果只是为了解决你帖子最顶端“缘由”那部分的问题,flidder和charles是完全可以做到的,因为以帖子中这一套东西下来,还是要付出些时间和精力去做,有的时候最快解决问题的方案就是最好的方案;当然,可以配合一些其它东西,达到设置规则和过滤就可以自动化的输出一个APP或是网站流量分析报告还是很赞的,很节省未来的时间,做完的话楼主可以考虑放到GITHUB,get一下。 :)

bauul #21 · 2018年05月28日 作者
yangjing 回复

嗯,主要领导说这个过程要自动化,所以想了这么一辙,等完成了统计,我再更新到这里

既然使用nginx代理了,直接统计nginx日志的流量,耗时不是更简单? nginx添加一个第三方模块可以通过隧道方式代理https ,
ngx_http_proxy_connect_module

bauul #23 · 2018年05月29日 作者
重来看雨 回复

这个还真没想到,还可以这么玩,感觉666的👍
今天和开发聊了一下,思路又不一样,开发的意思是可以走接口,拿到当前页面的所有图片链接,遍历这些链接,拿到请求用时和图片大小,重点关注图片大小

做事情的思路不对

bauul #25 · 2018年06月05日 作者
qianxing 回复

求指正😀

重来看雨 回复

nginx这个只能抓到指定域名的吧,并且只能抓到http或者https的,如果我们app访问的域名很多的话nginx,或者有其他协议的可能不好弄。

小萨 回复

nginx是代理服务器,所有请求都经过它啊。。nginx只支持http协议,其他协议就无解

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册