传输层 TCP 三次握手与四次挥手:你真的理解了吗?
当你打电话给朋友,不能上来就直接聊吧?总得先确认对方在线,否则就是自言自语。
TCP 连接也是一样,得先握手,后通信:
你:喂,在吗?(SYN)朋友:在啊,你呢?(SYN+ACK)你:OK,开始聊!(ACK)断开时,也得挥手告别,否则可能对方还在等你继续说话。
来看一下 TCP 连接建立的完整流程:
(1) 第一次握手:客户端发送 SYN 报文,表示“我要建立连接”,同时携带一个初始序列号 seq = x。
(2) 第二次握手:服务器收到 SYN 后,回应一个 SYN-ACK,表示“我收到了你的请求,并且我也准备好了”,同时附带自己的初始序列号 seq = y,以及对客户端 seq = x 的确认 ack = x + 1。
(3) 第三次握手:客户端收到服务器的 SYN-ACK,发送 ACK 确认“好的,我们可以通信了”,并且 ack = y + 1,至此连接建立。
为什么是三次握手?一次两次不行吗
防止历史连接的影响:如果采用二次握手,服务器收到 SYN 后直接建立连接,但客户端的 SYN 可能是网络延迟后重复到达的“旧请求”,这会导致服务器错误地建立无效连接,而三次握手可以避免这一问题。确保双方的收发能力:第三次握手让客户端确认了服务器的接收和发送能力,避免了“盲目同意”的情况。二、TCP 四次挥手如果说三次握手是“恋爱的开始”,那么四次挥手就是“分手的全过程”——理性且克制,既保证对方准备好,也不给彼此拖泥带水的机会。
第一次挥手:客户端不想再发送数据了,向服务器发送一个 FIN(Finish)请求,表示“我准备关闭连接了”。第二次挥手: 服务器收到 FIN 后,回复一个 ACK,表示“我知道你要关闭了,但我这边可能还有些数据没处理完”。第三次挥手: 服务器处理完数据后,也发送一个 FIN,表示“好了,我也不发送数据了”。第四次挥手: 客户端收到服务器的 FIN 后,回复 ACK,并进入 TIME_WAIT 状态,确保服务器收到 ACK 后才彻底关闭连接。为什么是四次挥手?
TCP 是全双工通信:数据的发送和接收是分开的,每一方都要单独关闭自己的数据流,因此需要两对 FIN-ACK 进行确认。TIME_WAIT 机制:客户端在最后进入 TIME_WAIT 状态,确保服务器收到 ACK,防止“最后的再见”丢失。
THE END