长连接和短连接

发布于:2025-03-10 ⋅ 阅读:(16) ⋅ 点赞:(0)

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