在HTTP协议中,“三次握手”和“四次挥手”本质是 TCP协议的连接与断开机制(HTTP基于TCP传输层协议实现可靠通信,自身不涉及握手/挥手),核心是确保通信双方“能发、能收”,避免数据丢失或连接混乱。
一、三次握手:建立可靠TCP连接(像“打电话确认”)
目的是确认客户端和服务器的 发送能力、接收能力均正常,同步双方的通信序号,为后续数据传输铺路。
过程拆解(通俗版):
1. 第一次(客户端→服务器):“喂,能听到吗?”
客户端向服务器发送 SYN 包(同步请求),请求建立连接,同时告知服务器自己的“初始序号”。
2. 第二次(服务器→客户端):“能听到,你那边能听到我吗?”
服务器收到后,回复 SYN+ACK 包(同步+确认):
- 用 ACK 确认“已收到你的请求”;
- 用 SYN 告知客户端自己的“初始序号”,同时确认自己的发送能力正常。
3. 第三次(客户端→服务器):“能听到,开始聊吧!”
客户端收到回复后,发送 ACK 包(最终确认):告知服务器“已收到你的序号,连接可以正式建立”。
✅ 为什么是3次?
少1次会导致服务器无法确认“客户端能收到自己的消息”(比如服务器发了回复,但客户端没收到,服务器会一直等);多1次则冗余,浪费资源。
二、四次挥手:断开TCP连接(像“挂电话告别”)
目的是确保双方 已传输完所有数据,避免断连时丢失未发送/接收的内容。
过程拆解(通俗版):
1. 第一次(客户端→服务器):“我这边数据发完了,准备断开。”
客户端发送 FIN 包(结束请求),表示自己不再发送数据,但仍能接收服务器的后续数据。
2. 第二次(服务器→客户端):“好的,我知道了,等我把剩下的数据发完。”
服务器收到后,回复 ACK 包(确认收到断开请求),此时服务器可能还在处理未发送完的数据,连接处于“半关闭”状态(客户端不发、服务器仍可发)。
3. 第三次(服务器→客户端):“我这边数据也发完了,准备断开。”
服务器处理完所有数据后,发送 FIN+ACK 包(结束+确认),表示自己也不再发送数据。
4. 第四次(客户端→服务器):“好的,收到,断开吧!”
客户端收到后,发送 ACK 包(最终确认),服务器收到后立即断开连接;客户端会等待一段时间(确保服务器收到确认),再彻底断开。
✅ 为什么是4次?
因为“断开发送能力”和“确认接收能力”是两个独立步骤:服务器收到客户端的断开请求后,不能立刻回复 FIN (可能还有数据没发完),必须先回 ACK 确认“已知晓”,等数据发完再发 FIN ,所以需要多1次交互。
核心区别总结
场景 目的 次数 关键特点
三次握手 建立可靠连接 3次 同步序号、确认双方收发能力
四次挥手 安全断开连接 4次 分两步确认“发送完毕”,避免数据丢失
简单记:连接要“双向确认就绪”(3次),断开要“双向确认收尾”(4次),都是为了保证TCP通信的“可靠性”。