tcpdump 是 Linux 下抓取分析 TCP 三次握手的核心工具,需用过滤表达式匹配 SYN、SYN-ACK、ACK 报文,结合 IP/端口识别客户端与服务端角色,并通过 seq/ack 数值关系验证合法性。

tcpdump 是 Linux 下最常用的网络抓包工具,能直接捕获并解析原始网络数据包。分析 TCP 三次握手过程,是理解连接建立机制、排查连接超时或失败问题的关键一步。核心在于识别 SYN、SYN-ACK、ACK 这三个标志位组合,并结合源/目的 IP 和端口确认交互顺序与角色。
抓取指定主机间的 TCP 握手报文
为避免干扰,建议限定目标主机和端口。例如,监控本机与 192.168.1.100 的 80 端口建立连接的过程:
tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn or tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn|tcp-ack' and host 192.168.1.100 and port 80
说明:
- -i eth0 指定网卡(根据实际用 ip a 查看);
- -nn 禁用域名和端口名称解析,显示原始数字;
- 过滤表达式精准匹配 SYN(仅 SYN 置位)、SYN-ACK(SYN 和 ACK 同时置位),跳过纯 ACK 或 FIN 包;
- host + port 缩小范围,提升可读性。
识别三次握手的三个关键报文
成功抓到后,典型输出如下(简化时间戳和 MAC 地址):
10:22:34.101 192.168.1.5.54321 > 192.168.1.100.80: Flags [S], seq 12345, win 64240
→ 客户端发起连接:SYN=1,seq 随机初值(如 12345),无 ack 字段
10:22:34.102 192.168.1.100.80 > 192.168.1.5.54321: Flags [S.], seq 67890, ack 12346, win 65535
→ 服务端响应:SYN=1 & ACK=1,seq 为服务端随机初值(67890),ack = 客户端 seq + 1(12345+1)
10:22:34.102 192.168.1.5.54321 > 192.168.1.100.80: Flags [.], seq 12346, ack 67891, win 64240
→ 客户端确认:ACK=1(SYN=0),seq = 原 seq + 1(12345+1),ack = 服务端 seq + 1(67890+1)
注意:
- “Flags [S]” 表示只有 SYN;
- “Flags [S.]” 表示 SYN 和 ACK;
- “Flags [.]” 表示只有 ACK(点号是 tcpdump 对 ACK=1 且其他标志为 0 的简写);
- seq/ack 数值必须严格满足“+1”关系,否则不是标准握手。
常见异常场景与判断依据
若连接无法建立,可通过缺失某类报文定位问题:
- 只看到客户端 SYN,无任何返回 → 服务端未收到(防火墙拦截、路由不通、服务未监听);
- 看到 SYN 和 SYN-ACK,但无后续 ACK → 客户端未收到 SYN-ACK(丢包、中间设备过滤)或收到后未响应(客户端异常、本地策略限制);
- SYN-ACK 中的 ack 值 ≠ 客户端 SYN 的 seq + 1 → 报文错乱或伪造,非合法握手;
- 三次报文中 IP 或端口不一致(如应答来自非目标 IP)→ 存在 NAT、负载均衡或中间代理,需结合拓扑分析。
保存与离线分析进阶技巧
抓包结果可保存为 pcap 文件,供 Wireshark 图形化分析或反复查看:
tcpdump -i eth0 -nn -w handshake.pcap 'tcp[tcpflags] & (tcp-syn|tcp-ack) >= 2 and host 192.168.1.100'
说明:
- -w handshake.pcap 直接写入文件,不实时打印;
- 过滤条件稍放宽(>=2),确保捕获所有含 SYN 或 ACK 的握手相关包;
- 后续可用 tcpdump -r handshake.pcap -nn 重放,或用 Wireshark 打开查看 TCP 流追踪(Follow > TCP Stream)。










