TCP:连接的建立、终止与三种失败的语义
TCP 是可靠传输的基石,也是诊断中信息最丰富的一层——因为它的失败方式是分化的:不同的失败携带不同的证据,指向不同的故障位置。读懂这些差异,一半的连接问题在这一层就能定位。
建立:三次握手
客户端发 SYN → 服务端回 SYN-ACK → 客户端回 ACK,连接建立。ConnProof 的 TCP 检测就是真实执行这次握手并计时。耗时大致等于一次网络往返(RTT):同城几毫秒、跨国一两百毫秒。耗时本身是证据——与目标距离严重不符的耗时提示路径绕行。
三种失败的语义差异
握手可能以三种方式失败,语义完全不同:
| 失败 | 底层事件 | 含义 | 错误码 |
|---|---|---|---|
| 超时 | SYN 没有任何回应 | 包被丢弃或主机不存在——生死未卜 | TCP-001 |
| 拒绝 | 收到 RST 回应 SYN | 主机活着、端口没服务——明确的"不" | TCP-002 |
| 不可达 | 本机路由表无路可走 | 包根本没发出去——本机的裁决 | TCP-004 |
防火墙的两种配置风格正好对应前两种:DROP(静默丢弃 → 超时)与 REJECT(回复拒绝 → refused)。所以"超时"常见于运营商与云安全组,“拒绝"常见于主机自身的防火墙。
终止:FIN 与 RST
连接的结束同样分两种风格:FIN 是双方挥手的正常关闭;RST 是单方面的强制终止。收到 RST 的一方报出的就是"connection reset by peer"。RST 值得特别警惕的原因:它可以被链路上的第三方伪造——审查设备和某些防火墙正是用伪造 RST 掐断它们不喜欢的连接,两端看起来都像"对方挂断"。
另一个常见的 RST 来源是 NAT 表过期:家用路由器把闲置几分钟的连接从转换表里清掉,之后任何一方再发数据都会触发 RST。这解释了"放一会儿再用就断"的普遍现象,对策见空闲连接超时。
与上层的关系
TCP 成功只说明"到端口的路是通的"。上层还可能失败:TLS 握手被干扰(TLS-002)、应用协议被拒(WS-001)。这正是分层诊断的逻辑:每层的成功把嫌疑范围向上推一层。
一分钟自查
connproof tcp 目标域名 --port 443 --hold 3000--hold 让检测在建连后多观察几秒,捕获"连上就被断"类的早期终止证据。