TCP三次握手 | 豆包MarsCode AI 刷题

41 阅读4分钟

TCP简介

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流传输层通信协议,由IETF(Internet Engineering Task Force,互联网工程任务组)的RFC 793定义。TCP在网络通信中扮演着至关重要的角色,确保数据能够在IP网络中可靠地传输。由于TCP是面向连接的协议,因此每个TCP连接都有三个阶段:连接建立数据传送连接释放

  • TCP在连接建立过程需要解决三个问题:
    • 1)要使每一方都能够确认对方的存在。
    • 2)要允许双方协商一些参数(如最大窗口值、是否使用窗口扩大选项、时间戳选项及服务质量等)。
    • 3)能够对运输实体资源(如缓存大小、连接表中的项目等)进行分配。
  • TCP把链接作为最基本的对象,每条TCP链接有两个端点。
  • TCP连接建立采用客服/服务器模式。主动发起连接建立的应用进程称为客服(Client),而被动等待连接建立的应用进程称为服务器(Sever)。

TCP三次握手

TCP连接建立经历三个步骤,称为三次握手。TCP三次握手(Three-way Handshake)是TCP/IP协议中建立一个可靠连接的过程。这个过程确保了两个设备在开始通信之前都能够发送和接收数据。以下是三次握手的具体步骤:

  1. 第一次握手(SYN)

    • 客户端选择一个初始序列号(ISN),并将此序列号放入SYN标志的数据包中。
    • 客户端将SYN包发送给服务器,请求建立连接。
    • 客户端进入SYN-SENT状态,等待服务器的确认。
  2. 第二次握手(SYN-ACK)

    • 服务器收到SYN包后,如果同意建立连接,也会选择一个初始序列号。
    • 服务器将客户端的序列号加1(作为确认号),并将自己的序列号放入SYN-ACK标志的数据包中,发送回客户端。
    • 服务器进入SYN-RECEIVED状态。
  3. 第三次握手(ACK)

    • 客户端收到服务器的SYN-ACK包后,会发送一个ACK包作为响应,确认服务器的SYN序列号。
    • 客户端将服务器的序列号加1(作为确认号)放入ACK标志的数据包中。
    • 服务器收到ACK包后,连接建立成功,双方可以开始数据传输。
    • 客户端和服务器都进入ESTABLISHED状态。

在完成这三个步骤后,TCP连接就建立起来了,客户端和服务器可以开始传输数据。这个过程确保了双方都准备好发送和接收数据,并且能够跟踪数据包的顺序和完整性。

为什么需要三次握手?

  1. 防止失效的连接请求

    • 防止客户端发送的连接请求在网络中滞留,导致客户端重复发送请求,从而产生错误。
  2. 确保双方的接收和发送能力

    • 第一次握手确认了客户端到服务器的通道是开放的。
    • 第二次握手确认了服务器到客户端的通道是开放的。
    • 第三次握手确认了客户端接收到了服务器的同步请求,确保了双方都准备好了。
  3. 数据同步

    • 通过交换初始序列号,双方可以同步数据,确保数据传输的顺序和完整性。

TCP连接建立前和三次握手过程中的状态

以下是TCP连接建立前和三次握手过程中涉及的一些关键状态:

  1. CLOSED:这是初始状态,表示没有活动连接。在三次握手开始之前,客户端和服务器的TCP连接都处于CLOSED状态。
  2. LISTEN:服务器在准备接受连接请求时,会进入LISTEN状态。在这个阶段,服务器准备好接受客户端的连接请求,但还没有收到任何请求。
  3. SYN-SENT:客户端发送SYN包给服务器后,会进入SYN-SENT状态。这表示客户端已经发送了同步序列编号,正在等待服务器的确认。
  4. SYN-RECEIVED:服务器收到客户端的SYN包并发送SYN-ACK包后,会进入SYN-RECEIVED状态。这表示服务器已经收到了客户端的同步请求,并发送了同步和确认,正在等待客户端的最终确认。
  5. ESTABLISHED:客户端发送ACK包给服务器,服务器收到这个ACK包后,双方都进入ESTABLISHED状态。这表示TCP连接已经建立,可以开始数据传输。

总结

三次握手是TCP连接建立过程中的一个关键步骤,它为可靠的数据传输提供了基础。 在三次握手过程中,客户端和服务器的状态会从CLOSED或LISTEN状态开始,经历SYN-SENT、SYN-RECEIVED,最后到达ESTABLISHED状态。这个过程确保了双方都准备好进行数据交换。