HTTP-TCP协议和三次握手四次挥手

67 阅读4分钟

什么是 TCP?

TCP(Transmission Control Protocol,传输控制协议) 是一种面向连接的可靠的、基于字节流传输层协议。它是互联网协议套件(TCP/IP)的核心协议之一,广泛应用于需要可靠数据传输的场景(如网页浏览、文件传输、电子邮件等)。

TCP 的特点:

  1. 面向连接:通信前需要建立连接(三次握手),通信结束后需要断开连接(四次挥手)。
  2. 可靠性:通过确认机制、重传机制、校验和等确保数据可靠传输。
  3. 有序性:数据按发送顺序到达接收端。
  4. 流量控制:通过滑动窗口机制控制发送方的发送速率。
  5. 拥塞控制:通过拥塞窗口机制避免网络拥塞。

TCP 的三次握手

三次握手(Three-way Handshake) 是指 TCP 建立连接时,确保客户端和服务器双方都能正常发送和接收数据。

三次握手的过程:

  1. 第一次握手(SYN)

    • 客户端向服务器发送一个 SYN 报文(SYN=1,seq=x),并指明客户端的初始化序列号,表示请求建立连接
    • 客户端进入 SYN_SENT 状态。
    • 服务器确认了客户端发送能力和服务器端接收能力。
  2. 第二次握手(SYN + ACK)

    • 服务器收到 SYN 报文后,向客户端发送一个 SYN + ACK 报文(SYN=1,ACK=1,seq=y,ack=x+1),表示同意建立连接
    • 服务器进入 SYN_RECEIVED 状态。
    • 客户端确认了双方发送和接收能力,服务器无法确认客户端接收能力。
  3. 第三次握手(ACK)

    • 客户端收到 SYN + ACK 报文后,向服务器发送一个 ACK 报文(ACK=1,seq=x+1,ack=y+1),表示确认连接已建立
    • 客户端和服务器都进入 ESTABLISHED 状态,连接建立成功。
    • 服务器确认了客户端接收能力。

三次握手的作用:

  • 确认双方的发送和接收能力:通过三次握手,客户端和服务器都能确认对方的发送和接收能力正常。
  • 确保数据有序传输:通过交换初始序列号(seq),确保数据有序传输。

TCP 的四次挥手

四次挥手(Four-way Handshake) 是 TCP 断开连接的过程,确保客户端和服务器双方都能正常关闭连接。

四次挥手的过程:

  1. 第一次挥手(FIN)

    • 客户端向服务器发送一个 FIN 报文(FIN=1,seq=u),表示请求关闭连接
    • 客户端进入 FIN_WAIT_1 状态。
  2. 第二次挥手(ACK)

    • 服务器收到 FIN 报文后,向客户端发送一个 ACK 报文(ACK=1,seq=v,ack=u+1),表示确认收到关闭请求
    • 服务器进入 CLOSE_WAIT 状态,客户端进入 FIN_WAIT_2 状态。
  3. 第三次挥手(FIN)

    • 服务器完成数据发送后,向客户端发送一个 FIN 报文(FIN=1,seq=w,ack=u+1),表示请求关闭连接
    • 服务器进入 LAST_ACK 状态。
  4. 第四次挥手(ACK)

    • 客户端收到 FIN 报文后,向服务器发送一个 ACK 报文(ACK=1,seq=u+1,ack=w+1),表示确认收到关闭请求
    • 客户端进入 TIME_WAIT 状态,等待 2MSL(Maximum Segment Lifetime)后关闭连接。
    • 服务器收到 ACK 报文后,立即关闭连接。

四次挥手的作用:

  • 确保数据完整传输:通过四次挥手,确保双方都能完成数据的发送和接收。
  • 防止旧连接的报文干扰:通过 TIME_WAIT 状态,防止旧连接的报文干扰新连接。

为什么需要三次握手和四次挥手?

三次握手的原因:

  • 确认双方的发送和接收能力:通过两次握手,客户端能确认双方的发送和接收能力正常,服务器端无法确认客户端的接收能力是否正常。
  • 防止旧的重复连接初始化造成混乱:如果客户端发送的 SYN 报文因网络延迟而重复到达服务器,服务器可以通过三次握手确认连接的时效性。
  • 同步初始序列号,确保数据有序传输:通过三次握手,双方可以同步初始序列号,确保数据有序传输。

四次挥手的原因:

  • 确保数据完整传输:服务器可能还有未发送完的数据,需要先发送 ACK 确认关闭请求,再发送 FIN 报文请求关闭连接。
  • 防止旧连接的报文干扰:通过 TIME_WAIT 状态,防止旧连接的报文干扰新连接。

TCP 的状态转换

建立连接时的状态转换:

  1. 客户端:CLOSED -> SYN_SENT -> ESTABLISHED
  2. 服务器:CLOSED -> LISTEN -> SYN_RECEIVED -> ESTABLISHED

释放连接时的状态转换:

  1. 客户端:ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED
  2. 服务器:ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

总结

  • TCP 是一种可靠的、面向连接的传输层协议。
  • 三次握手:用于建立连接,确保双方的发送和接收能力正常。
  • 四次挥手:用于断开连接,确保数据完整传输并防止旧连接的报文干扰。
  • 三次握手和四次挥手的作用:确保连接的可靠性和数据的完整性。