TCP 抓包实战
Wireshark 是网络工程师的"显微镜"。本篇带你用 Wireshark 看懂 TCP 的每一个细节。
1. Wireshark 快速入门
1.1 安装与基本操作
Wireshark 是开源的网络协议分析工具。下载地址:https://www.wireshark.org
基本工作流程:
- 选择网卡 → 开始抓包
- 设置过滤器缩小范围
- 点击数据包查看各层详情
- 使用统计和分析功能
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] | 重复确认(可能的丢包信号) |
如何分析重传
- 找到标有
[TCP Dup ACK]的连续多个 ACK - 找到紧随其后的
[TCP Fast Retransmission] - 右键 → 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 最直观的工具。通过抓包分析:
- 三次握手 → 确认连接建立正常
- 数据传输 → 观察序列号推进、窗口变化、吞吐量
- 重传 → 发现网络质量问题
- 四次挥手 → 确认连接正常关闭
- 异常包(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 可可视化吞吐量变化