
短连接和长连接的区别只有一句话:短连接是每次通信都新建一条 TCP 连接、数据传完立即关闭;长连接是建立一次之后持续保持,后续多次通信复用同一条连接。HTTP/1.0 默认使用短连接,HTTP/1.1 默认开启 keep-alive,也就是长连接。选哪种取决于通信频率和实时性要求,不是越长越好。
一张表看区别
| 维度 | 短连接 | 长连接 |
|---|---|---|
| 连接次数 | 每次请求都新建 | 建立一次,多次复用 |
| 握手开销 | 每次都经历三次握手、四次挥手 | 只在建立时握手一次 |
| 资源占用 | 连接用完即释放,服务端压力小 | 长期占用内存与文件描述符 |
| 实时性 | 较差,需客户端主动请求 | 较好,可配合推送机制 |
| 典型场景 | 低频接口调用、静态资源请求 | 数据库连接池、消息队列、即时通讯 |
短连接贵在握手
一条 TCP 连接建立要三次握手,关闭要四次挥手,加上 TLS 握手,往返时延会叠加好几次。网页打开时要加载几十个资源,如果每个资源都新建连接,光握手就消耗大量时间。HTTP/1.1 的 keep-alive 让浏览器复用同一条连接,减少重复握手与慢启动;HTTP/2 在一条连接上做多路复用,把请求拆成独立的流并行传输,进一步减少了排队等待。
长连接的代价
长连接不是免费的:中间的网络设备(NAT、防火墙、负载均衡)会清理长时间空闲的连接表项,双方却未必知道,所以要定期发心跳包保活;每条连接在服务端都占内存和文件句柄,连接数上万时资源压力明显;连接一旦建立就绑定到某个后端实例,扩容缩容时要考虑连接如何迁移。因此长连接通常配合连接池、超时回收和心跳机制一起使用。
“短链接”是另一件事
很多人把“短连接”和“短链接”混为一谈。短链接是把长网址压缩成短网址的服务,属于应用层的网址映射,访问时通过 301 或 302 跳转到原始地址;短连接说的是传输层的连接复用方式。前者关心的是网址长度与跳转,后者关心的是连接建立与关闭,两者没有直接关系。
常见问题
keep-alive 就是长连接吗?
keep-alive 是 HTTP 协议层实现长连接的方式,让同一条 TCP 连接上可以连续处理多个请求;除此之外,数据库连接池、WebSocket 也都是长连接的不同实现。
长连接会一直不断吗?
不会。服务端通常设置空闲超时,超时后主动关闭;中间设备也可能清理连接表项,所以需要心跳包维持。
什么时候该用短连接?
请求频率低、每次交互独立、不需要服务端主动推送的场景,用短连接实现简单、资源占用少。
短链接和短连接是一回事吗?
不是。短链接是把长网址缩短并跳转,短连接是 TCP 连接的建立与关闭方式。
避坑提示:调试接口时如果遇到“偶发超时、重试就好”,先看服务端和中间设备的空闲超时设置是否短于客户端的连接复用时间;长连接数量上来后要监控文件句柄与内存,别等到连接数打满才发现问题。
