插件窝 干货文章 TCP三次握手建立链接与四次挥手断开链接的示例分析

TCP三次握手建立链接与四次挥手断开链接的示例分析

报文 ACK 连接 发送 445    来源:    2025-04-27

TCP连接建立与断开过程分析

TCP三次握手建立连接

示例过程

  1. 第一次握手 (SYN=1, seq=x)

    • 客户端发送SYN报文,序列号设为随机值x (假设x=1000)
    • 客户端进入SYN_SENT状态
  2. 第二次握手 (SYN=1, ACK=1, seq=y, ack=x+1)

    • 服务端收到SYN报文后,发送SYN+ACK报文
    • 序列号设为随机值y (假设y=2000),确认号为x+1(1001)
    • 服务端进入SYN_RCVD状态
  3. 第三次握手 (ACK=1, seq=x+1, ack=y+1)

    • 客户端收到SYN+ACK后,发送ACK报文
    • 序列号设为x+1(1001),确认号为y+1(2001)
    • 双方进入ESTABLISHED状态

为什么需要三次握手: - 防止历史重复连接初始化导致的资源浪费 - 同步双方的初始序列号 - 避免资源浪费(防止服务端一直等待无效连接)

TCP四次挥手断开连接

示例过程

  1. 第一次挥手 (FIN=1, seq=u)

    • 客户端发送FIN报文,序列号为u(假设u=5000)
    • 客户端进入FIN_WAIT_1状态
  2. 第二次挥手 (ACK=1, ack=u+1)

    • 服务端收到FIN后,发送ACK报文,确认号为u+1(5001)
    • 服务端进入CLOSE_WAIT状态
    • 客户端收到ACK后进入FIN_WAIT_2状态
  3. 第三次挥手 (FIN=1, seq=v, ACK=1, ack=u+1)

    • 服务端完成数据发送后,发送FIN+ACK报文
    • 序列号为v(假设v=7000),确认号仍为u+1(5001)
    • 服务端进入LAST_ACK状态
  4. 第四次挥手 (ACK=1, seq=u+1, ack=v+1)

    • 客户端收到FIN后,发送ACK报文
    • 序列号为u+1(5001),确认号为v+1(7001)
    • 客户端进入TIME_WAIT状态(等待2MSL)
    • 服务端收到ACK后关闭连接

为什么需要四次挥手: - TCP是全双工协议,需要分别关闭两个方向的连接 - 服务端可能还有数据需要发送,不能立即关闭 - TIME_WAIT状态确保最后一个ACK能到达对端

常见问题分析

  1. 握手阶段丢包

    • 第一次SYN丢失:客户端超时重传
    • 第二次SYN+ACK丢失:服务端超时重传
    • 第三次ACK丢失:服务端超时重传SYN+ACK
  2. 挥手阶段异常

    • FIN_WAIT_2状态长时间存在:对端未发送FIN
    • 大量TIME_WAIT连接:短连接过多,可调整内核参数
  3. 连接重置(RST)

    • 当一方收到不期望的报文时会发送RST
    • 可用于快速释放异常连接

理解TCP连接建立和断开的过程对于网络问题排查和性能优化至关重要,特别是在高并发场景下。