wireshark
1 背景知识
WireShark 是非常流行的网络封包分析软件,简称小鲨鱼,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。
WireShark 是开源软件,可以放心使用。可以运行在 Windows 和 Macos 上。对应的,Linux 下的抓包工具是 tcpdump。使用 WireShark 的人必须了解网络协议,否则就看不懂 WireShark 了。
2 WireShark 安装
请解压 Wireshark_4.4.1_Portable.7z 绿色版安装包,运行即可。
WireShark 有两方面重要的方法。
- 捕获过滤器配置。
- 显示过滤器配置。
3 捕获过滤器配置
由于大部分服务器为 Linux,则使用 tcpdump 命令,方便配置定时任务和后台执行。
nohup sudo tcpdump -i any -vv port 54321 -Z root -s 0 -G 1800 -w /data/tcp/%Y_%m%d_%H%M_%S.pcap &
选项 | 说明 |
---|---|
-i | 指定监听的网络接口(网卡) |
-vv | 输出详细的报文信息。 |
port | 监听端口 |
-s | 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节 |
-G | 每半小时切分一个文件。 |
-w | 直接将包写入文件中,并不分析和打印出来。 |
4 故障诊断流程
4.1 端口解码
有时无法判断这个端口关联的应用程序或服务是什么,为了简化查看的难度,所以需要进行端口解码。
分析
-> 解码为
-> 修改协议的解析行为(点击
+ )
。
把当前改为 PGSQL
字段 | 值 | 类型 | 默认 | 当前 |
---|---|---|---|---|
TCP port | 54321 | 整数,基数(10) | none | PGSQL |
4.2 确定故障发生时间
查看数据库日志,与应用开发日志。
4.3 确定故障发生的主机
确定应用程序ip地址与数据库地址。
应用程序 | IP | 端口 |
---|---|---|
清算系统 | 172.30.11.50 | |
数据库 | 172.16.11.122 |
4.4 显示所有TCP链接重置的问题
tcp.analysis.retransmission
筛选后,根据应用日志与数据库日志报错的时间、端口,找出对应应用报错的端口,请按照顺序挨个排查。
4.5 从应用程序方向排查故障
ip.src_host == 192.168.10.187 and tcp.srcport ==58512
4.6 从数据库方向排查故障
ip.src_host == 192.168.10.158 and tcp.dstport ==58512
5 其他常用显示过滤器
5.1 模糊匹配
pgsql.val.data contains "120101" and tcp.flags.reset == 1
5.2 显示tcp 链接被重置的情况
tcp.flags.reset == 1
5.3 查询 JDBC 心跳所发出的数据包。
pgsql.query == "select * from pg_is_in_recovery()"
6 输出诊断报告
- JDBC 网络心跳线程超时时间老版本
3s
不可配置,新版本3s可配置。 - JDBC 网络心跳线程会在内存中记录主备节点状态,业务线程执行语句时若执行时间超过1s未收到数据库返回结果,则会到上述内存区域查看节点状态。网络心跳超时后,内存中清空了节点状态,这时新建连接会报找不到主机错误。老连接若业务线程执行语句超过
1s
未收到数据库返回结果(快语句不受影响),查看内存区域是空,就会断开数据库连接,进入重连重试流程。(部分语句可以重试)无法重试的部分报I/O error
,后续还会报连接已关闭。可以重试的部分,不会抛出异常,重新执行语句。单个语句最多重试10
次。 - 业务线程受限于应用设置也会有超时的情况。
7 参考链接
Wireshark · Go Deep
Wireshark · Display Filter Reference: PostgreSQL