13、网络问题调试:netstat、tcpdump、Wireshark、网络延迟分析

网络问题,说实话,是Android调试里最让人头疼的一类。你想想看,代码逻辑没问题,CPU、内存都正常,但用户就是反馈「刷不出内容」、「卡住了」、「图片加载慢」。这时候,十有八九是网络层出了幺蛾子。

我个人习惯,遇到网络问题先别急着翻代码。先问自己三个问题:连接建立了吗?数据在传输吗?延迟到底有多高?这三个问题搞清楚了,问题基本就定位了一半。

13.1 先用 netstat 看连接状态

netstat 是我在终端里敲得最多的命令之一。它告诉你当前系统里有哪些网络连接,状态是什么。在Android设备上,你可以通过adb shell来执行。

核心用法:

adb shell netstat -an | grep ESTABLISHED

这条命令列出所有已建立的TCP连接。我一般会配合 grep 过滤目标端口或IP。

有一次,我在调试一个视频App的播放卡顿问题。用户说「点开视频要等十几秒」。我连上设备,跑了一遍 netstat,发现连接状态全是 TIME_WAIT。嗯,这说明连接没有被正常复用,每次请求都在新建TCP连接。握手开销叠加起来,延迟自然就上去了。

小技巧: 关注 ESTABLISHEDTIME_WAIT 的比例。如果 TIME_WAIT 过多,说明连接池配置有问题,或者短连接使用不当。

netstat 还能看监听端口:

adb shell netstat -an | grep LISTEN

这能帮你确认某个服务是否真的在监听。比如你怀疑某个后台Service没启动,先看看端口有没有打开。

13.2 tcpdump:抓包才是硬道理

netstat 只能看「有没有连接」,但看不到「数据包里到底装了什么」。这时候就要上 tcpdump 了。

tcpdump 是命令行抓包工具,Android 系统内置了它(虽然有些定制ROM会阉割掉)。用法很简单:

adb shell tcpdump -i any -s 0 -w /sdcard/capture.pcap

这条命令会把所有网络接口的流量抓下来,保存成 pcap 文件。然后你 pull 到电脑上,用 Wireshark 打开分析。

注意: 抓包文件会很大。我建议只抓你关心的那个App的流量。可以用 hostport 过滤:

adb shell tcpdump -i any -s 0 -w /sdcard/capture.pcap host 192.168.1.100

这样只抓与特定IP的通信,文件小很多。

我曾经遇到过一个诡异的问题:App 在 Wi-Fi 下正常,切到 4G 就频繁超时。抓包后发现,4G 网络下 DNS 解析返回了一个错误的 IP 地址。服务器根本没响应,客户端还在傻等。嗯,这种问题不看包,光靠猜是永远猜不到的。

13.3 Wireshark:图形化分析利器

把 pcap 文件拉到电脑上,用 Wireshark 打开。这才是真正的重头戏。

Wireshark 的过滤语法很强大。我常用的几个:

  • http.request — 只看HTTP请求
  • tcp.analysis.flags — 标记异常TCP包(重传、乱序等)
  • dns — 只看DNS查询和响应
  • ip.addr == 目标IP — 只看某个IP的流量

我最常用的分析套路:

  1. 先看 TCP 三次握手 花了多久。如果 SYN 到 SYN-ACK 超过 200ms,说明网络延迟高。
  2. 再看 HTTP 请求/响应 的时间差。如果请求发出后很久才收到响应,可能是服务器处理慢。
  3. 最后看 TCP 重传率。重传超过 5%,网络质量堪忧。

Wireshark 还有一个「统计」菜单,里面有个「流量图」,能直观看到数据包的发送和接收时序。我经常用它来对比「正常情况」和「异常情况」的差异。

13.4 网络延迟分析:到底慢在哪?

延迟分析,说白了就是搞清楚「时间都花在哪了」。我一般把延迟拆成三段:

阶段 典型耗时 常见原因
DNS 解析 10-100ms DNS服务器慢、缓存未命中
TCP 握手 1-3 RTT 物理距离远、丢包率高
数据传输 取决于带宽和包大小 带宽不足、拥塞控制

在Android上,我常用 pingtraceroute 来快速评估网络质量:

adb shell ping -c 10 目标IP
adb shell traceroute 目标IP

ping 的 RTT(往返时间)如果超过 300ms,基本可以判定网络延迟过高。traceroute 能告诉你数据包经过了哪些路由节点,哪个节点最慢。

避坑指南: 我曾经遇到过一个案例,ping 延迟正常,但 App 就是慢。后来发现是 MTU 设置问题。数据包被分片了,导致传输效率下降。用 ping -M do -s 1472 可以测试 MTU 是否正常。

13.5 知识体系总览

下面这张图,是我自己总结的网络调试知识框架。你可以把它当作一个检查清单:

网络问题调试 netstat 查看连接状态 ESTABLISHED/TIME_WAIT 监听端口检查 tcpdump 命令行抓包 保存为pcap文件 按IP/端口过滤 Wireshark 图形化分析 TCP重传检测 HTTP请求时序 延迟分析 ping / traceroute DNS/TCP/数据分段 MTU检测 从连接状态 → 抓包 → 图形分析 → 延迟定位,形成闭环

这张图的核心逻辑是:从 netstat 的「宏观连接状态」入手,发现问题后用 tcpdump 抓包,再用 Wireshark 做「微观数据包分析」,最后用 ping/traceroute 做「延迟定位」。四个工具配合使用,基本能覆盖 90% 的网络问题。

好了,网络调试这块,工具和方法都摆在这了。下次遇到网络问题,别慌,按这个流程走一遍,大概率能找到根因。


专注资料整理