TCP 三次握手四次挥手

发布时间:2026/5/18 19:14:10

TCP 三次握手四次挥手 一、 三次握手 (建立连接)目的确认双方的接收和发送能力都正常。第一次握手 (Client - Server)动作客户端发送一个SYN1的包并带上一个随机序列号Seqx。状态转换客户端进入SYN_SENT状态。物理意义客户端问“喂你能听到我说话吗”第二次握手 (Server - Client)动作服务端收到后发送SYN1, ACK1确认号Ackx1并带上自己的随机序列号Seqy。状态转换服务端进入SYN_RCVD状态。物理意义服务端回答“我听到了那你也能听到我说话吗”这里把 ACK 确认应答和 SYN 询问合并在一个包里发了。第三次握手 (Client - Server)动作客户端收到后发送ACK1确认号Acky1。状态转换客户端和收到该包的服务端都进入ESTABLISHED已连接状态。物理意义客户端回答“我也能听到”。至此双方都确认了彼此的收发能力正常连接建立。面试常问为什么是三次不是两次或四次为什么不能是两次如果只有两次服务端发完第二次握手包后就以为连接建立成功了。但如果这个包在网络中丢失客户端根本没收到。此时服务端一直傻等浪费资源或者网络中延迟的旧请求突然到达服务端服务端以为是新连接导致状态错乱防止已失效的连接请求报文段突然又传送到了服务端。为什么不是四次第二步中服务端把确认对方的 ACK 包和询问对方的 SYN 包合并成了一个优化了效率所以不需要四次。二、 四次挥手 (断开连接)目的优雅地断开双向通道确保所有数据都传输完毕。挥手的核心在于 TCP 是全双工的双向通道独立。所以一方关掉发送通道不代表它不能接收数据了这叫做“半关闭 (Half-Close)”状态。第一次挥手 (Client - Server)动作客户端数据发完了主动发送FIN1的包。状态转换客户端进入FIN_WAIT_1状态。物理意义客户端说“我没数据要发了准备关门了。”第二次挥手 (Server - Client)动作服务端收到 FIN立刻回复ACK1。状态转换服务端进入CLOSE_WAIT客户端收到后进入FIN_WAIT_2。物理意义服务端说“好的我知道你发完了。但我可能还有数据没发完你等我一下。” 此时 Client 到 Server 的通道关闭但 Server 到 Client 的通道还在Server 可以继续发业务数据。第三次挥手 (Server - Client)动作服务端的数据也发完了发送FIN1的包给客户端。状态转换服务端进入LAST_ACK状态。物理意义服务端说“我的数据也发完了我也准备关门了。”第四次挥手 (Client - Server)动作客户端收到 FIN回复ACK1。状态转换客户端进入TIME_WAIT状态。服务端收到后直接进入CLOSED状态。客户端等 2MSL 时间后也进入CLOSED状态。物理意义客户端说“收到你关吧。” 然后客户端在原地等一会儿确认服务端真的关了自己才彻底关机。面试常问为什么握手是三次挥手却要四次握手时服务端可以把ACK确认和SYN申请连接合并在同一个包里发。但挥手时服务端收到FIN只能先回一个ACK表示“我收到了”。此时服务端可能还要继续处理业务把缓冲区里剩下的数据发完不能马上发FIN。所以ACK和FIN只能分两步发导致总共需要四次。

相关新闻