长连接与短连接
# HTTP长连接
在HTTP 1.1协议中,默认开启了长连接,即
Connection: keep-alive
,使得多个HTTP请求/响应可以在一个TCP连接上连续传送,而不需要每次传输都建立新连接;HTTP长连接可以减少连接和关闭的次数,降低延迟,提高效率,但它不是实时的,仍依赖请求-响应模式;
# TCP长连接
TCP长连接可以减少TCP握手和挥手的次数,适用于需要长时间保持连接的场景,如数据库连接、文件传输等;
使用TCP长连接时要考虑心跳机制,以便检测和维持连接的活性;
# WebSocket长连接
WebSocket协议提供了在单个TCP连接上进行全双工通信的能力;
允许服务器主动向客户端发送信息,适用于需要服务器实时推送数据到客户端的场景,如在线聊天、游戏、实时交易等;
在建立连接时需要进行一次握手,建立后可以持续不断地传输数据,直到任一方主动关闭连接;
# 长轮询
长轮询是对传统轮询的改进,客户端发起请求后,如果服务器没有数据,它不会立即返回,而是等到有数据时才响应;
长轮询可以减少请求的次数,提高数据实时性,但它仍然需要频繁地建立HTTP连接;
# 长连接特性
- 减少连接建立的开销:由于不需要频繁建立和断开连接,长连接可以减少因为TCP握手或TLS握手带来的时间和资源开销;
- 提高数据传输效率:长连接减少了每次数据交互都要建立连接的需要,从而降低了延迟,提高了数据传输的效率;
- 保持会话状态:在一些需要保持会话状态的应用中,如数据库连接和文件传输,长连接可以简化会话管理;
- 心跳机制:长连接通常需要通过心跳机制来检测和保持连接的活性,防止连接由于超时而被关闭;
- 资源占用:与短连接相比,长连接会在其生命周期内持续占用系统资源,如端口和内存,这可能在一定程度上影响服务器的扩展能力;
# 什么情况下不应该用长连接?
长连接长久占据线程资源,在连接数量过多的情况下导致连接被打满;
扫码登陆 或 扫码支付 多半采用 HTTP 短轮询请求;