刚入行时我也以为‘长’就是‘慢’,‘短’就是‘快’——结果上线后发现,一个HTTP接口每秒建立300次TCP连接,服务器SYN队列直接打满。后来才明白:TCP连接本身没有‘长短’之分,只有‘复用’与‘重建’之别。
简单说:
很多人只盯着三次握手+四次挥手的开销(约1.5 RTT),但真正压垮系统的,往往是隐藏成本:

TIME_WAIT堆积(尤其在NAT网关后);HTTP/1.1确实规定Connection: keep-alive为默认行为,但服务端有权随时关闭。我们抓包发现:Nginx默认keepalive_timeout 75s,而某些CDN节点甚至设为10s。更现实的是——客户端不发请求,连接就只是‘挂着’,毫无价值。
反观HTTP/2/3,天然多路复用,一个TCP连接跑多个stream,这才是真正的‘长连接红利’。所以现在新项目,我基本不纠结HTTP/1.1的keep-alive,而是直接推HTTP/2 + TLS 1.3。
常有人问:WebSocket和TCP长连接啥关系?我的理解是:
WebSocket是运行在TCP长连接之上的应用层协议,它解决了HTTP长连接无法服务端主动推送的硬伤。
举个例子:你用微信发消息,服务端必须实时推送到对方手机——如果用HTTP短连接轮询,延迟高、电量爆炸;用HTTP长连接,又卡在‘只能客户端先发起请求’;而WebSocket一建立,双向通道就通了,心跳保活+消息帧传输,这才是IM的底层命脉。
去年帮一家教育公司重构IM服务,他们原用HTTP短连接轮询(30s间隔),峰值QPS 8000,服务器CPU常年90%+。我们做了对比测试:

| 方案 | 平均延迟 | 单机承载用户 | 故障恢复时间 |
|---|---|---|---|
| HTTP短连接轮询 | 1.2s | ≈3000 | 依赖客户端重试(5~30s) |
| TCP长连接(自研协议) | 86ms | ≈22000 | 心跳检测+自动重连(<500ms) |
结论很清晰:只要客户端能稳定维持连接(iOS/Android后台保活OK),长连接是IM的唯一合理选择。不过要注意——长连接不是银弹,得配套做连接池管理、心跳探测、灰度降级(比如弱网时切回HTTP备用通道)。
我建议三步走:
go-wrk或hey测短连接;用wstest或自研客户端测长连接(重点看连接复用率);netstat -an | grep :PORT | wc -l(连接数)、ss -i(TCP重传率)、服务端GC Pause(长连接内存泄漏高发区);tcpdump抓包,确认是否真复用了连接(看源端口是否变化)。说到这儿,你可能好奇:像趣码短链、趣码抖音卡片这类工具,和TCP连接有啥关系?其实它们更多出现在‘连接发起侧’——比如用户点击一条趣码微信卡片,前端JS发起首次HTTP请求跳转,这个环节的连接策略(短 vs 长)会影响首屏加载速度。我们做过AB测试:在卡片落地页启用HTTP/2长连接后,3G网络下首屏时间从2.1s降到1.3s。这类工具本身不处理连接复用,但作为流量入口,它的跳转链路设计值得纳入整体连接治理。
别迷信‘长连接一定好’。我见过团队盲目上长连接,结果因心跳机制缺陷,导致百万连接假在线,把Redis撑爆。我的经验是:

TIME_WAIT > 30000立刻通知,而不是等用户投诉。技术没有标准答案,只有具体场景下的最优解。下次设计架构前,不妨先问一句:这个连接,到底是为了更快,还是为了更稳,抑或只是更省事?