首页/网络/抓包与流量分析速查/tcpdump 抓 FIN 拆除包

tcpdump 抓 FIN 拆除包

抓取 FIN 报文:观察连接正常关闭流程、判断是谁先发起关闭、排查连接被对端优雅断开或连接泄漏。

抓关闭报文在做什么

关闭报文表示一方不再发送数据。抓取它可以观察连接的正常关闭流程、判断是谁先发起关闭,也可以排查连接泄漏——如果建连很多而关闭很少,说明连接可能没有被正常释放。需要记住的是:抓到关闭报文只说明一方想关,连接是否真正结束还要看后续的确认与反向关闭报文。把关闭与复位一起抓,能完整覆盖连接结束的两种方式。

基本信息

抓取写法tcp[tcpflags] & tcp-fin != 0
只看关闭确认tcp[tcpflags] = tcp-fin|tcp-ack
与复位一起看tcp[tcpflags] & (tcp-fin|tcp-rst) != 0
显示过滤tcp.flags.fin == 1
判断重点谁先发起关闭,以及反向关闭是否及时

典型使用场景

  • 判断主动关闭方:谁先发关闭报文谁就是主动方
  • 排查连接泄漏:对比建连与关闭报文数量
  • 核对空闲超时策略:观察固定间隔出现的周期关闭
  • 区分正常关闭与重置:关闭是优雅过程,重置是强制结束
  • 分析连接复用:频繁关闭说明连接池未生效

常用示例

常用示例
tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-fin != 0' -c 20                  # 抓关闭报文
tcpdump -i eth0 -nn 'host 10.0.0.9 and tcp[tcpflags] & (tcp-fin|tcp-rst) != 0'   # 关闭与复位
tcpdump -i eth0 -nn 'tcp[tcpflags] = tcp-fin|tcp-ack' -c 10               # 只看关闭确认
tcpdump -i eth0 -nn -ttt 'tcp[tcpflags] & tcp-fin != 0' -c 20             # 加间隔看关闭节奏
tcpdump -nn -r a.pcap 'tcp[tcpflags] & tcp-fin != 0' | wc -l              # 离线统计关闭报文数

关闭相关报文读法

报文含义判读要点
关闭加确认本端不再发送数据先发的这一侧是主动关闭方
确认对端已收到关闭请求连接进入半关闭,反向数据仍可继续
反向的关闭加确认对端也发完了数据两次关闭之间的间隔反映对端处理耗时
最后的确认主动方完成关闭抓包点不在主动方时可能看不到
复位强制结束连接没有完整关闭过程,需单独判断来源
关闭被重传对端迟迟不确认可能对端应用卡死或链路丢包
关闭报文重传说明对端没有确认,不要只看到一次关闭就认为连接已结束。结合确认号与重传次数判断,必要时回到对端应用侧核实。
短时间内大量关闭报文通常意味着连接复用不足或客户端行为异常,值得结合连接池与超时配置一起分析,而不是简单当作网络抖动。

连接量核对

连接量核对
ss -s | head -5                        # 各状态连接计数
ss -tan state fin-wait-1 | wc -l       # 等待确认的连接数
netstat -s | grep -i -A2 'connections' | head -10   # 关闭相关统计

判读要点

  • 建连数与关闭数明显不成比例时,先查是否存在连接泄漏或长期空闲连接
  • 关闭报文集中出现在固定时间点,多为空闲超时或定时任务行为
  • 关闭后立刻重新建连,说明存在短连接模式,可考虑连接复用优化
  • 半关闭状态下仍持续有数据,属于正常现象,不要按连接已结束处理

易错点

  • 把抓到一次关闭当成连接已结束,忽略了后续确认与反向关闭
  • 把关闭报文重传当作正常现象,实际可能对端应用已无响应
  • 未结合建连数量对比,无法发现连接泄漏这一类结构性问题
  • 把重置当成关闭处理,两者的流程与排查方向完全不同
  • 抓包点不覆盖主动关闭方时看不到最后的确认,误判为流程缺失

数据来源与参考

  • man 8 pcap-filter
  • RFC 9293(连接终止)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌