当你浏览网页或视频通话时,计算机之间如何建立连接?这一切的秘密藏在TCP协议的三次握手和四次挥手中——它们是网络世界的握手礼与告别仪。
三次握手:建立连接的信任之桥
客户端 服务器| || SYN(序列号=X) || -----------------------------> || || SYN-ACK(序列号=Y, 确认号=X+1)|| <----------------------------- || || ACK(确认号=Y+1) || -----------------------------> || |
【连接建立成功】
关键步骤解析:
- 第一次握手:客户端发出同步请求(SYN包),带上随机序列号X
- 第二次握手:服务器同意连接(SYN-ACK包),返回序列号Y,并确认收到X
- 第三次握手:客户端确认收到响应(ACK包),完成连接建立
设计精妙:三次握手解决了历史连接问题。当延迟的旧SYN包到达服务器,客户端通过新序列号比对可识别并拒绝无效连接,从而维护可靠性。
四次挥手:优雅断开连接的艺术
客户端 服务器| || FIN(结束请求) || -----------------------------> || || ACK || <----------------------------- || || ... || [等待服务器关闭] || || FIN || <----------------------------- || || ACK || -----------------------------> || |
【连接完全断开】
挥手过程揭秘:
- 主动方发送FIN包申请关闭
- 被动方立即回应ACK确认收到(进入半关闭状态)
- 被动方完成数据发送后发出FIN包
- 主动方确认后关闭连接(需等待2MSL防止丢包)
技术难点:为何需要四次挥手?因为TCP是全双工通道,必须双向独立关闭。被动方在收到FIN后可能仍需传输数据,需要额外两次交互确认最终关闭。
TCP设计哲学:可靠性的代价
这种“繁琐”机制源于TCP的核心目标:在不可靠的IP协议上实现可靠传输。三次握手规避网络延迟造成误连接,四次挥手处理半关闭状态数据,而TIME_WAIT状态(主动方最后等待2倍报文寿命周期)确保网络中所有残留数据包彻底消亡。