wireshark

1 背景知识

WireShark 是非常流行的网络封包分析软件,简称小鲨鱼,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。

WireShark 是开源软件,可以放心使用。可以运行在 WindowsMacos 上。对应的,Linux 下的抓包工具是 tcpdump。使用 WireShark 的人必须了解网络协议,否则就看不懂 WireShark 了。

2 WireShark 安装

请解压 Wireshark_4.4.1_Portable.7z 绿色版安装包,运行即可。

WireShark 有两方面重要的方法。

  1. 捕获过滤器配置。
  2. 显示过滤器配置。

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

image.png

4.6 从数据库方向排查故障

ip.src_host == 192.168.10.158 and tcp.dstport ==58512 

image.png

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 输出诊断报告

  1. JDBC 网络心跳线程超时时间老版本 3s 不可配置,新版本3s可配置。
  2. JDBC 网络心跳线程会在内存中记录主备节点状态,业务线程执行语句时若执行时间超过1s未收到数据库返回结果,则会到上述内存区域查看节点状态。网络心跳超时后,内存中清空了节点状态,这时新建连接会报找不到主机错误。老连接若业务线程执行语句超过 1s 未收到数据库返回结果(快语句不受影响),查看内存区域是空,就会断开数据库连接,进入重连重试流程。(部分语句可以重试)无法重试的部分报 I/O error,后续还会报连接已关闭。可以重试的部分,不会抛出异常,重新执行语句。单个语句最多重试 10 次。
  3. 业务线程受限于应用设置也会有超时的情况。

7 参考链接

Wireshark · Go Deep
Wireshark · Display Filter Reference: PostgreSQL