← 返回题目列表

用 Wireshark 抓包分析时,怎么看 TCP 握手、重传和 RST?

高频 中等 第 10 / 26 题 更新于 2026/07/31
Wireshark抓包分析TCP重传追踪流

简化版

Wireshark 是图形化抓包分析工具,强在「把一堆包变成能看懂的交互过程」。排查时几个核心动作:① 用显示过滤器缩小范围(如 ip.addr==1.2.3.4 && tcp.port==443);② 右键「追踪 TCP 流(Follow TCP Stream)」看一条连接的完整来龙去脉;③ 看专家信息里的红黑标记——Wireshark 会自动把重传(Retransmission)、重复 ACK(Dup ACK)、RST 等异常标出来。看 TCP 握手就找 [SYN] → [SYN, ACK] → [ACK] 三个包;看到大量重传/Dup ACK 说明丢包;看到 RST 说明连接被重置,重点是找谁先发的 RST

详细版

Wireshark vs tcpdump:tcpdump 是命令行、适合在服务器上抓;Wireshark 是图形界面、适合深度分析。常见分工是「服务器 tcpdump -w 存 pcap → 本地 Wireshark 打开分析」。

① 显示过滤器(Display Filter) —— 和 tcpdump 的 BPF 语法不同,Wireshark 用自己的过滤语法(更强):

ip.addr == 1.2.3.4              # 涉及该 IP 的包
tcp.port == 443                 # 443 端口
http                            # 只看 HTTP
tcp.flags.syn == 1              # 只看 SYN 包
tcp.analysis.retransmission     # 只看重传包
tcp.flags.reset == 1            # 只看 RST 包
ip.addr==1.2.3.4 && tcp.port==443   # 组合(&& || !)

② 追踪流(Follow → TCP Stream) —— 右键任意包选它,Wireshark 会把这一条 TCP 连接的所有包按顺序拼起来,还能看到应用层数据(HTTP 请求/响应明文,若非加密)。这是理解「一次完整交互」最快的方式。

③ 关键分析指标(Wireshark 自动标注):

标记/提示含义说明问题
[SYN]/[SYN, ACK]/[ACK]三次握手缺哪个 → 握手失败
[TCP Retransmission]重传丢包 / 网络差
[TCP Dup ACK]重复 ACK对端在催(丢包前兆)
[TCP ZeroWindow]接收窗口为 0接收方处理不过来
[RST]连接重置连接被强制中断
[TCP Out-Of-Order]乱序包到达顺序乱了

④ 着色规则:Wireshark 默认给不同类型的包上色(如黑底红字通常是 RST/异常),扫一眼颜色就能发现问题包。

完整版教学

一、Wireshark 的定位:让抓包「看得懂」

原始抓包数据是一堆二进制包,靠肉眼在命令行一个个看效率极低。Wireshark 的价值是「解析 + 可视化 + 智能分析」

  • 协议解析:自动把每个包按各层协议(以太网/IP/TCP/HTTP…)拆开,字段含义一目了然。
  • 交互重组:把散乱的包按连接组织成完整对话(追踪流)。
  • 智能诊断:自动识别并标注异常(重传、乱序、RST、零窗口),不用你手动比对序列号。
  • 统计分析:连接列表、IO 图、往返时延、协议分布等。

可以这样记:tcpdump 负责「抓到包」,Wireshark 负责「把包翻译成人能懂的故事」

二、第一步:用显示过滤器聚焦

打开一个 pcap 往往几万个包,第一件事是过滤。注意 Wireshark 的显示过滤器(Display Filter)语法和 tcpdump 不一样——它用 协议.字段 == 值 的形式,更精细:

ip.addr == 1.2.3.4                    # 和这个 IP 有关的包
tcp.port == 443                       # 443 端口
tcp.flags.syn==1 && tcp.flags.ack==0  # 只看纯 SYN(连接发起)
tcp.analysis.retransmission           # 只看重传(排查丢包神器)
tcp.flags.reset == 1                  # 只看 RST(排查连接中断)
http.response.code == 500             # 只看 HTTP 500

逻辑用 &&(与)||(或)!(非)。先过滤再分析,把几万个包缩到几十个关键包,是高效使用 Wireshark 的前提。

三、看 TCP 三次握手:连接建没建起来

排查「连不上」时,先看三次握手。过滤出某条连接,正常会看到连续三个包:

No.   Source     Dest       Info
1     A          B          54321 → 443 [SYN] Seq=0
2     B          A          443 → 54321 [SYN, ACK] Seq=0 Ack=1
3     A          B          54321 → 443 [ACK] Seq=1 Ack=1

异常判断:

  • 只有 A 的 [SYN],反复重传,没有 B 的 [SYN, ACK] → 对端没响应(服务没起 / 防火墙丢 SYN),对应「连接超时」。
  • A 发 [SYN],B 回 [RST, ACK] → 端口没服务,直接拒绝,对应「Connection refused」。
  • 三个包齐全 → 连接建立成功,问题在更上层(找应用层的包)。

四、看重传和重复 ACK:定位丢包

网络「慢」「卡」「偶发失败」,多半和丢包有关。Wireshark 会自动标出两个关键信号:

  • [TCP Retransmission](重传):发送方发出的包没在预期时间内收到 ACK,于是重发。看到大量重传,说明包在网络中丢了(网络质量差、拥塞、中间设备丢包)。
  • [TCP Dup ACK](重复 ACK):接收方连续对同一个序列号发 ACK,等于在喊「我还缺中间某个包,快重发」。大量 Dup ACK 是丢包/乱序的前兆,接收方在催重传(触发快速重传)。

排查思路:过滤 tcp.analysis.retransmission,如果某条连接重传密集,就把注意力转向这段链路的网络质量(配合 mtr 找丢包在哪一跳)。

补充:[TCP ZeroWindow](零窗口)是另一种「慢」——接收方缓冲区满了、告诉发送方「先别发了」,说明接收方应用处理不过来(消费太慢),方向和丢包不同。

五、看 RST:谁把连接掐断的

连接「莫名其妙断了」「请求做到一半失败」,重点看 RST(Reset,重置) 包。RST 表示某一方强制、立即中断连接(不走正常的四次挥手)。常见触发原因:

  • 连接目标端口没有服务 → 对方回 RST 拒绝。
  • 服务端超时/异常主动断开。
  • 中间设备(防火墙、负载均衡、代理)超时或策略切断连接。
  • 应用主动 close 并设置了 SO_LINGER=0 等,走 RST 而非 FIN。

排查 RST 的关键是看方向——是谁先发的 RSTSource 那一列):

  • 服务端先发 RST → 查服务端(超时配置、程序异常、连接被后端拒绝)。
  • 客户端先发 RST → 查客户端(主动放弃、超时)。
  • 握手成功后很快 RST → 常是中间设备(LB/防火墙空闲超时)切断,或某端应用异常。

过滤 tcp.flags.reset==1 快速定位所有 RST,再结合时间点和方向找根因。

六、追踪流:把一次交互看全

分析具体某次请求,最好用的是右键 → Follow → TCP Stream(追踪 TCP 流)。它把这条连接的所有包按顺序拼成一段完整对话,还能直接看到应用层数据(非加密时能看到 HTTP 请求头、响应体的明文),并区分两个方向(通常一红一蓝)。

用它可以一眼看清:客户端发了什么请求、服务端回了什么、在哪一步卡住或出错。对于 HTTP 明文问题,追踪流比逐包看高效得多。(HTTPS 是加密的,追踪流只能看到密文,除非导入了会话密钥解密。)

七、常见误区与追问

考点正确口径
入口按 IP、端口、协议和时间窗口过滤
TCP 分析握手、序列号、ACK、重传、窗口
应用分析HTTP 状态、TLS 握手、DNS 查询响应
display filters:
ip.addr == 10.0.0.5
tcp.port == 443
tcp.analysis.retransmission
http.response.code >= 500
dns.qry.name contains "example"

Wireshark 不是打开 pcap 随便翻,先写假设,再用过滤器验证握手、重传、状态码这些证据。

  • 误区:看到红色/黑色标记就一定是故障。 颜色规则只是提示,必须结合协议语义和上下文判断。
  • 误区:重传一定是服务端问题。 重传可能由客户端链路、拥塞、中间设备丢包或接收端窗口问题导致。
  • 误区:TLS 加密后 Wireshark 没用了。 仍可分析握手、证书、SNI、版本、套件、连接时序和包大小。
  • 追问:Follow TCP Stream 有什么用? 可以按连接重组应用层数据,便于查看 HTTP 明文或协议交互顺序。
  • 追问:如何定位慢请求? 看 TCP 建连时间、TLS 握手、请求到首包时间、重传和窗口变化。
  • 追问:为什么要保存原始 pcap? 便于复盘、过滤和交叉验证,避免只凭截图漏掉关键上下文。

八、加强记忆

Wireshark 是图形化抓包分析工具,把包翻译成能看懂的交互(常与 tcpdump 分工:服务器抓 → 本地分析)。三个核心动作:① 显示过滤器聚焦ip.addr==x && tcp.port==443,语法≠tcpdump);② 追踪 TCP 流看完整对话和应用层明文;③ 看自动标注的异常。判断要点:三次握手找 [SYN]→[SYN,ACK]→[ACK]大量 [TCP Retransmission]/[Dup ACK] = 丢包(顺链路找);[RST] = 连接被重置,重点看谁先发的[ZeroWindow] = 接收方处理不过来。