首页/网络/网络排障速查/按 TCP 标志位过滤(SYN/RST/FIN)

按 TCP 标志位过滤(SYN/RST/FIN)

抓握手、拆连接与复位:用 tcp[tcpflags] 位运算表达式筛 SYN、RST、FIN、PSH;tcpdump 内置 tcp-syn/tcp-ack 等名称,可读性更好。

网络排障速查网络更新于 2026-10-13

标志位过滤是什么

按 TCP 标志位过滤,是定位「连不上、被重置、谁先拆连接」这类问题最直接的手段。标志位是 TCP 首部里的几个比特:SYN 表示建连请求,SYN-ACK 表示同意,RST 表示复位,FIN 表示主动关闭。tcpdump 提供了 tcp-syn、tcp-ack、tcp-fin、tcp-rst 等名称可直接参与位运算,比手工记字节偏移可靠——IP 首部长度可变,硬编码偏移在带选项的报文上会错位。

基本信息

适用平台Linux、macOS 与 BSD 的命令行抓包工具
权限需要 root 或原始套接字能力
表达式形式对标志位字段做位运算,或用内置名称参与比较
语法提示整条表达式加单引号,避免 shell 解释特殊字符
配套开关-nn 关闭名称解析、-c 限条数、-w 落盘留证

典型使用场景

  • 确认请求到底有没有发出去:只抓纯 SYN,样本最干净
  • 判断对方是否回应:抓 SYN 后再抓 SYN-ACK,看握手停在哪一步
  • 定位连接被谁中断:抓复位报文,看是服务端、客户端还是中间设备发出
  • 看谁先关闭连接:抓关闭报文,判断连接消耗在哪一侧
  • 过滤噪声:只保留控制报文,从海量数据包里快速看清连接过程

标志位过滤

标志位过滤
tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-syn != 0'         # 任意含 SYN 的报文
tcpdump -nn -i eth0 'tcp[tcpflags] == tcp-syn'            # 纯 SYN:握手第一个包
tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-rst != 0'        # 复位报文
tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-fin != 0'        # 关闭报文
tcpdump -nn -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'   # SYN-ACK
tcpdump -nn -i eth0 -c 20 'host <目标IP> and tcp[tcpflags] & tcp-rst != 0'      # 限条数,便于判读

标志名称与用途

名称含义典型用途
tcp-syn建立连接请求判断请求是否发出、对端是否响应
tcp-ack确认与 SYN 组合识别握手第二个包
tcp-fin正常关闭看哪一侧先发起关闭
tcp-rst复位判断连接被谁强制中断
tcp-push推送数据标识数据报文
tcp-urg紧急指针极少使用,排查中基本用不到
排查「为什么连不上」先抓纯 SYN,看对端是否回 SYN-ACK 或 RST:回 SYN-ACK 说明网络与端口都通,问题在应用;回 RST 说明被主动拒绝;什么都不回则多是被中间设备静默丢弃。
在带 VLAN 标签或隧道封装的接口上,标志位所在的偏移基准与预期不同,直接做位运算匹配可能抓不到目标报文。先用不带标志条件的表达式确认能抓到流量,再逐层加上标志位条件。

易错点

  • 把标志位偏移硬编码进表达式,遇到带 IP 选项的报文会错位,结果不可信
  • 在 VLAN 或隧道环境下直接做位运算匹配,偏移基准不同导致抓不到
  • 把「含 SYN 的报文」与「纯 SYN」混用,统计握手包时把 SYN-ACK 也算进去
  • 表达式不带引号,特殊字符被 shell 解释,过滤条件与预期不符
  • 只看复位报文不看方向,把中间设备发的复位误判成服务端行为

数据来源与参考

  • pcap-filter(7):tcp[tcpflags] 与标志名
  • RFC 9293:TCP 首部标志位

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌