VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > c#编程 >
  • C#网络编程之网络调试工具(Wireshark、tcpdump、netstat)

第70章 网络调试工具(Wireshark、tcpdump、netstat)
一、我踩过的调试坑:从“排查3天的TCP重传”到“服务器端口被占用找不到进程”
做微服务网关时,用户反馈接口延迟高达5秒,查日志、看监控都没发现问题——最后用Wireshark抓包才发现:每个请求都有3次TCP重传,定位到是交换机端口丢包,换了端口后延迟直接降到100毫秒!还有一次服务器重启报“端口被占用”,用netstat找了半天没找到进程,后来加了-o参数才看到是一个僵尸进程占用了端口,杀掉就解决了。这节我把这些血泪经验揉进去,用大白话讲透三个核心调试工具的用法,结合实际命令逐行拆解,拓展底层原vb.net教程C#教程python教程SQL教程access 2010教程理和生产级技巧,让你快速定位90%的网络问题!
二、Wireshark:Windows/macOS抓包神器,可视化分析TCP/IP全流程
我踩过的坑:排查TCP重传导致的接口延迟
当时用户反馈接口偶尔延迟5秒,查Nginx日志、微服务监控都显示正常,最后用Wireshark抓包:发现延迟的请求都有3次TCP重传,每次重传间隔1秒,3次后才成功。后来查交换机日志,发现对应端口丢包率高达10%,换了端口后问题解决!
核心操作逐行讲解(以抓TCP聊天系统包为例)

  1. 启动Wireshark,选择网卡
    操作:打开Wireshark,选择连接网络的网卡(比如Wi-Fi、以太网);
    底层原理:Wireshark会把网卡设置为“混杂模式”,捕获所有经过网卡的数据包(默认只捕获发给自己的包);
    拓展知识:混杂模式需要管理员权限,Windows要右键以管理员身份运行,macOS要输入sudo密码。
  2. 过滤TCP包,只看聊天系统的流量
    plaintext
	# 过滤8888端口的TCP包(聊天系统端口)
	tcp.port == 8888

逐行拆解:
tcp:指定协议为TCP;
port == 8888:只显示源端口或目的端口是8888的包;
常用过滤规则:
ip.src == 192.168.1.100:只显示源IP是192.168.1.100的包;
tcp.flags.syn == 1:只显示TCP SYN包(三次握手的第一个包);
tcp.analysis.retransmission:只显示TCP重传包(红色标记,问题排查重点)。
3. 分析TCP三次握手(可视化看全流程)
操作:找到SYN、SYN-ACK、ACK三个包,右键“Follow > TCP Stream”;
底层原理:
1.客户端发SYN包(标记为SYN),告诉服务器“我要连接你”;
2.服务器发SYN-ACK包(标记为SYN+ACK),告诉客户端“我同意连接”;
3.客户端发ACK包(标记为ACK),告诉服务器“我知道了,连接建立”;
拓展知识:如果三次握手失败,比如SYN包丢了,客户端会重试3次,每次间隔1秒。
4. 定位TCP重传问题
操作:在Wireshark中找红色标记的包,右键“Protocol Preferences > TCP > Show retransmission in red”;
重传原因:
网络丢包:数据包在传输过程中丢失;
延迟ACK:服务器没有及时发ACK包;
拥塞控制:TCP认为网络拥塞,主动重传;
生产级技巧:如果重传包很多,先查交换机、路由器的丢包率,再查服务器的CPU、内存使用率。
生产级技巧
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
我踩过的坑:排查微服务跨机器调用延迟
当时微服务A调用微服务B偶尔延迟2秒,在A和B的服务器上都没找到问题,最后在A服务器上用tcpdump抓包:发现A发的请求包到B的时间间隔是2秒,定位到是两台服务器之间的路由器延迟过高,换了路由后问题解决!
核心命令逐行讲解(以抓80端口的HTTP包为例)

  1. 抓80端口的HTTP包,实时显示
    bash
    tcpdump -i eth0 port 80 -A
    逐行拆解:
    -i eth0:指定网卡为eth0(Linux服务器的默认网卡);
    port 80:只抓80端口的包;
    -A:以ASCII格式显示包内容,方便看HTTP请求和响应;
    拓展知识:如果不知道网卡名,用ip addr命令查看。
  2. 抓特定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可视化分析。
  3. 后台抓包,避免断开连接中断
    bash
    nohup tcpdump -i eth0 port 8888 -w capture.pcap &
    逐行拆解:
    nohup:让命令在后台运行,即使SSH断开也不会中断;
    &:把命令放到后台执行;
    查看后台进程:用ps aux | grep tcpdump查看抓包进程,用kill -9 进程ID停止抓包。
  4. 过滤TCP SYN包,看连接请求
    bash
    tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'
    逐行拆解:
    tcp[tcpflags] & tcp-syn != 0:只显示TCP SYN包(三次握手的第一个包);
    拓展知识:可以统计每秒的连接请求数,判断是否有DDoS攻击: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:网络状态排查神器,快速定位端口占用、连接状态
    我踩过的坑:排查端口被占用找不到进程
    当时服务器重启报“端口8888被占用”,用netstat -an | findstr 8888只看到端口状态是LISTENING,但找不到进程ID,后来加了-o参数才看到是一个僵尸进程占用了端口,杀掉就解决了!
    核心命令逐行讲解
  5. 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]}:输出每个状态的数量;
常见状态含义:
oLISTEN:监听端口,等待连接;
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查看进程的详细信息,判断是否是恶意进程。
五、总结与选型建议

  1. 工具选型表
    场景 推荐工具
    可视化分析TCP/IP全流程(比如三次握手、重传) Wireshark
    Linux服务器抓包(无图形界面) tcpdump
    排查端口占用、连接状态 netstat
    统计连接状态数量、排查TIME_WAIT过多 netstat + awk
    实时看HTTP请求响应内容 tcpdump -A 或 Wireshark Follow TCP Stream
  2. 网络故障排查流程
    1.用netstat排查端口和连接状态:先看端口是否监听,连接状态是否正常;
    2.用tcpdump/Wireshark抓包:如果端口正常,抓包看数据包是否正常传输;
    3.分析抓包结果:看三次握手是否正常,是否有重传、丢包;
    4.查底层设备:如果抓包显示丢包,查交换机、路由器的日志,看是否有丢包、延迟。
    现在你已经掌握了三个核心网络调试工具的用法,以后遇到网络问题不用慌,按照这个流程排查,90%的问题都能快速解决!下一节我们会学习“网络性能调优与故障排查”,结合这些工具和性能监控,教你优化网络性能!

转载请注明出处:https://www.xin3721.com/ArticlecSharp/c49588.html


相关教程