-
C#网络编程之网络调试工具(Wireshark、tcpdump、netstat)
第70章 网络调试工具(Wireshark、tcpdump、netstat)
一、我踩过的调试坑:从“排查3天的TCP重传”到“服务器端口被占用找不到进程”
做微服务网关时,用户反馈接口偶尔延迟5秒,查Nginx日志、微服务监控都显示正常——最后用Wireshark抓包才发现:延迟的请求都有3次TCP重传,每次重传间隔1秒,3次后才成功。查交换机日志发现对应端口丢包率高达10%,换了端口后延迟直接降到100毫秒!还有一次服务器重启报“端口8888被占用”,用netstat -an只看到LISTENING状态,但找不到进程,后来加了-o参数才看到是一个僵尸进程占用了端口,杀掉就解决了。这节我把这些血泪经验揉进去,用大白话讲透三个核心调试工具的用法,结合实际命令逐行拆解,拓展底层原理和生产级技巧,让你快速定位90%的网络问题!
二、Wireshark:Windows/macOS抓包神器,可视化分析TCP/IP全流程
核心操作逐行讲解(以抓TCP聊天系统包为例)
-
启动Wireshark,选择网卡
操作:打开Wireshark,选择连接网络的网卡(比如Wi-Fi、以太网);
底层原理:Wireshark会把网卡设置为混杂模式,捕获所有经过网卡的数据包(默认只捕获发给自己的包);
注意:混杂模式需要管理员权限,Windows要右键以管理员身份运行,macOS要输入sudo密码。 -
过滤TCP包,只看聊天系统的流量
plaintext
# 过滤8888端口的TCP包(聊天系统端口)
tcp.port == 8888
逐行拆解:
tcp:指定协议为TCP;
port == 8888:只显示源端口或目的端口是8888的包;
常用过滤规则拓展:
plaintext
# 只显示源IP是192.168.1.100的包
ip.src == 192.168.1.100
# 只显示TCP SYN包(三次握手的第一个包)
tcp.flags.syn == 1
# 只显示TCP重传包(红色标记,问题排查重点)
tcp.analysis.retransmission
# 只显示HTTP POST请求
http.request.method == "POST"
-
分析TCP三次握手(可视化看全流程)
操作:找到SYN、SYN-ACK、ACK三个包,右键Follow > TCP Stream;
底层原理:
1.客户端发SYN包(标记为SYN):告诉服务器“我要连接你”;
2.服务器发SYN-ACK包(标记为SYN+ACK):告诉客户端“我同意连接”;
3.客户端发ACK包(标记为ACK):告诉服务器“我知道了,连接建立”;
拓展知识:如果三次握手失败,客户端会重试3次,每次间隔1秒;如果服务器端口没监听,会发RST包(重置连接)。 -
定位TCP重传问题
操作:在Wireshark中找红色标记的包,右键Protocol Preferences > TCP > Show retransmission in red;
重传原因:
网络丢包:数据包在传输过程中丢失;
延迟ACK:服务器没有及时发ACK包;
拥塞控制:TCP认为网络拥塞,主动重传;
生产级技巧:如果重传包很多,先查交换机、路由器的丢包率,再查服务器的CPU、内存使用率——CPU高会导致服务器处理不过来,ACK包发不出去。
生产级技巧
1.抓包时过滤特定流量:不要抓所有包,否则文件太大(比如1小时抓包可能有10GB),用过滤规则只抓需要的流量;
2.保存抓包文件:点击File > Save As,保存为.pcapng格式,方便后续分析;
3.用Follow TCP Stream看完整对话:右键包选择Follow > TCP Stream,可以看到客户端和服务器的完整对话,像看聊天记录一样;
4.统计延迟:点击Statistics > TCP Stream Graph > Round Trip Time Graph,可以看到每个包的往返延迟,定位延迟高峰。
三、tcpdump:Linux服务器抓包神器,命令行下的Wireshark
核心命令逐行讲解(以抓80端口的HTTP包为例) -
抓80端口的HTTP包,实时显示ASCII内容
bash
tcpdump -i eth0 port 80 -A
逐行拆解:
-i eth0:指定网卡为eth0(Linux服务器的默认网卡,用ip addr查看网卡名);
port 80:只抓80端口的包;
-A:以ASCII格式显示包内容,方便看HTTP请求和响应;
输出示例:
GET /api/user HTTP/1.1
Host: api.example.com
User-Agent: curl/7.68.0
Accept: */*
-
抓特定IP的包,保存到文件
bash
tcpdump -i eth0 host 192.168.1.100 -w capture.pcap
逐行拆解:
host 192.168.1.100:只抓源IP或目的IP是192.168.1.100的包;
-w capture.pcap:把抓包结果保存到capture.pcap文件,方便后续用Wireshark可视化分析;
拓展知识:Linux服务器没有图形界面,抓包后把文件下载到本地,用Wireshark分析更直观。 -
后台抓包,避免断开连接中断
bash
nohup tcpdump -i eth0 port 8888 -w capture.pcap &
逐行拆解:
nohup:让命令在后台运行,即使SSH断开也不会中断;
&:把命令放到后台执行;
查看后台进程:用ps aux | grep tcpdump查看抓包进程,用kill -9 进程ID停止抓包。 -
过滤TCP SYN包,看连接请求
bash
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'
逐行拆解:
tcp[tcpflags] & tcp-syn != 0:只显示TCP SYN包(三次握手的第一个包);
拓展知识:统计每秒的连接请求数,判断是否有DDoS攻击:
bash
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0' | wc -l
底层原理拓展
tcpdump底层用libpcap库:libpcap是跨平台的抓包库,Wireshark也用它;
抓包流程:libpcap把网卡设置为混杂模式,捕获数据包,然后过滤、显示或保存;
性能影响:抓包会占用CPU和内存,高并发场景建议短时间抓包,或者用过滤规则减少抓包量。
生产级技巧
1.大文件分割:如果抓包时间长,用-C参数分割文件,比如tcpdump -i eth0 port 80 -w capture.pcap -C 100,每个文件100MB;
2.过滤特定协议:比如tcpdump -i eth0 udp port 53抓DNS包,tcpdump -i eth0 icmp抓ping包;
3.分析抓包文件:用tcpdump -r capture.pcap查看保存的文件,用tcpdump -r capture.pcap -A查看ASCII内容。
四、netstat:网络状态排查神器,快速定位端口占用、连接状态
核心命令逐行讲解
-
Windows下排查端口占用
cmd
# 查看8888端口的占用情况,显示进程ID
netstat -ano | findstr 8888
逐行拆解:
-a:显示所有连接和监听端口;
-n:显示数字IP和端口,不解析域名(速度快);
-o:显示进程ID;
findstr 8888:过滤8888端口的结果;
杀死占用进程:用taskkill /F /PID 进程ID杀死占用端口的进程,比如taskkill /F /PID 1234。
2. Linux下排查端口占用
bash
# 查看8888端口的占用情况,显示进程名
netstat -tulpn | grep 8888
逐行拆解:
-t:显示TCP连接;
-u:显示UDP连接;
-l:显示监听端口;
-p:显示进程ID和进程名;
-n:显示数字IP和端口;
grep 8888:过滤8888端口的结果;
杀死占用进程:用kill -9 进程ID杀死占用端口的进程,比如kill -9 1234。
3. 统计TCP连接状态(排查TIME_WAIT过多)
bash
# Linux下统计各状态的TCP连接数
netstat -tulpn | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
逐行拆解:
awk '/^tcp/ {++S[$NF]}':统计每个TCP状态的数量;
END {for(a in S) print a, S[a]}:输出每个状态的数量;
常见状态含义:
LISTEN:监听端口,等待连接;
ESTABLISHED:已建立连接,正在通信;
TIME_WAIT:连接关闭后,等待2MSL(约1-2分钟)防止延迟包;
CLOSE_WAIT:客户端关闭连接,服务器还没关闭(代码问题,比如没关闭Socket);
我踩过的坑:TIME_WAIT过多会导致端口耗尽,解决方法:设置SO_REUSEADDR选项,或者让客户端主动关闭连接。
生产级技巧
1.批量排查端口:用netstat -ano | findstr /R ":80 :443 :8888"查看多个端口的占用情况;
2.排查僵尸连接:用netstat -an | findstr TIME_WAIT查看TIME_WAIT状态的连接,数量过多要优化;
3.结合ps看进程详情:Linux下用ps aux | grep 进程ID查看进程的详细信息,判断是否是恶意进程。
五、总结与选型建议
- 工具选型表
| 场景 | 推荐工具 |
|---|---|
| 可视化分析TCP/IP全流程(比如三次握手、重传) | Wireshark |
| Linux服务器抓包(无图形界面) | tcpdump |
| 排查端口占用、连接状态 | netstat |
| 统计连接状态数量、排查TIME_WAIT过多 | netstat + awk |
| 实时看HTTP请求响应内容 | tcpdump -A 或 Wireshark Follow TCP Stream |
-
网络故障排查流程
1.用netstat排查端口和连接状态:先看端口是否监听,连接状态是否正常;
2.用tcpdump/Wireshark抓包:如果端口正常,抓包看数据包是否正常传输;
3.分析抓包结果:看三次握手是否正常,是否有重传、丢包;
4.查底层设备:如果抓包显示丢包,查交换机、路由器的日志,看是否有丢包、延迟。
现在你已经掌握了三个核心网络调试工具的用法,以后遇到网络问题不用慌,按照这个流程排查,90%的问题都能快速解决!下一节我们会学习“网络性能调优与故障排查”,结合这些工具和性能监控,教你优化网络性能!
转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49590.html










