在项目开发中经常会出现网络链接报错,通常的做法就是查看客户端或者服务端的日志。但是这种查日志的方式有时候更多是定位代码(服务)级别的错误,如果涉及底层一些的错误就无法定位。有时候可能日志都没有打印出来,这时候就需要进行网络抓包。
网络抓包通常有两个步骤,第一是获取数据包,第二是展示(分析)数据包。如果是在window平台可以直接使用wireshark或者fiddler,这两个工具都可以抓包和分析。linux下面默认是没有界面的,所以抓包使用(tcpdump),分析数据使用wireshark。
一、tcpdump使用
dump the traffic on a network,对网络上的数据包进行截获的包分析工具,支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句。
tcpdump -i lo src host 192.168.0.240 and dst port 80 -w ./tmp/output.cap
注:
- -i lo:只抓经过网卡lo的包,默认是第一块网卡
- -s 0:snaplen不限制由程序决定,默认是68字节
- src host:源主机为指定ip
- dst port:目标端口是指定port,指定目标端口就会过滤掉响应的tcp连接(如挥手过程)
- -w:保存到指定文件
二、wireshark使用
1.导入数据包
从图中可以看到1-10是一个完整的请求流程。1-3是tcp三次握手,5是http请求,13-17是tcp四次挥手。
通过右键追踪流可以完整展示一次请求(把多个请求合并),具体如下图:红色代表http请求,蓝色代表响应。
2.常规操作
2.1 筛选条件
在wireshark可以设置筛选的条件,比如tcp.port,ip.addr等(因为tcp才有端口,ip才有host地址)。因为我们在tcpdump的时候就做过了一些筛选,所以在wireshark中筛选的动作就可以省略。
2.2 搜索关键字
-
全文搜索 frame contains “xx”
-
全文搜索正则匹配 frame matches “(!?)xx”,其中(!?)表示不区分大小写
- 根据协议查找 dns.qry.name contains “xxx”,查找DNS协议下面包含xx的字段