errno 111(connection refused)表示客户端发出syn后收到服务端rst,说明三层可达、四层有响应但目标端口无进程监听,典型原因包括后端未启动、监听地址不匹配(如仅127.0.0.1却配置远程ip)、unix套接字与tcp端口配置不一致,或防火墙/selinux拦截。

Linux TCP 握手失败时,内核不会直接返回“握手失败”这种模糊提示,而是通过系统调用(如 connect())返回具体的 errno 错误码。这些错误码精准指向失败环节:是路由不通、端口无监听、中间丢包,还是本地资源耗尽。理解它们对应的网络行为,比单纯查手册更有效。
Connection refused(ECONNREFUSED,errno 111)
表示客户端成功发出了 SYN,也收到了服务端明确的 RST 响应——说明三层可达、四层有响应,但目标端口无人监听。
- 典型场景:服务进程未启动、监听地址绑定为 127.0.0.1(而客户端从外网连)、防火墙 DROP 后伪装成 RST(少见但存在)
- 验证方法:
ss -tlnp | grep :端口看是否真在 LISTEN;telnet IP 端口若立即报 Connection refused,基本可锁定此原因 - 抓包特征:SYN → RST(无 SYN-ACK),Wireshark 中显示 "TCP Reset"
Connection timed out(ETIMEDOUT,errno 110)
表示客户端发出 SYN 后,在超时时间内始终未收到任何响应(既无 SYN-ACK,也无 RST)。
在无 root/sudo 权限的环境(云容器、VPS、隔离主机)中安装并配置 OpenClaw 浏览器工具的 headless Chrome。适用场景:...
- 根本原因一定是网络路径中断:目标主机宕机、路由缺失、防火墙静默丢弃 SYN、中间 NAT 设备未转发、或服务端半连接队列溢出后直接丢包(不回 RST)
- 注意:它和应用层超时(如 curl --timeout)不同,这是内核协议栈层面的 connect() 超时(默认约 75 秒)
- 排查重点:先
ping IP确认 ICMP 可达性;再tcpdump -i any port 端口 and host IP看 SYN 是否发出、有无返回
Address already in use(EADDRINUSE,errno 98)
不是握手失败,而是本地 bind() 阶段就失败了——常被误认为是连接问题。
- 发生时机:服务端调用
bind()时端口已被占用;或客户端快速重连,TIME_WAIT 状态 socket 占用原端口未释放 - 关键区别:它发生在 connect() 之前,所以根本不进入握手流程
- 解决方向:查
ss -tlnp | grep :端口找冲突进程;或调整net.ipv4.tcp_tw_reuse = 1允许 TIME_WAIT 复用(需谨慎)
Resource temporarily unavailable(EAGAIN/EWOULDBLOCK,errno 11)
本质是本地资源不足导致 connect() 无法发起,而非网络链路问题。
- 常见于高并发客户端:本地 ephemeral 端口耗尽(
net.ipv4.ip_local_port_range设置过窄)、文件描述符满(ulimit -n限制)、或哈希表查找锁竞争激烈(端口选择循环耗 CPU) - 现象:大量 connect() 立即失败,伴随系统态 CPU 上升、
ss -s显示 "orphan" 连接数异常高 - 检查命令:
cat /proc/sys/net/ipv4/ip_local_port_range、lsof -u $USER | wc -l、ss -s | grep orphan
Network is unreachable(ENETUNREACH,errno 101)
内核在发 SYN 前就判定无路由可达目标地址,压根不会发包。
- 原因:本地路由表缺失对应网段条目、默认网关配置错误、或目标 IP 是私有地址但不在本机直连网段
- 验证:
ip route get 目标IP会直接报 "Network is unreachable";route -n检查路由表完整性 - 注意:它比 ETIMEDOUT 更早发生,不依赖任何远程响应,纯本地决策










