在 TCP 世界里,“三次握手”既是联机仪式,也是协商视窗大小、MSS 等参数的谈判桌。本篇侧重 Wireshark 抓包实战:先宏观回顾 SYN → SYN|ACK → ACK 的流程,再逐位剖析 TCP 首部中的 Flags、Seq/Ack 号、Options,并配套常用显示过滤器与异常排障清单。读完后,你能 一眼识帧、两眼识错、三眼定位根因——无论是握手超时、重复 SYN 还是 RST Flood,都能迅速在 Wireshark 里还原真相。
1 三次握手流程回顾
步骤 | 方向 | 核心 Flags | 关键字段 | Wireshark 典型颜色* |
---|---|---|---|---|
① SYN | Client → Server | SYN=1 ACK=0 | Seq = x | 浅蓝 (默认) |
② SYN + ACK | Server → Client | SYN=1 ACK=1 | Seq = y Ack = x+1 | 淡绿 |
③ ACK | Client → Server | SYN=0 ACK=1 | Seq = x+1 Ack = y+1 | 深绿 |
*默认 Coloring Rules,可在 View ▶ Coloring Rules 查改 (Wireshark Wiki)。
- 建立连接同时协商:两端在 SYN 报文的 Options 里发送 MSS、Window Scale、SACK Permitted 等参数。抓包时在 Packet Details ▶ Options 即可看到 (Wireshark Wiki, Medium)。
- Seq/Ack 递增逻辑:应答方把收到的 Seq + 1 填入 Ack 字段,确保可靠传输 (CSDN博客)。
2 首部字段 & Flags 逐位详解
2.1 常用 Flags
位 | 名称 | 用途 (Wireshark 字段) |
---|---|---|
SYN | 连接建立 | tcp.flags.syn == 1 |
ACK | 确认号有效 | tcp.flags.ack == 1 |
FIN | 优雅断开 | tcp.flags.fin == 1 |
RST | 强制复位 | tcp.flags.reset == 1 |
PSH | 立即交付上层 | tcp.flags.push == 1 |
URG | 紧急指针有效 | tcp.flags.urg == 1 |
解释及 NetFlow 取值见 Site24x7 与 Noction 文档 (Site24x7, Noction)。
2.2 序列号、确认号
- ISN (Initial Seq Number):握手双方各自的随机 32 bit 起点。
- ACK 规则:若包只含 ACK 标志且无数据,则确认号 = 对端序列号 + 1;若包含数据则 + 数据长度。详见 MCSI 分解报告 (GitHub)。
2.3 常见 Options
选项 | 含义 | 抓包显示 |
---|---|---|
MSS | 最大报文段 | tcp.option.mss_val |
Window Scale | 窗口缩放因子 | tcp.option.wscale.shift |
SACK Permitted | 允许选择确认 | tcp.option.sack_perm |
Wireshark 将 Options 列在 “Transmission Control Protocol” 树形节点内,可右键 Apply as Column 方便对比 (Wireshark Wiki)。
3 Wireshark 抓包实战
3.1 过滤三次握手
tcp.flags.syn == 1 && tcp.flags.ack == 0 # 仅 SYN
tcp.flags.syn == 1 && tcp.flags.ack == 1 # SYN|ACK
tcp.analysis.initial_rtt # RTT 统计
【DisplayFilters】允许用逻辑表达式精确定位握手帧 (Wireshark Wiki)。
3.2 常见异常快速定位
症状 | 过滤器 | 可能原因 | |
---|---|---|---|
连续 SYN 无 SYN | ACK | tcp.flags.syn==1 && tcp.analysis.retransmission | 服务器无响应 / 丢包 |
RST 握手中断 | tcp.flags.reset==1 | 目标端口关闭或防火墙拒绝 | |
零窗口 | tcp.window_size == 0 | 对端缓冲满,流量堵塞 | |
MSS 不匹配 | 找不同流 MSS 值 | 中间设备 MTU 过小 |
4 握手故障排障流程(实战脚本)
# 1. 抓取五秒流量只保留 3 路握手
sudo tcpdump -i eth0 -w handshake.pcap 'tcp[13]&0x12!=0 and port 80' -G 5 -W 1
# 2. 在 Wireshark 打开彩色规则,过滤 tcp.flags.syn==1
# 3. 分析 RTT / 过滤重传
tcp.analysis.ack_rtt && tcp.analysis.retransmission
若 RTT 显示 > 3 s 或出现多次 Retransmission,应检查链路或 MTU 。流程灵感来自 CSDN/Wireshark 抓包示例 (CSDN博客)。
5 总结 & 推荐练习
- 三次握手不仅建连接,还协商 MSS、窗口缩放、SACK。
- Flags 组合是 Wireshark 排障关键:
SYN
→SYN,ACK
→ACK
为正途,遇RST
,0 win
即异常。 - 抓包练习:对本机
curl example.com
,用过滤器展示 Seq/Ack 进位;修改防火墙拒绝 SYN|ACK 观察重传。 - 延伸阅读:Wireshark Wiki “TCP 3-way handshaking” 全文、Display Filters 语法、RFC 793 原典。
索引(共 12 条高质量参考)
- Wireshark Wiki “TCP 3-way handshaking” (Wireshark Wiki)
- Medium “TCP 3-Way Handshake Using Wireshark” (Medium)
- Wireshark Wiki “DisplayFilters” (Wireshark Wiki)
- Site24x7 “Understanding TCP Flags” (Site24x7)
- Noction “Decoding TCP Flags” (Noction)
- Wireshark Wiki TCP 3-way handshaking Options 段落 (Wireshark Wiki)
- CSDN “wireshark抓包图解三次握手” (CSDN博客)
- CSDN “使用 Wireshark 查看 TCP 三次握手” (CSDN博客)
- TCP/IP 协议 Flags 列表 (Site24x7) (Site24x7)
- RFC 793 TCP 标准(握手设计) (博客园)
- GitHub “MCSI dissecting three-way handshake” (GitHub)
- Wireshark Wiki Mate/Library(会话拆分) (Wireshark Wiki)
通过本篇,你已具备在 Wireshark 中 精准捕获并诊断三次握手 的能力;接下来可尝试分析 TLS 握手,体会其在 TCP 之上的再次“对敲”!