tcpdump是java线上问题排查的底层“听诊器”,需在客户端或服务端精准抓取出口/入口流量,必用-ii -nn -s0 -w组合参数,并结合port、host、tls特征等过滤表达式定位tcp重传、rst、syn超时、tls握手卡顿及dns异常。

Java 应用在 Linux 线上环境出现连接超时、请求失败、SSL 握手异常或 HTTP 响应不完整等问题时,单看应用日志和 JVM 指标往往不够。真正的问题可能藏在网络协议层——比如 TCP 重传、RST 中断、SYN 超时、TLS 握手卡住、DNS 解析失败等。这时候,tcpdump 是最直接、最低侵入的“听诊器”,它不依赖 Java 进程状态,能捕获网卡原始流量,帮你看到协议交互的真实过程。
明确抓包位置和时机
不要在 Java 进程所在机器盲目全量抓包。先判断问题发生在哪一端:
- 如果是 Java 客户端调用外部服务(如调用第三方 API)出错,重点在客户端机器抓 Java 进程发出的出口流量(如
src host <java-host> and dst port <remote-port></remote-port></java-host>) - 如果是外部客户端访问你的 Java 服务(如 Spring Boot Web 接口)失败,重点在服务端机器抓入向流量(如
dst host <your-java-server-ip> and dst port 8080</your-java-server-ip>) - 抓包前确认 Java 进程正在运行且端口已监听(
ss -tlnp | grep :8080),避免抓到“无连接”的空包 - 复现问题时再启动 tcpdump,或使用
-c限定数量(如-c 200),防止日志刷屏或磁盘写满
必加参数:-nn -s0 -w + 指定网卡
线上环境必须组合使用这四个参数,否则数据不可靠或难分析:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
-
-nn:禁用域名和端口名解析(不把 443 显示成 https,不把 192.168.1.100 解析成 host.example.com),避免 DNS 查询延迟和干扰,也确保你看到的是真实数值 -
-s0:捕获完整数据包(默认只截前 96 字节),尤其对 HTTPS/TLS 流量,握手字段(ClientHello/ServerHello)、证书、ALPN 协议协商都可能在后半段,缺字节就看不到关键信息 -
-w /tmp/java-debug.pcap:直接保存为标准 pcap 文件,不打印到终端,避免丢包、避免影响输出缓冲,也方便后续用 Wireshark 深度分析 -
-i eth0(替换为实际网卡名):用tcpdump -D先查可用接口,避免抓错网卡(比如容器环境常有 docker0、vethxxx 等虚拟接口)
精准过滤 Java 相关流量
避免海量无关包淹没关键路径。常用过滤表达式示例(根据实际调整 IP 和端口):
- 抓取某 Java 服务端口全部进出流量:
tcpdump -i eth0 -nn -s0 -w /tmp/app-8080.pcap port 8080 - 只抓客户端发起的 TLS 握手(ClientHello):
tcpdump -i eth0 -nn -s0 -w /tmp/tls-handshake.pcap 'port 443 and (tcp[((tcp[12:1] & 0xf0) >> 2):1] = 0x16)'(利用 TLS 记录类型 0x16 判断) - 抓特定 Java 客户端与目标服务通信:
tcpdump -i eth0 -nn -s0 -w /tmp/client-to-api.pcap 'src host 10.1.2.3 and dst host api.example.com and dst port 443' - 排查 DNS 异常(Java 应用启动慢或 resolve 失败):
tcpdump -i eth0 -nn -s0 -w /tmp/dns.pcap port 53
结合 Java 行为交叉验证
抓包不是终点,要和 Java 侧现象对齐:
- 如果 Java 日志报
java.net.ConnectException: Connection refused,tcpdump 中应看不到 SYN 包发出(说明路由/DNS 问题),或看到 SYN 发出但无 SYN+ACK 返回(说明目标端口未监听或防火墙拦截) - 如果报
SocketTimeoutException: Read timed out,Wireshark 中查看对应 TCP 流:是否有大量重传(Retransmission)、是否有零窗口通告(ZeroWindow)、是否有持续的 Dup ACK(接收方丢包) - 如果 HTTPS 请求卡住,检查 TLS 握手阶段:ClientHello 是否发出?是否收到 ServerHello?是否在 Certificate 或 ServerKeyExchange 后中断?这些都能在 tcpdump + Wireshark 的 TLS 解析视图中清晰定位
- 注意 Java 的 keep-alive 行为:一个连接复用多次请求,tcpdump 中是同一个五元组(src/dst ip/port + proto)下的多个 TCP segment,别误判为多个独立连接
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










