背景:公司的系统在生产环境运行一段时间之后,通过skywalking监控工具发现时不时会有接口调用耗时很长的情况出现。且监控到的数据和华为云ELB的监控日志不匹配,为了验证是否是由华为云ELB转发延迟导致,决定在生产上抓包验证,以下是使用抓包命令tcpdump+wiresharke配合分析的过程记录
如何使用:
tcpdump是linux系统自带的命令,功能强大、使用简单,相关参数如下:
tcpdump # 默认情况下,直接启动tcpdump将监视第一个网络接口(非lo口)上所有流通的数据包。
tcpdump -i eth1 # 【参数】-i,指定网卡监听
tcpdump -c 10 # 【参数】-c,指定抓取包的数量
tcpdump -v # 【参数】-v,显示详细的包头信息。-vv,-vvv更加详细
tcpdump -s 1024 # 【参数】-s, 指定截取包的长度。默认65535。如果包的长度超过截取的长度,
tcpdump -w test.cap # 【参数】-w, 将抓取的数据存到文件test.cap中
以上就是tcpdump的基本使用,再配合一些关键字和逻辑关键字就可以实现对定向包的抓取
关键字有:
dst 目的ip src 源ip port 端口 host 主机 等等
逻辑关键字有
and、or &&、 ||
以下是tcpdump抓包在后台显示的情况
如果需要解析成人可以阅读的内容,可以借助其他的一些命令或者工具,wiresharke就是其中一款功能强大的工具
如何分析
使用tcpdump -i eth0 port 9090 -w test.cap 将抓包的内容写入到文件中,再使用wiresharke打开相应的文件,即可做分析
打开界面如下:
其中可以看到在抓包期间抓获的所有的数据包,包括协议,tcp哪个阶段的包等等
如何只是单纯做展示,相信在实际使用中是满足不了需要的,在几分钟的抓包中可能抓获的包成千上万,如何做分析呢?
此时,wireshark有提供显示过滤器,只需要在显示过滤器中添加过滤条件,即可拿到符合自己预期的数据包,以该次生产事故的数据做分析。
条件如下:
当时对某个接口做压测一段时间,在华为云的ELB日志上监控到该次接口有耗时大于2秒的请求。
frame.time >= "Nov 8, 2022 14:21:58.001367000" and frame.time <= "Nov 8, 2022 14:21:58.996975000"
通过该过滤器,可以把在压测时段内的所有请求的数据拿到。由于本次是想查看接口耗时,在抓包的http请求中,在response包中有个字段:time since request。此时只需要把该字段添加到列表的列中显示即可:(在wiresharke的某个数据包中,右键点击相关字段--应用为列即可显示在列表中了)
再把相关过滤后的数据导成csv文件(文件--》导出分组解析结果--AS CSV)就可以生成对应的csv文件了
从csv文件中查看,有一次请求的耗时超过了2s,和华为云的ELB日志监控数据一致。
以上是使用tcpdump+wiresharke做抓包分析的一次应用实践!