【学习记录】TCP 的三次握手和四次挥手

195 阅读5分钟

TCP 的三次握手和四次挥手

TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。为了建立和终止连接,TCP 使用“三次握手”和“四次挥手”机制。以下是详细描述:

1. TCP 的三次握手

三次握手是 TCP 建立连接的过程,确保客户端和服务器双方都能正常发送和接收数据。

1.1 三次握手的步骤

  1. 第一次握手(SYN)
    • 客户端向服务器发送一个 SYN(同步)报文,表示请求建立连接。
    • 报文中包含:
      • SYN 标志位:设置为 1。
      • 序列号(Seq):客户端随机生成一个初始序列号(如 Seq = x)。
    • 客户端进入 SYN_SENT 状态。
  2. 第二次握手(SYN + ACK)
    • 服务器收到客户端的 SYN 报文后,向客户端发送一个 SYN + ACK(同步 + 确认)报文,表示同意建立连接。
    • 报文中包含:
      • SYN 标志位:设置为 1。
      • ACK 标志位:设置为 1。
      • 序列号(Seq):服务器随机生成一个初始序列号(如 Seq = y)。
      • 确认号(Ack)Ack = x + 1,表示期望收到客户端的下一个数据包的序列号。
    • 服务器进入 SYN_RECEIVED 状态。
  3. 第三次握手(ACK)
    • 客户端收到服务器的 SYN + ACK 报文后,向服务器发送一个 ACK(确认)报文,表示连接已建立。
    • 报文中包含:
      • ACK 标志位:设置为 1。
      • 序列号(Seq)Seq = x + 1
      • 确认号(Ack)Ack = y + 1,表示期望收到服务器的下一个数据包的序列号。
    • 客户端和服务器都进入 ESTABLISHED 状态,连接建立成功。

1.2 三次握手的作用

  • 确认双方的发送和接收能力:
    • 客户端确认服务器能正常接收数据(通过第二次握手)。
    • 服务器确认客户端能正常接收数据(通过第三次握手)。
  • 同步初始序列号:
    • 双方交换初始序列号,用于后续数据传输的可靠性保证。
  • 防止历史连接的干扰:
    • 通过三次握手,可以避免因网络延迟导致的旧连接请求干扰新连接。

2. TCP 的四次挥手

四次挥手是 TCP 终止连接的过程,确保客户端和服务器双方都能正常关闭连接。

2.1 四次挥手的步骤

  1. 第一次挥手(FIN)
    • 客户端向服务器发送一个 FIN(结束)报文,表示客户端没有数据要发送了,请求关闭连接。
    • 报文中包含:
      • FIN 标志位:设置为 1。
      • 序列号(Seq)Seq = u(u 是客户端最后发送的数据的序列号 + 1)。
    • 客户端进入 FIN_WAIT_1 状态。
  2. 第二次挥手(ACK)
    • 服务器收到客户端的 FIN 报文后,向客户端发送一个 ACK(确认)报文,表示已收到关闭请求。
    • 报文中包含:
      • ACK 标志位:设置为 1。
      • 确认号(Ack)Ack = u + 1,表示期望收到客户端的下一个数据包的序列号。
    • 服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
  3. 第三次挥手(FIN)
    • 服务器完成数据发送后,向客户端发送一个 FIN 报文,表示服务器也没有数据要发送了,请求关闭连接。
    • 报文中包含:
      • FIN 标志位:设置为 1。
      • 序列号(Seq)Seq = w(w 是服务器最后发送的数据的序列号 + 1)。
    • 服务器进入 LAST_ACK 状态。
  4. 第四次挥手(ACK)
    • 客户端收到服务器的 FIN 报文后,向服务器发送一个 ACK 报文,表示已收到关闭请求。
    • 报文中包含:
      • ACK 标志位:设置为 1。
      • 确认号(Ack)Ack = w + 1,表示期望收到服务器的下一个数据包的序列号。
    • 客户端进入 TIME_WAIT 状态,等待 2MSL(最大报文段生存时间)后关闭连接。
    • 服务器收到 ACK 报文后,立即关闭连接。

2.2 四次挥手的作用

  • 确保数据完整性:
    • 通过四次挥手,确保双方都完成了数据的发送和接收。
  • 防止数据丢失:
    • 客户端在 TIME_WAIT 状态等待 2MSL,确保服务器收到了最后的 ACK 报文。
    • 如果服务器未收到 ACK 报文,会重发 FIN 报文,客户端可以再次确认。
  • 优雅关闭连接:
    • 双方都有机会发送未完成的数据,并确认对方已收到关闭请求。

3. 三次握手和四次挥手的对比

特性三次握手四次挥手
目的建立连接终止连接
步骤SYN → SYN + ACK → ACKFIN → ACK → FIN → ACK
状态变化SYN_SENT → SYN_RECEIVED → ESTABLISHEDFIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT
数据完整性确保双方能正常发送和接收数据确保双方完成数据发送和接收
时间消耗较短较长(尤其是 TIME_WAIT 状态)

4. 常见问题

4.1 为什么需要三次握手?

  • 两次握手无法确认客户端的接收能力,可能导致服务器浪费资源。
  • 三次握手可以避免因网络延迟导致的旧连接请求干扰新连接。

4.2 为什么需要四次挥手?

  • 因为 TCP 是全双工协议,双方需要分别关闭发送和接收通道。
  • 服务器可能还有未发送完的数据,需要先发送 FIN 报文。

4.3 TIME_WAIT 状态的作用是什么?

  • 确保服务器收到最后的 ACK 报文。
  • 防止旧连接的报文干扰新连接。

5. 总结

  • 三次握手用于建立连接,确保双方能正常通信。
  • 四次挥手用于终止连接,确保双方完成数据发送和接收。
  • TCP 的连接管理机制保证了数据传输的可靠性和完整性。