资讯动态

Wireshark数据包分析实战:从TCP重传与零窗口定位网络卡顿

发布时间:2026/10/13 5:10:15 来源:尧图企业网站定制
有一次在项目现场用户反馈内网业务系统下午经常“转圈”。我连过去ping网关、ping应用服务器延迟都在1到3毫秒telnet端口也能通看着一切正常。可页面的确在卡运维老师傅说“网络肯定没问题是应用的事”。当时我不死心在应用服务器上抓了五分钟包看到一连串ZeroWindow和不断缩小的接收窗口真相立刻反转——不是链路不行而是服务端处理不过来TCP这层已经把问题写在了我们面前。也是从那次以后Wireshark数据包分析就成了我排查疑难杂症的保留手段不再靠猜也不再轻易被人带节奏。这篇内容不打算写成像手册一样一条一条列功能而是想把我平时真正用到Wireshark的套路讲透数据包分析到底能解决什么问题、过滤器怎么用才不白抓、三次握手和HTTP事务怎么读、以及遇到间歇性卡顿这类疑难杂症时完整的排查链路是什么样的。适合刚开始接触抓包的运维、后端开发也想给那些被网络问题折磨到没脾气却一直没找到下手角度的朋友一个靠谱的切入点。1. 从一场“ping通但页面卡顿”的怪病说起1.1 一个反直觉的结论延迟不是靠猜出来的很多人对网络排查有个误解以为ping通就等于网络没问题。其实ping和真实业务流量完全是两码事。ping走的是ICMP包很小通常是几十字节而页面加载、文件传输走的是TCP包可以到1500字节左右中间还要经过拆包、重组、滑动窗口、拥塞控制这些复杂机制。小水管里开小车当然畅通换成大货车就堵在半路道理是一样的。所以你会看到一类非常典型的故障ping网关延迟只有1毫秒telnet应用端口也通但用户点开页面就是慢下载文件就是断断续续。这类问题靠交换机ping、靠互联网大厂提供的测速工具都很难定位因为它们在网络层“看起来一切正常”。而数据包分析能把每次TCP交互、每个窗口更新、每个重传都记录下来慢在哪一跳、谁是瓶颈一目了然。1.2 Wireshark在排障工具箱里的定位我经常把常用的网络诊断工具比喻成不同倍数的放大镜。ping是肉眼直接看traceroute是看路线上有几个红绿灯netstat是看连接状态而Wireshark是给你一张完整的行车记录仪影像哪辆车超车、哪里追尾、哪个路口堵死了全部能回放。工具能告诉我们什么看不到什么ping / ping -t目标是否可达基础RTT应用层交互、重传、窗口变化traceroute / pathping到达目标的路径和各跳延迟具体协议交互细节以及“端”的问题netstat / ss当前连接状态、端口监听历史流量、丢包后的重建行为Wireshark抓包完整的协议交互、重传、窗口、应用数据没有抓到的部分以及加密后的明文载荷解密前真正值得抓包的场景是那些“现象有、证据无”的问题。比如网页偶尔白屏、API偶发超时、文件传输速度波动大、服务器莫名其妙卡顿。这种问题如果只看监控图表只能看到平均延迟变高了但不知道是哪一类报文出了问题只有抓包回放才可能看到TCP重传激增、零窗口频繁出现、TLS握手迟迟不完成这类具体证据。1.3 关键定位抓包点怎么选才不白抓这里有一个刚入门最容易忽略、但直接影响结论的环节抓包位置。在客户端抓包看到的是“用户视角”在服务端抓包看到的是“服务入口视角”在中间交换机上镜像流量抓包看到的才是“链路视角”。三者看到的故事版本完全不一样。之前帮某公司排查一个下载慢的问题我一开始图方便在笔记本上直接抓客户端流量反复看都只看到客户端的重传始终找不到根因。后来发现问题出在服务器侧网卡在大量丢包——客户端发出的请求确实到了服务器但服务器的网卡驱动处理不过来导致响应发出后又在驱动层被丢弃。客户端看到的现象是重传而只有把抓包点放到服务器上才能看到网卡层面的事件。抓包点选错后面的分析全是白做。所以我的习惯是抓包前先问自己一句“我到底想看哪一段”。想知道用户体感抓客户端想知道服务端行为抓服务端实在不行两端同抓再对比同样时间点的流量差异。这也是为什么Wireshark支持同时打开多份抓包文件对比分析时特别好用。2. 过滤器是抓包的第一步捕获前与捕获后的两道闸门2.1 为什么要分“捕获过滤器”和“显示过滤器”Wireshark里有两个完全不同的过滤机制很多人一开始没分清导致怎么抓都不对。一个叫捕获过滤器Capture Filter在开始抓包之前设置它决定“哪些包会被写入磁盘”另一个叫显示过滤器Display Filter在抓包之后用它决定“哪些包显示在列表里”。打个比方捕获过滤器是仓库门口的安检不符合要求的货物直接不让进仓库显示过滤器是仓库里的分拣员想找红色的箱子就筛红色的箱子但所有箱子其实都还在仓库里。所以如果你不确定之后会需要哪些流量就别把捕获过滤器设得太严格显示过滤器可以随时改、随时撤但捕获过滤器一旦设错漏掉的包就再也找不回来了。捕获过滤器用的是BPF语法简单但不够灵活。比如只想抓某一个IP的443端口流量可以这样写host 192.0.2.10 and tcp port 443显示过滤器则更强大可以直接判断协议字段的值而且不用重新抓包。输入框里直接写http.request || tls.handshake.type 1它会立刻过滤出所有的HTTP请求和TLS握手包。这种“先抓全再筛选”的思路在排障场景下远比“先筛选再抓包”稳妥因为问题是什么方向往往要等抓到包之后才知道。2.2 高频组合IP、端口、协议与异常标志我平时用得最多的显示过滤器基本都集中在这几类按地址过滤、按端口过滤、按协议类型过滤、按协议的特定标志位过滤。整理成一张表直接抄作业就行需求显示过滤器语法只看某个IP的所有流量ip.addr 192.0.2.10只看某个源/目的地址ip.src 192.0.2.10/ip.dst 192.0.2.10只看某个端口tcp.port 443或udp.port 53只看SYN包tcp.flags.syn 1只看DNS查询dns.flags.response 0只看HTTP请求http.request只看TLS握手包tls.handshake.type 1只看TCP重传tcp.analysis.retransmission只看零窗口tcp.analysis.zero_window只看所有TCP分析异常tcp.analysis.flags除了手写语法更推荐你在数据包列表里右键选择“Apply as Filter”Wireshark会根据当前选中的包自动生成过滤条件。这个效率提升非常大尤其是通讯双方地址端口组合那类条件手写容易出错右键一键生成最稳。2.3 新手最容易踩的四个过滤坑第一个坑是把捕获过滤器和显示过滤器混着写。新手经常在显示过滤器里写BPF语法比如tcp port 443结果要么报语法错误要么一直提示“No packets matched”。先看清输入框旁边写的是“Display Filter”还是“Capture Filter”再决定语法风格。第二个坑是过滤方向没搞对。tcp.port 443是双向的不管源端口还是目的端口是443都会被显示但如果只想看某一方向就得写成tcp.srcport 443或tcp.dstport 443。这个细节决定了你看到的流量是不是“只进不出”的假象。第三个坑是布尔组合时不加括号。显示过滤器支持、||、!但多个条件混在一起时优先级很反直觉。安全做法永远是条件一多就加括号。(ip.src 192.0.2.0/24 tcp.port 80) || dns第四个坑是用contains过滤搜索字符串时漏掉关键包。tcp.payload contains error看似好用但如果HTTP请求被分片了或者SSL/TLS加密了那明文payload根本不存在自然什么都过滤不出来。别把字符串搜索当成万能钥匙先看协议字段才是正路。3. 三次握手、TLS握手与HTTP事务一条链路里的关键证据3.1 TCP三次握手在Wireshark里长什么样Wireshark默认显示TCP相对序号所以正常情况下第一个SYN包的Seq0第二个SYNACK包是Seq0Ack1第三个ACK包是Seq1Ack1。很多新手会问为什么第二个包的Ack是1因为SYN标志本身要消耗一个序号相当于SYN占掉了一个“计数位”所以确认号要在原始序号的基础上加1。这类细节是自己的知识库里要有的不然后面分析序号绕来绕去很容易晕。实际排障时我只关心两件事一是三次握手用了多久二是握手成功后有没有立刻开始传数据。用Wireshark顶部的Time列把显示格式切换成“Seconds Since Previous Displayed Packet”就能直接看到每两个包之间的间隔。如果SYN发出后隔了好几秒才等到SYNACK那就是中间链路或对端负载有问题如果握手完成了但迟迟不见第一个HTTP请求那就说明问题出在应用层或业务逻辑上。3.2 加密流量怎么读TLS握手与HTTP请求的关联现在的线上流量大部分是HTTPS也就是TLS加密过的HTTP。很多新手一看到加密就头疼其实Wireshark照样能把TLS握手拆得很清楚。抓包后你会看到Client Hello、Server Hello、Certificate、Key Exchange、Encrypted Handshake、Application Data这些阶段。想快速定位握手阶段可以用显示过滤器tls.handshake.type 1这个过滤条件会直接列出所有Client Hello也就是TLS握手的起点。从Client Hello到第一个Encrypted Application Data这个间隔通常就是TLS协商的耗时。如果这里花了很长时间优先怀疑证书链太大、TLS往返次数多、或者中间设备在做解密检测导致额外延迟。另外别忘了HTTP/3是基于QUIC协议的它跑在UDP上而不是TCP上。如果看到443端口但协议显示是QUIC或UDP那不是显示错误而是流量走了新协议。分析时不能再用TCP重传那套逻辑得切到QUIC相关的指标。3.3 把一个HTTP事务的时间拆开慢在哪一秒这里我推荐一个非常实用的小技巧把一次HTTP请求的完整时间拆成三个区间分别判断慢的根源在哪。第一个区间是DNS解析从DNS查询发出到响应返回。一般在几十毫秒以内算正常如果超过一二百毫秒就要检查DNS服务器负载、本地缓存是否生效、是不是走了无响应超时。 第二个区间是TCP三次握手加TLS握手正常局域网内应该在几毫秒到几十毫秒完成跨公网可以接受几百毫秒但慢得太夸张就要怀疑网络路径问题。 第三个区间就是HTTP请求发出到第一个响应字节返回也就是TTFBTime To First Byte。TTFB长通常代表服务端处理慢是后端接口逻辑、数据库查询、代理排队的问题而不是网络问题。把这三个区间用包的时间戳一算问题边界立刻清晰。我自己排查API慢问题时最少的时间都花在这个切分上。它可以快速告诉你到底是网络工程师背锅还是后端开发背锅而不是在会议上互相推诿半个钟头。4. 实战实录定位一场“间歇性卡顿”的完整排查链路4.1 现场信息与抓包前的环形缓冲准备有一次接到一个典型的“间歇性卡顿”反馈某内网系统每天早上9点半到10点之间会出现两三波页面打开极慢的情况每次持续几分钟后自行恢复。因为时间不确定不可能一直用单个大文件从头抓到尾所以我用了Wireshark自带的环形缓冲抓包。操作方法是在抓包选项里勾选“使用多个文件”设置每个文件的大小为5MB文件个数设为2同时开启环形缓冲。这样抓包工具始终只保留最近约10MB的流量磁盘不会被写爆问题重现时又一定会留下现场。另一个值得注意的细节是抓包前的网卡选择如果是远程服务器直接用抓包选项里的远程接口功能如果只能在本机抓一定要选对接口比如抓回环流量时要选中Loopback适配器否则一条包都看不到。现场抓包还有个容易忽略的准备工作时间基准。先把抓包主机和服务器的时间做一次对齐或者记下抓包起始的准确时钟时间后面把抓包事件的相对时间和业务日志的秒级时间叠加在一起立刻能看出重合点。4.2 从专家信息到IO Graph先看全局再找罪证抓完包不要一上来就双击某个看起来可疑的包而是先点右下角的Expert Information专家信息让Wireshark先把整份抓包里所有标记了Error、Warning、Note的包列出来。这里最容易犯的错是把Error当成“包坏了”其实Error级别通常是包本身不合法而Warning级别才是我们排障时最常看的比如TCP重传、零窗口、乱序都归在这里。如果专家信息里Warnings不少第二步是打开Statistics → Conversations看看哪些IP和端口组合产生了最多的流量、最长的会话。问题往往集中在某个特定IP或端口上先把自己视线圈定在一小段范围内比在几万个包里漫无目的地从头翻要高效得多。第三步我一般开IO Graph把过滤条件分别设置成tcp.analysis.retransmission和tcp.analysis.zero_window用两种颜色画在同一张时间轴上。这一步极直观如果重传尖峰正好对应在用户报障的时间段上那“网络丢包”这个方向就非常值得怀疑如果零窗口尖峰更明显可能问题压根不在链路上而在接收端处理能力上。4.3 重传、零窗口、窗口全满三个关键异常怎么区分抓包里最难的是区分“网络本身有问题”和“网络侧的某个端点处理不过来”。最典型的三种异常我整理成了一张对应表看到标记基本能直接落地排查方向。异常标记直观含义常见原因下一步排查TCP Retransmission数据发送后超时未确认发送方重新发送链路丢包、中间设备丢包、接收方处理慢查丢包率、网卡错误计数、MTUZeroWindow接收方通告窗口为0表示缓冲区已满暂停接收应用层来不及处理、磁盘打满、线程阻塞检查服务端进程、日志、IOWindow Full发送方认为窗口已满主动暂停发送链路带宽或接收窗口限制、拥塞控制看窗口字段变化判断瓶颈在发送还是接收Dup ACK收到重复确认通常意味着某个包丢失或乱序链路丢包、路由路径变化、负载均衡跨端口结合重传标记判断是否为虚假丢包零窗口的深层原因尤其容易忽略它和网络丢包完全不同。网络上常见的丢包是“路不好”但零窗口相当于“收货方的仓库堆满了运货司机到了门口却卸不了货”。TCP层用窗口字段告诉对方还有多少缓冲空间当这个值变成0发送方就必须停下等待接收方腾位置。所以看到零窗口第一反应应该是检查接收端应用而不是去查交换机。4.4 结论复盘网络层的证据如何暴露应用层的问题那次卡顿的最后定位很有意思抓包显示客户端请求正常到达服务器但服务器端在9点30分左右频繁出现接收窗口缩小然后零窗口持续一两秒紧接着客户端开始重传。当我把抓包窗口的相对时间和服务端应用日志对齐后发现每次零窗口出现的时间点正好对应后端定时任务批量写日志和做数据刷新的时刻。也就是说业务过程中的磁盘IO峰值让服务线程阻塞应用层来不及处理网络缓冲区里的数据TCP被迫把窗口关小最终归零。问题看起来是网络层反应出来的但根源完全在应用和资源调度上。这类案例让我记住了一个重要经验Wireshark抓到的证据不代表“网络有罪”它只是把一个更深层的问题忠实投影到了协议栈上。抓包的作用不是直接甩锅而是把锅端到真正该负责的人面前。5. 别把工具用废了统计、着色和导出对象的实战技巧5.1 统计菜单比肉眼更靠谱Wireshark的Statistics菜单里藏着一堆好东西很多老手也未必全部用过。最简单的入手点是Protocol Hierarchy它用一棵树展示抓包里各层协议的占比。如果发现ARP包数量多得出奇就该警惕局域网广播风暴或二层环路如果TCP占比极高而HTTP占比很低那大概率存在大量重传或扫描行为。Conversations和Endpoints用来做“谁和谁在说话”的归纳也很有用。一次抓包可能包含上千个连接但真正有问题的往往只是其中一对端点。先通过对话列表排序找出数据量最大、持续时间最长、或者RTT最不稳定的连接再针对性地只看这一段分析效率能提升好几倍。IO Graph这里我想多说一句。它不仅能看总流量还能叠加多个过滤条件。比如我常把tcp.analysis.retransmission、tcp.analysis.zero_window、http.request三条曲线放在同一张时间图里一旦HTTP请求变多紧接着出现零窗口就能直接锁定问题现象与协议异常之间的先后关系。5.2 着色规则与时间列让异常一眼可见Wireshark默认的着色规则里TCP重传是淡蓝色零窗口是浅黑色或深青色。为了更醒目建议手动改一下进入View → Coloring Rules把重传改成亮红色把零窗口改成深蓝色。改完之后几万个数据包滚过去有问题的地方就像高亮标签一样跳出来省去逐条翻看的痛苦。时间格式同样值得调一调。排查重传时最有用的是把Time Display Format切成“Seconds Since Previous Displayed Packet”。这样每一行都会显示和上一个包的间隔重传的指数退避特征立刻显形第一次重传隔了0.2秒第二次隔0.4秒第三次隔0.8秒不用数包就知道发送方在反复超时。5.3 导出对象与TCP流跟随不只分析还能还原很多人不知道Wireshark还能直接还原会话内容。在File → Export Objects → HTTP里Wireshark会列出抓包过程中所有传输过的HTTP对象包括图片、脚本、压缩包等资源。在某些安全分析场景下这个功能价值极高——一次抓包里如果发现某个服务器持续对外下载可疑文件直接导出对象就能看到文件内容不用再去日志里拼凑线索。对于单一TCP连接右键选择Follow → TCP Stream能把这个连接的全部载荷按顺序拼成完整文本。HTTP明文请求和响应在这里看得一清二楚包括请求头、Cookie、响应体。要注意的是如果流量经过了TLS加密这个功能只能看到加密后的乱码需要先配置解密密钥才能真正还原明文。使用这个功能时一定要把握一条原则只分析自己有权抓取的流量。抓包可以确认问题导出对象可以还原证据但越界抓取别人的私有流量无论在哪个场景下都不是技术问题而是合规和伦理问题。我自己的习惯是任何涉及他人数据的流量分析完立即清理抓包文件不做任何留档。5.4 抓包前请先想清楚三件事第一件事选对接口。很多人一启动抓包发现没有流量十有八九是选错了网卡。本机访问本机服务要选Loopback接口抓无线网络要看Wi-Fi接口而不是以太网接口远程服务器就只能依靠远程抓包或先在服务器上抓文件再下载下来分析。第二件事确认权限和影响。抓包需要管理员权限但服务器在业务高峰期抓包可能会增加额外开销。特别是大流量生产环境全包捕获可能让网卡驱动或磁盘IO成为新瓶颈。我的做法是先用snaplen限制只抓每个包的前256字节协议头信息足够分析负载数据通常反而不需要这样能把性能影响降到最小。第三件事想清楚“我要看什么”。抓包不是越快越好、越全越好。先把问题现象、时间窗口、可能涉及的IP端口写下来再决定捕获过滤器和文件轮转策略。盲目抓上一大堆数据往往最后只是浪费时间在一堆噪音里找针。最后个小习惯我任何时候抓包都会顺手在笔记本上记一行“抓包开始时间、抓包位置、怀疑方向”导入Wireshark的Summary面板能看到总时长和包数结合这个现场笔记能快速判断抓包数据是否覆盖到了问题发生的完整窗口。别指望靠记忆几分钟之后可能就忘了当时的意图。始终记住Wireshark不是一个“点开就能找到答案”的按钮而是一个能帮助你把假设和证词落到实处的击穿工具。它可以清晰地说出“数据到底从哪里来、到哪里去、中间经历了什么”但推理方向和排查思路还是得靠我们自己。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑