TCP三次握手四次挥手

55 阅读4分钟

一、三次握手(Three-Way Handshake)

目的:建立 TCP 连接,同步初始序列号(ISN),协商窗口大小等参数。

1. 详细流程
客户端                      服务器  
  |                          |  
  |--- SYN(seq=x) -------->|  // 客户端向服务器发送 SYN 包(请求建立连接)  
  |                          |  
  |<-- SYN+ACK(seq=y, ack=x+1)---|  // 服务器响应 SYN+ACK 包(同意建立连接)  
  |                          |  
  |--- ACK(seq=x+1, ack=y+1) -->|  // 客户端确认,发送 ACK 包(连接建立完成)  
2. 关键点
  • SYN 包:客户端随机生成初始序列号 x,标志位 SYN=1
  • SYN+ACK 包:服务器生成自己的初始序列号 y,并确认客户端的序列号(ack=x+1);
  • ACK 包:客户端确认服务器的序列号(ack=y+1),此时双方序列号偏移量均为 1。
3. 为什么需要三次握手?两次不行吗?
  • 防止历史连接:若客户端发送的 SYN 包因网络延迟滞留,后续新连接建立后,旧 SYN 到达服务器会被识别为无效(序列号不匹配);
  • 同步初始序列号:双方需交换各自的初始序列号,确保后续数据按序传输;
  • 可靠性验证:三次握手可验证双方发送和接收能力是否正常(客户端→服务器、服务器→客户端、客户端→服务器)。

二、四次挥手(Four-Way Handshake)

目的:关闭 TCP 连接,确保双方数据传输完毕。

1. 详细流程
客户端                      服务器  
  |                          |  
  |--- FIN(seq=u) -------->|  // 客户端请求关闭连接(发送 FIN 包)  
  |                          |  
  |<-- ACK(seq=v, ack=u+1)---|  // 服务器确认收到 FIN(进入 CLOSE_WAIT 状态)  
  |                          |  
  |<-- FIN(seq=w, ack=u+1)---|  // 服务器发送 FIN 包(请求关闭连接)  
  |                          |  
  |--- ACK(seq=u+1, ack=w+1) -->|  // 客户端确认 FIN(进入 TIME_WAIT 状态)  
2. 关键点
  • FIN 包:表示请求关闭连接,发送方数据已发送完毕;
  • CLOSE_WAIT 状态:服务器收到 FIN 后进入此状态,需等待上层应用确认关闭;
  • TIME_WAIT 状态:客户端发送最后 ACK 后进入此状态,持续 2MSL(最大段生存时间),确保服务器收到 ACK(若服务器未收到会重发 FIN)。
3. 为什么需要四次挥手?
  • 半关闭机制:TCP 连接是全双工的,需分别关闭发送和接收通道;
  • FIN 与 ACK 分离:服务器收到客户端 FIN 后,可能仍有数据需发送,因此先 ACK 确认,再单独发送 FIN。

三、状态转换图(高频考点)

1. 三次握手状态变化
客户端:CLOSED → SYN_SENT → ESTABLISHED  
服务器:CLOSED → LISTEN → SYN_RCVD → ESTABLISHED  
2. 四次挥手状态变化
客户端:ESTABLISHED → FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED  
服务器:ESTABLISHED → CLOSE_WAIT → LAST_ACK → CLOSED  
3. TIME_WAIT 状态的作用
  • 确保最后一个 ACK 包被服务器收到(若丢失,服务器会重发 FIN);
  • 等待足够时间,让本次连接的所有数据包在网络中消失,防止干扰新连接。

四、问题

1. 问:为什么 TIME_WAIT 状态需要持续 2MSL?

  • MSL(Maximum Segment Lifetime)是数据包在网络中的最大生存时间;
  • 2MSL 确保:
    1. 本次连接的所有数据包都已过期(若服务器重发 FIN,客户端可响应);
    2. 新连接不会收到旧连接的残留数据包。
2. 问:TCP 连接建立后,客户端突然崩溃,服务器如何处理?

  • 服务器通过 TCP 保活机制(Keep-Alive) 检测连接状态:
    1. 若长时间无数据传输,服务器发送探测包;
    2. 若多次探测无响应,服务器关闭连接。
3. 问:SYN 洪泛攻击(SYN Flood)如何发生?如何防御?

  • 攻击原理:攻击者伪造大量 SYN 包,服务器响应 SYN+ACK 后无法收到 ACK,导致半连接队列占满,拒绝正常请求;
  • 防御措施
    • 增大半连接队列长度;
    • 启用 SYN Cookie(不缓存 SYN 状态,用算法生成 ACK 序列号);
    • 限速过滤异常流量。

五、总结

三次握手:客户端发 SYN,服务器回 SYN+ACK,客户端再发 ACK;
四次挥手:客户端发 FIN,服务器 ACK,服务器发 FIN,客户端 ACK;
TIME_WAIT 等 2MSL,保活机制防崩溃,SYN Cookie 抗攻击。