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连接。握手开销叠加起来,延迟自然就上去了。
小技巧: 关注 ESTABLISHED 和 TIME_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的流量。可以用 host 或 port 过滤:
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的流量
我最常用的分析套路:
- 先看 TCP 三次握手 花了多久。如果 SYN 到 SYN-ACK 超过 200ms,说明网络延迟高。
- 再看 HTTP 请求/响应 的时间差。如果请求发出后很久才收到响应,可能是服务器处理慢。
- 最后看 TCP 重传率。重传超过 5%,网络质量堪忧。
Wireshark 还有一个「统计」菜单,里面有个「流量图」,能直观看到数据包的发送和接收时序。我经常用它来对比「正常情况」和「异常情况」的差异。
13.4 网络延迟分析:到底慢在哪?
延迟分析,说白了就是搞清楚「时间都花在哪了」。我一般把延迟拆成三段:
| 阶段 | 典型耗时 | 常见原因 |
|---|---|---|
| DNS 解析 | 10-100ms | DNS服务器慢、缓存未命中 |
| TCP 握手 | 1-3 RTT | 物理距离远、丢包率高 |
| 数据传输 | 取决于带宽和包大小 | 带宽不足、拥塞控制 |
在Android上,我常用 ping 和 traceroute 来快速评估网络质量:
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 的「宏观连接状态」入手,发现问题后用 tcpdump 抓包,再用 Wireshark 做「微观数据包分析」,最后用 ping/traceroute 做「延迟定位」。四个工具配合使用,基本能覆盖 90% 的网络问题。
好了,网络调试这块,工具和方法都摆在这了。下次遇到网络问题,别慌,按这个流程走一遍,大概率能找到根因。