一、TCP 三次握手:建立连接
三次握手的核心目的是确认双方的发送和接收能力都正常,并同步初始序列号,为后续数据传输做准备。
第一次握手(客户端 → 服务器)客户端发送连接请求报文,包含SYN 标志位(同步请求)和随机初始序列号(seq=x)。此时客户端进入 SYN_SENT 状态。
第二次握手(服务器 → 客户端)服务器收到请求后,回复确认报文。该报文包含SYN 标志位(同意同步)、ACK 标志位(确认收到)、确认号(ack=x+1)和服务器的随机初始序列号(seq=y)。此时服务器进入 SYN_RCVD 状态。
第三次握手(客户端 → 服务器)客户端收到服务器的回复后,再次发送确认报文,包含ACK 标志位和确认号(ack=y+1)。此时客户端和服务器均进入 ESTABLISHED 状态,连接正式建立。
二、TCP 四次挥手:关闭连接
四次挥手的核心目的是确保双方都已完成数据传输,且所有数据都已被接收,避免数据丢失。
第一次挥手(客户端 → 服务器)客户端完成数据发送后,发送连接释放报文,包含FIN 标志位(请求关闭)和序列号(seq=u)。此时客户端进入 FIN_WAIT_1 状态,不再发送数据,但仍可接收数据。
第二次挥手(服务器 → 客户端)服务器收到 FIN 后,回复确认报文,包含ACK 标志位和确认号(ack=u+1)。此时服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态,客户端仍可接收服务器剩余的数据。
第三次挥手(服务器 → 客户端)服务器完成所有数据发送后,也发送连接释放报文,包含FIN 标志位和ACK 标志位,以及序列号(seq=v)和确认号(ack=u+1)。此时服务器进入 LAST_ACK 状态。
第四次挥手(客户端 → 服务器)客户端收到 FIN 后,回复确认报文,包含ACK 标志位和确认号(ack=v+1)。此时客户端进入 TIME_WAIT 状态(等待 2MSL 时间,确保服务器收到确认),服务器收到后进入 CLOSED 状态。客户端等待结束后,也进入 CLOSED 状态,连接正式关闭。