一、三次握手在解决什么问题 TCP 是面向连接的协议,通信前双方要确认三件事:我的发送能力正常、你的接收能力正常、你的发送能力也正常。三次握手刚好把这三件事都验证一遍。 第一次:客户端发 SYN,带上自己的初始序列号 seq=x。此时服务端只知道「客户端能发」。 第二次:服务端回 SYN+ACK,带上自己的 seq=y 并确认 ack=x+1。此时客户端知道「我能发、你能收、你也能发」。 第三次:客户端回 ACK,确认 ack=y+1。此时服务端也确认了「我能发、你能收」。连接建立。 二、为什么不是两次
如果只有两次,服务端发出 SYN+ACK 后就认为连接建立了。但网络里存在「早已失效的重复连接请求」——一个很久以前发出的 SYN 延迟送达,服务端会为它建立一个永远不会被使用的连接,白白占用资源。第三次握手让客户端有机会拒绝这种历史请求。 三、四次挥手 关闭连接要四次,因为 TCP 是全双工的:一方不再发数据,不代表另一方也不发了。 第一次:主动方发 FIN,表示「我没数据要发了」。 第二次:被动方回 ACK。此时连接进入半关闭状态,被动方还可以继续发数据。 第三次:被动方数据也发完了,发 FIN。 第四次:主动方回 ACK,并在等待 2MSL 后真正关闭。 四、为什么要等 2MSL