Socket
客户端(Client) 服务端(Server)
-------- 创建 Socket ----------------
------ 建立 TCP 连接 ----------------
-------- 发送数据 -------------------
------- 接收数据 --------------------
------- 发送数据 -------------------
------ 接收数据 --------------------
------------- 关闭连接 --------------
Socket 分类
1. TCP Socket(最常用)
特点:
- 面向连接
- 数据可靠
- 数据不会丢失
- 数据按顺序到达
- 速度稍慢
适用于:
- 聊天
- MQTT
- IM
- 文件传输
- HTTP/HTTPS(底层就是 TCP)
IM(Instant Messaging)是即时通讯系统,是一种业务形态,例如微信、QQ,它包含聊天、群聊、在线状态、消息同步等完整功能。MQTT(Message Queuing Telemetry Transport)是一种基于 TCP 的轻量级发布/订阅消息协议,只负责消息的可靠传输。IM 可以建立在 TCP Socket、WebSocket 或 MQTT 等协议之上。在 IoT 场景中,由于 MQTT 协议开销小、支持长连接、QoS 和断线重连,因此非常适合设备与云端之间的实时通信。
2. UDP Socket
特点:
- 无连接
- 不保证送达
- 不保证顺序
- 速度快
适用于:
- 视频直播
- 语音通话
- 游戏
- 局域网广播
Socket 四要素
IP 地址 端口号 协议(TCP/UDP) 数据TCP三次握手:请求携带报文--获取请求响应--反馈客户端
在读写过程中,消耗序列号是为了排序、重试机制等操作;
四次挥手:通讯结束:1️⃣客户端请求关闭、2️⃣服务端收到允许关闭,但数据未发完(单方面确认客户端关闭)、3️⃣服务端确认关闭、4️⃣确认客户端和服务端关闭(必须2️⃣,因为服务端没收到通知会一直重试机制)
高频追问:
为什么 TIME_WAIT 要等待 2MSL?
TIME_WAIT 等待 2MSL 有两个目的:第一,保证最后一个 ACK 丢失时还能重新发送,确保服务器正常关闭连接;第二,等待网络中的旧 TCP 报文全部过期,避免影响后续使用相同四元组(源 IP、源端口、目标 IP、目标端口)的新连接。
CLOSE_WAIT 状态过多说明什么问题?(通常是应用程序没有及时调用close()关闭 Socket)
CLOSE_WAIT 表示 TCP 已收到对方关闭请求,并返回 ACK,但本地应用程序没有及时关闭 Socket(调用Close()),因此连接一直停留在 CLOSE_WAIT。大量 CLOSE_WAIT 一般说明应用层存在资源泄漏或未正确调用 close() 的问题。
FIN_WAIT_2 状态为什么会出现?
FIN_WAIT_2 表示本端已经发送 FIN,并收到对方 ACK,自己的发送方向已经关闭,但仍在等待对方发送 FIN。出现时间过长通常说明对方应用程序没有及时关闭连接。
RST(Reset)和 FIN 有什么区别?
| FIN | RST |
|---|
| 正常关闭 | 强制关闭 |
| 四次挥手 | 立即断开 |
| 可继续读取剩余数据 | 数据立即丢弃 |
| 优雅关闭(Graceful Close) | 异常关闭(Abortive Close) |
什么情况下会发送 RST 而不是 FIN?
RST 一般出现在连接异常或需要立即终止连接的场景,例如连接的目标端口不存在、程序异常退出、收到属于不存在连接的 TCP 报文,或者应用主动要求强制关闭连接。RST 不会进行四次挥手,而是立即释放连接。
