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协议中建立一个可靠连接的过程。这个过程确保了两个设备在开始通信之前都能够发送和接收数据。以下是三次握手的具体步骤:
-
第一次握手(SYN) :
- 客户端选择一个
初始序列号(ISN),并将此序列号放入SYN标志的数据包中。 - 客户端将
SYN包发送给服务器,请求建立连接。 - 客户端进入
SYN-SENT状态,等待服务器的确认。
- 客户端选择一个
-
第二次握手(SYN-ACK) :
- 服务器收到
SYN包后,如果同意建立连接,也会选择一个初始序列号。 - 服务器将客户端的
序列号加1(作为确认号),并将自己的序列号放入SYN-ACK标志的数据包中,发送回客户端。 - 服务器进入
SYN-RECEIVED状态。
- 服务器收到
-
第三次握手(ACK) :
- 客户端收到服务器的
SYN-ACK包后,会发送一个ACK包作为响应,确认服务器的SYN序列号。 - 客户端将服务器的序列号
加1(作为确认号)放入ACK标志的数据包中。 - 服务器收到
ACK包后,连接建立成功,双方可以开始数据传输。 - 客户端和服务器都进入
ESTABLISHED状态。
- 客户端收到服务器的
在完成这三个步骤后,TCP连接就建立起来了,客户端和服务器可以开始传输数据。这个过程确保了双方都准备好发送和接收数据,并且能够跟踪数据包的顺序和完整性。
为什么需要三次握手?
-
防止失效的连接请求:
- 防止客户端发送的连接请求在网络中滞留,导致客户端重复发送请求,从而产生错误。
-
确保双方的接收和发送能力:
- 第一次握手确认了客户端到服务器的通道是开放的。
- 第二次握手确认了服务器到客户端的通道是开放的。
- 第三次握手确认了客户端接收到了服务器的同步请求,确保了双方都准备好了。
-
数据同步:
- 通过交换初始序列号,双方可以同步数据,确保数据传输的顺序和完整性。
TCP连接建立前和三次握手过程中的状态
以下是TCP连接建立前和三次握手过程中涉及的一些关键状态:
- CLOSED:这是初始状态,表示没有活动连接。在三次握手开始之前,客户端和服务器的TCP连接都处于CLOSED状态。
- LISTEN:服务器在准备接受连接请求时,会进入LISTEN状态。在这个阶段,服务器准备好接受客户端的连接请求,但还没有收到任何请求。
- SYN-SENT:客户端发送SYN包给服务器后,会进入SYN-SENT状态。这表示客户端已经发送了同步序列编号,正在等待服务器的确认。
- SYN-RECEIVED:服务器收到客户端的SYN包并发送SYN-ACK包后,会进入SYN-RECEIVED状态。这表示服务器已经收到了客户端的同步请求,并发送了同步和确认,正在等待客户端的最终确认。
- ESTABLISHED:客户端发送ACK包给服务器,服务器收到这个ACK包后,双方都进入ESTABLISHED状态。这表示TCP连接已经建立,可以开始数据传输。
总结
三次握手是TCP连接建立过程中的一个关键步骤,它为可靠的数据传输提供了基础。 在三次握手过程中,客户端和服务器的状态会从CLOSED或LISTEN状态开始,经历SYN-SENT、SYN-RECEIVED,最后到达ESTABLISHED状态。这个过程确保了双方都准备好进行数据交换。