连接超时(timeout)和连接被拒绝(refused)有什么区别?
更新时间:2026-09-19。短答页。这两个报错都「连不上」,但在 TCP 层面含义完全不同,排查方向也不同。
一句话回答
Connection refused = 网络通、对端明确回了 RST,通常是该端口没进程监听或被主动拒绝;Connection timed out = SYN 发出去石沉大海,对端不响应,通常是主机不可达、防火墙 DROP 丢包或路由问题。
TCP 握手层面
bash
正常: 客户端 ─SYN→ 服务端 ─SYN/ACK→ 客户端 ─ACK→ 连接建立
refused: 客户端 ─SYN→ 服务端 → 立刻回 RST(「这个端口没人听」)
timeout: 客户端 ─SYN→ ✗(无响应,重传若干次后超时)| 现象 | 含义 | 常见原因 |
|---|---|---|
| refused(快,立即报错) | 到了对端,但被明确拒绝 | 服务没启动/没监听该端口;只监听 127.0.0.1 非 0.0.0.0;监听 backlog 全满;防火墙 REJECT |
| timeout(慢,等到超时) | SYN 无任何回应 | 对端断电/宕机;安全组/防火墙 DROP;路由不可达;ACL 静默丢包;对端过载来不及响应 |
关键直觉:有人应答(哪怕是拒绝)= refused;完全没人理 = timeout。
各自怎么排查
refused:
bash
ss -ltnp | grep :8080 # 服务端:端口到底监听没、绑的什么地址
systemctl status app # 进程是否启动
curl -v http://host:port # 立即看是否 RST多为配置问题:端口写错、服务崩了、绑定在 127.0.0.1 外部连不上、容器端口没映射。
timeout:
bash
ping 对端 # 主机/网络层可达吗
nc -vz host port # 端口连通性(超时说明包被丢弃)
sudo tcpdump -nn host x and port 8080 # 看 SYN 有没有出去、有没有任何回包重点查安全组/iptables(DROP 会静默丢包、REJECT 才会快速报错)、路由、对端是否宕机或负载过高,见抓包实战、ss 连接排障。
一个易混点
- 防火墙策略 REJECT → 你会收到拒绝(像 refused/icmp-port-unreachable)。
- 防火墙策略 DROP → 包被直接丢弃,你得到的是 timeout。
- 所以「timeout」往往比「refused」更偏向网络链路/安全策略问题,而不是应用没起。
坑
- 看到连不上就只查应用,不区分报错类型,方向全错。
- 服务监听 127.0.0.1 导致外部连接被拒,误以为是防火墙。
- 把防火墙 DROP 当服务宕机,实际上服务正常只是包到不了。
- 忽略 backlog 满也可能产生 RST/丢包(高并发新建连接时),见高并发连接设计。
总结
Connection refused 是 TCP 层收到了对端 RST,说明主机可达但端口无监听、地址绑定不对或被 REJECT,属于快速失败、应先查服务监听和进程状态;Connection timed out 是 SYN 多次重传无人应答,说明对端宕机、包被防火墙 DROP 或路由不通,属于网络可达性问题、应配合 ping、nc 和 tcpdump 查链路与安全组——前者「有人明确说不」,后者「根本没人回应」。