TCP/IP 三次握手是建立可靠的网络连接的过程,确保通信双方能够成功进行数据传输。它是基于 TCP(传输控制协议) 的连接机制,在客户端和服务器之间创建可靠的、双向通信的通道。
为什么需要三次握手?
- TCP是一个面向连接的协议,保证数据在传输过程中不丢失且顺序正确。在传输数据之前,通信双方需要确认彼此的接收能力和发送能力,并同步初始序列号,确保后续数据的传输能够可靠且有序进行。
三次握手的过程

第一次握手:客户端发送 SYN 请求
目的:客户端尝试与服务器建立连接,发送 SYN(Synchronize Sequence Number) 请求,告诉服务器“我想要与你建立连接”。
操作:
客户端生成一个 初始序列号(ISN, Initial Sequence Number),标识即将发送的数据包序列。
SYN 包中包含该序列号。
状态变化:
客户端进入 SYN-SENT 状态,等待服务器回应。
第二次握手:服务器发送 SYN-ACK
目的:服务器收到客户端的 SYN 请求后,同意建立连接,向客户端发送 SYN-ACK 数据包,确认收到请求并愿意开始通信。
操作:
服务器生成自己的 初始序列号,同时确认收到客户端的 SYN(即 ACK 客户端的序列号 + 1,表示已经接收)。
发送一个包含 SYN 和 ACK 标志的数据包,表示服务器同意建立连接,并向客户端回应。
状态变化:
服务器进入 SYN-RECEIVED 状态,等待客户端确认。
第三次握手:客户端发送 ACK 确认
目的:客户端收到服务器的 SYN-ACK 后,确认连接请求有效,发送 ACK(Acknowledgment) 确认数据包,告诉服务器已经收到其回应,连接可以正式建立。
操作:
客户端将服务器的序列号加1,作为ACK的确认号,表示收到服务器的SYN。
发送 ACK 包,确认建立连接。
状态变化:
客户端进入 ESTABLISHED(连接建立)状态,服务器收到 ACK 后也进入 ESTABLISHED 状态,双方连接建立完成。
为什么是三次握手?
第一次握手:客户端通过 SYN 包通知服务器自己想建立连接。
第二次握手:服务器回应 SYN-ACK,确认收到了客户端的请求,并附带自己的初始序列号。这个过程确保服务器知道客户端的存在。
第三次握手:客户端确认服务器的回应有效,发送 ACK 确认包。至此,客户端和服务器的初始序列号都得到了确认,连接正式建立。
举例说明三次握手
可以把三次握手想象成一个电话交谈的开头:
第一次握手(客户端呼叫):你拨打了一个电话,听到电话响(发送 SYN),等待对方接听。
第二次握手(服务器回应):对方接听并说:“你好,听得到吗?”(发送 SYN-ACK,表示接收请求,并希望确认你能听到)。
第三次握手(客户端确认):你回应:“听到了,现在可以开始说话了。”(发送 ACK,确认对方的消息并准备进行正式通信)。
TCP三次握手的目的
可靠连接:通过三次握手,通信双方明确知道彼此的存在,并且可以开始发送和接收数据。
同步序列号:三次握手的过程中,双方交换初始序列号,确保后续数据传输的有序性和可靠性。
可能的问题
半连接状态:如果客户端发送 SYN 请求,但服务器没有收到 ACK 确认,则服务器会保持在半连接状态,等待客户端的响应。为防止这种情况,服务器通常会设置一个超时机制,等待一定时间后关闭该连接。
通过三次握手,TCP确保了通信的可靠性和双向确认,避免了数据包的丢失或乱序问题。