TCP三次握手建立链接与四次挥手断开链接的示例分析
TCP连接建立与断开过程分析
TCP三次握手建立连接
示例过程:
第一次握手 (SYN=1, seq=x)
- 客户端发送SYN报文,序列号设为随机值x (假设x=1000)
- 客户端进入SYN_SENT状态
第二次握手 (SYN=1, ACK=1, seq=y, ack=x+1)
- 服务端收到SYN报文后,发送SYN+ACK报文
- 序列号设为随机值y (假设y=2000),确认号为x+1(1001)
- 服务端进入SYN_RCVD状态
第三次握手 (ACK=1, seq=x+1, ack=y+1)
- 客户端收到SYN+ACK后,发送ACK报文
- 序列号设为x+1(1001),确认号为y+1(2001)
- 双方进入ESTABLISHED状态
为什么需要三次握手:
- 防止历史重复连接初始化导致的资源浪费
- 同步双方的初始序列号
- 避免资源浪费(防止服务端一直等待无效连接)
TCP四次挥手断开连接
示例过程:
第一次挥手 (FIN=1, seq=u)
- 客户端发送FIN报文,序列号为u(假设u=5000)
- 客户端进入FIN_WAIT_1状态
第二次挥手 (ACK=1, ack=u+1)
- 服务端收到FIN后,发送ACK报文,确认号为u+1(5001)
- 服务端进入CLOSE_WAIT状态
- 客户端收到ACK后进入FIN_WAIT_2状态
第三次挥手 (FIN=1, seq=v, ACK=1, ack=u+1)
- 服务端完成数据发送后,发送FIN+ACK报文
- 序列号为v(假设v=7000),确认号仍为u+1(5001)
- 服务端进入LAST_ACK状态
第四次挥手 (ACK=1, seq=u+1, ack=v+1)
- 客户端收到FIN后,发送ACK报文
- 序列号为u+1(5001),确认号为v+1(7001)
- 客户端进入TIME_WAIT状态(等待2MSL)
- 服务端收到ACK后关闭连接
为什么需要四次挥手:
- TCP是全双工协议,需要分别关闭两个方向的连接
- 服务端可能还有数据需要发送,不能立即关闭
- TIME_WAIT状态确保最后一个ACK能到达对端
常见问题分析
握手阶段丢包:
- 第一次SYN丢失:客户端超时重传
- 第二次SYN+ACK丢失:服务端超时重传
- 第三次ACK丢失:服务端超时重传SYN+ACK
挥手阶段异常:
- FIN_WAIT_2状态长时间存在:对端未发送FIN
- 大量TIME_WAIT连接:短连接过多,可调整内核参数
连接重置(RST):
- 当一方收到不期望的报文时会发送RST
- 可用于快速释放异常连接
理解TCP连接建立和断开的过程对于网络问题排查和性能优化至关重要,特别是在高并发场景下。