Socket 客户端(Client) 服务端(Server)-------- 创建 Socket ---------------------- 建立 TCP 连接 ------------------------ 发送数据 -------------------------- 接收数据 --------------------------- 发送数据 ------------------------- 接收数据 --------------------------------- 关闭连接 --------------Socket 分类1. TCP Socket最常用特点面向连接数据可靠数据不会丢失数据按顺序到达速度稍慢适用于聊天MQTTIM文件传输HTTP/HTTPS底层就是 TCPIMInstant Messaging是即时通讯系统是一种业务形态例如微信、QQ它包含聊天、群聊、在线状态、消息同步等完整功能。MQTTMessage 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 要等待 2MSLTIME_WAIT 等待 2MSL 有两个目的第一保证最后一个 ACK 丢失时还能重新发送确保服务器正常关闭连接第二等待网络中的旧 TCP 报文全部过期避免影响后续使用相同四元组源 IP、源端口、目标 IP、目标端口的新连接。CLOSE_WAIT 状态过多说明什么问题通常是应用程序没有及时调用close()关闭 SocketCLOSE_WAIT 表示 TCP 已收到对方关闭请求并返回 ACK但本地应用程序没有及时关闭 Socket调用Close()因此连接一直停留在 CLOSE_WAIT。大量 CLOSE_WAIT 一般说明应用层存在资源泄漏或未正确调用 close() 的问题。FIN_WAIT_2 状态为什么会出现FIN_WAIT_2 表示本端已经发送 FIN并收到对方 ACK自己的发送方向已经关闭但仍在等待对方发送 FIN。出现时间过长通常说明对方应用程序没有及时关闭连接。RSTReset和 FIN 有什么区别FINRST正常关闭强制关闭四次挥手立即断开可继续读取剩余数据数据立即丢弃优雅关闭Graceful Close异常关闭Abortive Close什么情况下会发送 RST 而不是 FINRST 一般出现在连接异常或需要立即终止连接的场景例如连接的目标端口不存在、程序异常退出、收到属于不存在连接的 TCP 报文或者应用主动要求强制关闭连接。RST 不会进行四次挥手而是立即释放连接。