文章目录
1、长连接和短连接的理解
对短连接和长连接的形象理解:
1.1 短连接
想象你要去超市买东西,步骤是:
- a、推门进超市(建立连接)
- b、选商品结账(传输数据)
- c、支付完成后离开超市(断开连接)
可以看到,它的特点是:
- 每次任务都要重新开始:每天去超市买东西,都要从头走一遍全部步骤,推门、结账、离开
- 简单但低效:不需要额外维持,但每次都要重复推门、关门离开
- 适用场景:一次性任务,比如早期的网页请求(每个页面加载完就断开)
1.2 长连接
想象你要和家人打微信视频,步骤是:
- a、打开手机摄像头并等待家人接听(建立连接)
- b、说了你工作的事后,又继续说你们家里的事(持续传输数据)
- c、挂断电话,结束聊天(主动断开连接)
可以看到,它的特点是:
- 连接会保持一段时间:
一旦成功建立连接,可以反复传输数据
,直到主动结束 - 高效但占用资源:不用反复打电话、挂电话,但一直开着视频会消耗电量,服务器需要维护连接列表
- 适用场景:需要频繁交互的场景,比如在线游戏、RocketMQ的Broker和NS之间
2、连接
连接,指两个设备(如客户端和服务端)之间的一条通信通道,建立连接意味着双方协商好通信规则,并分配资源(端口、内存)用于数据传输,常见的连接如TCP连接(Transmission Control Protocol)
2.1 TCP连接的建立:三次握手
TCP协议规定,每个建立连接必须经过三次握手,用一副书里的漫画:
过程如下:
客户端动作 | 服务器动作 | 状态变化 |
---|---|---|
发送 SYN 报文(Synchronize) | 收到 SYN 后,记录客户端的序列号(Seq=1),并发送 SYN+ACK 报文(确认+同步) | 服务端进入 SYN_RECV 状态 |
客户端收到 SYN+ACK 后,发送 ACK 报文(确认) | 服务端收到 ACK 后,确认连接成功 | 双方进入 ESTABLISHED 状态 |
SYN 报文:
- 包含客户端生成的随机序列号(Seq),用于后续数据传输的顺序控制。
- 请求建立连接
SYN+ACK 报文:
- 服务端收到 SYN 后,生成自己的 Seq(比如 Seq=2),并携带客户端的 Seq+1(即 Ack=2)作为确认。
- 表示服务端愿意建立连接
ACK 报文:
- 客户端收到服务端的 Seq 后,发送 Ack=服务端的 Seq+1(即 Ack=3)
- 确认服务端的 Seq 被正确接收,连接正式建立
2.2 TCP连接的释放:四次挥手
建立连接需要三次握手,断开则需要四次挥手(因为双方都需要确认对方不再发送数据了)
步骤 1:客户端发送 FIN(结束标志)
- 客户端说:“我这边没数据要发了,可以断开了”(发送 FIN 包)
- 此时,客户端进入客户端进入半关闭状态(还能接收数据,但不能发送)
步骤 2:服务器收到 FIN 后,发送 ACK(确认)
- 服务器说:“好的,我知道你要断了,但我可能还有数据没发完”(发送 ACK 包)
- 服务器进入 半关闭状态(还能发送数据,但不能接收新数据)
- 客户端收到 ACK 后,进入 关闭等待状态,等待服务器也断开
步骤 3:服务器发送 FIN(结束标志)
- 服务器说:“我的数据也发完了,现在可以彻底断了”(发送 FIN 包)
- 服务器进入 最后确认状态,等待客户端的最终确认
步骤 4:客户端收到 FIN 后,发送 ACK(确认)
- 客户端说:“好的,我也确认了,咱们彻底断开吧!”(发送 ACK 包)
- 客户端进入 CLOSED 状态
- 服务器收到 ACK 后,也进入 CLOSED 状态,连接终止
形象的比喻:打电话断线
- 你(客户端):“喂,我这边讲完了,挂电话吧”(发送 FIN)
- 对方(服务器):“好的,我这边可能还有话要说,但我同意挂断”(发送ACK)
- 对方(服务器):“我这边真的讲完了,可以挂了”(发送 FIN)
- 你(客户端):“好,那我也挂了”(发送 ACK)
客户端最后一次发送 ACK 后,会进入 TIME_WAIT 状态,等待 2MSL(最长报文段生存时间),这是为了确保服务器能收到 ACK,防止旧数据干扰新连接。但TIME_WAIT 状态也有弊端,如果频繁短连接,大量客户端处于 TIME_WAIT 状态,会占用端口资源,此时,需要调整系统参数(如 net.ipv4.tcp_fin_timeout)或使用长连接
2.3 案例
案例 1:短连接(HTTP 请求),每次请求都要重复握手,适合小数据量场景
1)浏览器访问 http://example.com → 发起 TCP 三次握手。
2)服务器返回 HTML → 完成四次挥手,连接关闭。
3)浏览器加载图片 → 重新发起三次握手,重复上述过程。
案例 2:长连接(WebSocket),减少了握手开销,适合高频交互场景
1)浏览器与服务器建立 TCP 三次握手 → 连接保持。
2)双方实时发送消息(如聊天、股票数据)。
3)任意一方主动发送 FIN 断开连接 → 完成四次挥手。
2.4 长连接和短连接
总结下,短连接就是:
客户端 -> 三次握手 -> 发送数据 -> 四次挥手 -> 断开连接
→ 完成一次请求后立即断开,下次请求再重新建立连接
长连接就是:
三次握手 -> 发送数据 -> (保持连接)-> 发送更多数据 -> ... -> 四次挥手 -> 断开连接
连接建立后,可以多次传输数据,但长连接会一直占用资源,服务器需要维护连接列表,长时间闲置可能被防火墙或 NAT 设备中断
// 详解TCP为什么要三次握手
https://www.cnblogs.com/kukuxjx/p/17507664.html
// wireshark抓包的角度看三次握手
https://cloud.tencent.com/developer/article/2371851
3、其余类型的连接
协议/连接类型 | 核心特点 | 典型场景 |
---|---|---|
TCP | 可靠传输、面向连接、流量控制 | 文件传输、网页访问 |
UDP | 无连接、速度快、允许丢包 | 视频流、在线游戏 |
HTTP/HTTPS | 请求-响应模型、无状态(可扩展状态) | Web 服务、API请求 |
WebSocket | 全双工、持久连接 | 实时聊天、游戏同步 |
QUIC | 基于 UDP、低延迟、多路复用 | HTTP/3、流媒体 |
MQTT | 轻量级、发布/订阅模式 | 物联网、传感器网络 |
总结:
- 需要可靠传输 → 选 TCP 或 HTTP/HTTPS
- 追求低延迟和速度 → 选 UDP 或 QUIC
- 实时双向通信 → 选 WebSocket
- 物联网设备通信 → 选 MQTT 或 CoAP