飞翔飞翔
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • TCP协议

    • TCP 简介与分层模型
    • TCP 连接管理
    • TCP 可靠传输机制
    • TCP 粘包与拆包
    • TCP 拥塞控制
    • TCP 头部字段详解
    • TCP 与 UDP 对比
    • TCP Socket 编程实践
    • TCP 抓包实战
    • TCP 安全与面试综合题

TCP 抓包实战

Wireshark 是网络工程师的"显微镜"。本篇带你用 Wireshark 看懂 TCP 的每一个细节。


1. Wireshark 快速入门

1.1 安装与基本操作

Wireshark 是开源的网络协议分析工具。下载地址:https://www.wireshark.org

基本工作流程:

  1. 选择网卡 → 开始抓包
  2. 设置过滤器缩小范围
  3. 点击数据包查看各层详情
  4. 使用统计和分析功能

1.2 过滤器语法速查

过滤器用途
tcp只看 TCP 包
tcp.port == 443只看端口 443 的 TCP 包
ip.addr == 192.168.1.1只看与某 IP 相关的包
tcp.flags.syn == 1只看 SYN 包
tcp.flags.reset == 1只看 RST 包
tcp.analysis.retransmission只看重传包
http or dns只看 HTTP 或 DNS
!arp and !dns排除 ARP 和 DNS

组合使用:tcp.port == 80 and ip.addr == 10.0.0.5


2. 实战一:观察三次握手

场景

用浏览器访问任意 HTTP 网站,过滤 tcp.port == 80。

预期看到的三个包

No.  Src→Dst              Info
[1]  Client→Server        SYN, seq=0, Len=0
[2]  Server→Client        SYN, ACK, seq=0, ack=1, Len=0
[3]  Client→Server        ACK, seq=1, ack=1, Len=0

如何确认是握手包?

  • 点击包 → 展开 TCP 头部 → 查看 Flags
  • 包 1:Flags: 0x002 (SYN)
  • 包 2:Flags: 0x012 (SYN, ACK)
  • 包 3:Flags: 0x010 (ACK)

Wireshark 的便捷功能

  • 右键某个包 → Follow → TCP Stream:查看完整 TCP 会话
  • Statistics → Flow Graph:可视化 TCP 流图
  • 列中的 [SYN] [SYN,ACK] [ACK] 标记

3. 实战二:观察四次挥手

场景

关闭浏览器或用 curl 发请求后关闭连接,过滤 tcp.flags.fin == 1。

预期看到

No.  Src→Dst              Info
[10] Client→Server        FIN, ACK
[11] Server→Client        ACK
[12] Server→Client        FIN, ACK
[13] Client→Server        ACK

注意:有时包 11 和包 12 会合并(服务器在 ACK 的同时发出 FIN),就变成了"三次挥手"。


4. 实战三:观察重传

场景

在一个不稳定的网络(如 Wi-Fi 信号弱)中抓包,过滤 tcp.analysis.retransmission。

常见重传模式

Wireshark 标记含义
[TCP Retransmission]超时重传
[TCP Fast Retransmission]收到 3 个 dup ACK 后的快速重传
[TCP Spurious Retransmission]不必要的重传(原始段其实已到达)
[TCP Dup ACK]重复确认(可能的丢包信号)

如何分析重传

  1. 找到标有 [TCP Dup ACK] 的连续多个 ACK
  2. 找到紧随其后的 [TCP Fast Retransmission]
  3. 右键 → Follow TCP Stream → 看整体时间线和丢失段

5. 常见 TCP 问题排查

5.1 连接超时(SYN 无响应)

现象:客户端发 SYN 后无 SYN+ACK 回应。

Wireshark 特征:

Client → Server  SYN       (t=0)
Client → Server  SYN       (t=1s, 重传)
Client → Server  SYN       (t=3s, 重传)
Client → Server  SYN       (t=7s, 重传)

可能原因:

  • 服务器端口未监听
  • 防火墙拦截
  • 网络不可达
  • 服务器半连接队列满(SYN Flood 攻击中)

5.2 连接被拒(RST)

现象:客户端发 SYN,服务器立即回 RST。

Wireshark 特征:

Client → Server  SYN
Server → Client  RST, ACK

可能原因:服务器端口未监听(服务未启动)。

5.3 大量重传

观察:tcp.analysis.retransmission 过滤器中包数量很多。

可能原因:

  • 网络质量差(丢包率高)
  • 链路带宽不足导致拥塞
  • 服务器处理慢导致丢包
  • MTU 问题(包太大被丢弃)

5.4 TCP 零窗口

Wireshark 特征:Window size value: 0 或 [TCP ZeroWindow]

含义:接收方缓冲区满,通知发送方停止发送。

分析:用统计图(Statistics → IO Graph)看窗口变化趋势,判断是接收方处理慢还是偶发。

5.5 TCP 窗口已满(Window Full)

Wireshark 特征:[TCP Window Full]

含义:发送方已发满接收方通告的窗口,无法继续发送。


6. 有用的 Wireshark 分析工具

6.1 IO Graph(输入/输出图)

Statistics → IO Graph:可视化吞吐量随时间的变化。可叠加多条曲线(如 TCP 吞吐 + 重传数)。

6.2 TCP Stream Graph(TCP 流图)

Statistics → TCP Stream Graph → Time-Sequence (Stevens):经典的时间-序列号图,直观展示:

  • 数据传输斜率(吞吐量)
  • 重传点
  • 窗口变化

6.3 Expert Info(专家信息)

Analyze → Expert Info:Wireshark 自动检测的异常汇总,包括:

  • 重传、重复 ACK、零窗口
  • 校验和错误
  • 乱序段

7. 实战命令速查

# 按 IP + 端口过滤
tcp and ip.addr == 10.0.0.5 and tcp.port == 443

# 找所有重传
tcp.analysis.retransmission

# 看某个 TCP 流的所有包
tcp.stream eq 5

# 找出所有 RST 包
tcp.flags.reset == 1

# 找出长延迟的 ACK(>100ms)
tcp.analysis.ack_rtt > 0.1

# 只看握手包
tcp.flags.syn == 1 or (tcp.flags.syn == 1 and tcp.flags.ack == 1)

# 窗口为 0 的包
tcp.window_size == 0

8. 小结

Wireshark 是理解 TCP 最直观的工具。通过抓包分析:

  1. 三次握手 → 确认连接建立正常
  2. 数据传输 → 观察序列号推进、窗口变化、吞吐量
  3. 重传 → 发现网络质量问题
  4. 四次挥手 → 确认连接正常关闭
  5. 异常包(RST / 零窗口 / 大量重传)→ 定位问题根因

建议:学习 TCP 时一定配合 Wireshark 实操,远比只看书本更有效。


本篇要点

  • Wireshark 是理解 TCP 最直观的工具,配合实操远比只看书本更有效
  • 常用过虑器:tcp.port == 80、tcp.flags.syn == 1、tcp.analysis.retransmission、tcp.flags.reset == 1
  • 三次握手抓包特征:SYN → SYN+ACK → ACK;四次挥手特征:FIN+ACK → ACK → FIN+ACK → ACK
  • [TCP Retransmission] 是超时重传,[TCP Fast Retransmission] 是 3 个 dup ACK 触发的快速重传
  • 零窗口(Window=0)表示接收方缓冲区满;Window Full 表示发送方已发满对方通告的窗口
  • Follow TCP Stream 可重组成完整会话;IO Graph 可可视化吞吐量变化
上一页
TCP Socket 编程实践
下一页
TCP 安全与面试综合题