抓关闭报文在做什么
关闭报文表示一方不再发送数据。抓取它可以观察连接的正常关闭流程、判断是谁先发起关闭,也可以排查连接泄漏——如果建连很多而关闭很少,说明连接可能没有被正常释放。需要记住的是:抓到关闭报文只说明一方想关,连接是否真正结束还要看后续的确认与反向关闭报文。把关闭与复位一起抓,能完整覆盖连接结束的两种方式。
基本信息
| 抓取写法 | 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 # 关闭相关统计判读要点
- 建连数与关闭数明显不成比例时,先查是否存在连接泄漏或长期空闲连接
- 关闭报文集中出现在固定时间点,多为空闲超时或定时任务行为
- 关闭后立刻重新建连,说明存在短连接模式,可考虑连接复用优化
- 半关闭状态下仍持续有数据,属于正常现象,不要按连接已结束处理