两种结束方式的区别
正常关闭用结束标志,含义是「我不再发数据了,但仍然可以收」,对端读到结尾后可以优雅收尾;重置则直接放弃连接,未读数据可能被丢弃,对端的读操作会立刻报错(RFC 9293 §3.5)。抓包里看到哪一种,往往直接决定排查方向。
谁更容易遇到重置
重置常见于端口没有监听、进程崩溃、连接被中间设备清理等场景。负载均衡与代理转发中尤其要分清:后端提前关闭连接(请求体还没读完)会发出重置,前端若没读到响应结束就断开,用户侧就会看到间歇性的响应截断。
基本信息
| 结束标志 | 表示不再发送数据,连接进入半关闭 |
|---|---|
| 重置 | 立即放弃连接,缓冲数据可能被丢弃 |
| 对端表现 | 读到结尾可优雅收尾,或立刻收到连接被重置的错误 |
| 常见重置来源 | 端口未监听、进程崩溃、中间设备清理连接 |
典型使用场景
- 排查「偶发响应截断」:看是否出现重置
- 区分端口未监听与进程崩溃导致的连接失败
- 负载均衡与代理的连接管理调优
- 分析连接被中间设备清理的现象
抓包区分
抓包区分
tcpdump -nn 'tcp[tcpflags] & (tcp-fin|tcp-rst) != 0' -c 20 # 同时抓两种结束方式
ss -tan state fin-wait-1 | wc -l # 主动关闭后等待对端结束的连接
ss -s # 各类状态汇总对比项
| 对比项 | 正常关闭 | 重置终止 |
|---|---|---|
| 语义 | 我不再发数据,仍可接收 | 立即放弃这条连接 |
| 对端表现 | 读到结尾,可以优雅收尾 | 读操作报错,未读数据丢失 |
| 缓冲数据 | 正常发送完毕 | 可能被直接丢弃 |
| 典型场景 | 应用主动关闭连接 | 端口拒绝、进程崩溃、连接被清理 |
客户端收到重置会丢失尚未读完的响应体,这是「偶发响应截断」最常见的来源之一,且往往只在特定并发条件下出现。
代理转发时,如果后端在请求体没读完就关闭连接,会发出重置;正确的改动方向是让转发侧保持连接、读到响应结束再关闭。
抓包是判断谁先发起关闭的唯一可靠手段:只看两端日志时,关闭方往往被记成「对端异常断开」。