TCP(Transmission Control Protocol,传输控制协议)
读者来稿 · admin与 batype 的 AI 分身对话整理
TCP(Transmission Control Protocol,传输控制协议)#
TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议,广泛用于互联网中的数据传输。它是TCP/IP模型中的核心协议之一,与IP(Internet Protocol,互联网协议)协同工作,负责在多个网络设备之间传输数据。
TCP 协议的主要特点和功能包括:
-
面向连接:
在数据传输开始之前,TCP 需要在两端建立一个连接,通常通过三次握手(three-way handshake)过程完成。
-
可靠性传输:
TCP 提供可靠的数据传输服务,确保数据无差错、不丢失、不重复,并且按序到达。它通过序列号、确认应答(ACKs)、超时重传等机制实现这一点。
-
流量控制:
TCP 使用滑动窗口协议来进行流量控制,防止快速发送方淹没慢速接收方。
-
拥塞控制:
TCP 实现拥塞控制算法,如慢启动(Slow Start)、拥塞避免(Congestion Avoidance)、快速重传(Fast Retransmit)和快速恢复(Fast Recovery),以避免网络拥塞。
-
全双工通信:
TCP 提供全双工服务,意味着数据可以在两个方向上同时传输,双方都可以是发送者和接收者。
-
顺序控制和数据重组:
TCP 在数据包传输中使用序列号对数据包进行排序,确保接收端可以根据这些序列号将数据重新组合成原始的数据流。
-
错误检测:
TCP 头部包含校验和(checksum)字段,用于检测数据在传输过程中的任何错误。
-
连接管理:
TCP 协议管理和维护连接的生命周期,包括连接的建立、数据传输和连接的终止(通常通过四次挥手(four-way handshake)过程实现)。
在TCP/IP协议栈中,TCP位于传输层,正上方是应用层,应用层协议如HTTP、FTP等使用TCP来保证数据传输的可靠性;正下方是网络层,网络层协议如IP负责将数据包路由到正确的目的地。TCP处理的是端到端的通信,确保数据能够在应用程序之间准确无误地传输。
由于TCP提供的可靠性和面向连接的特性,它广泛用于需要保证数据完整性和正确顺序的应用场景,如网页浏览、文件传输、电子邮件发送等。
下面我们再看下完整的TCP连接过程,通过这个过程你可以明白TCP是如何保证重传机制和数据包的排序功能的。
从下图可以看出,一个完整的TCP连接的生命周期包括了“建立连接”“传输数据”和“断开连接”三个阶段。

TCP三次握手#
TCP三次握手(Three-way Handshake)是建立TCP/IP网络连接的标准过程,其目的是在两个网络主机之间创建一个可靠的连接。这个过程确保了双方都准备好接收和发送数据,并且同步了双方的初始序列号,用于数据包的正确排序和可靠传输。下面是TCP三次握手的详细步骤:
第一次握手:SYN#
客户端发送SYN包:
客户端选择一个初始序列号(ISN)并向服务器发送一个SYN(同步)包。这个SYN包包含客户端的初始序列号,并且SYN标志位被设置为1,其他标志位(如ACK)被设置为0。
第二次握手:SYN-ACK#
服务器回应SYN-ACK包:
服务器接收到SYN包后,发送一个SYN-ACK(同步-确认)包作为回应。该包含有服务器自己的初始序列号,同时将客户端的初始序列号加1,并在ACK字段中回传此值,以确认接收到客户端的SYN。此时,SYN和ACK标志位都被设置为1。
第三次握手:ACK#
客户端发送ACK包:
客户端收到SYN-ACK包后,将服务器的序列号加1,并将这个值放在ACK包的确认字段中,发送给服务器。这个ACK包的ACK标志位设置为1,表示确认。
握手完成#
连接建立:
服务器接收到客户端的ACK包后,三次握手完成,客户端和服务器之间建立了一个双向的可靠连接。之后,数据可以在双方之间开始传输。
这个过程的关键在于两次增量序列号的交换,这保证了双方都能确认对方已准备好进行通信,并且正确地维护了TCP的状态信息。三次握手可以防止历史连接的初始化数据段突然出现在当前连接中,从而导致不可预料的问题。
简化的表示如下:
客户端 服务器
|-----SYN(X)------------>|
|<----SYN(Y), ACK(X+1)---|
|-----ACK(Y+1)---------->|
其中,X 和 Y 分别是客户端和服务器选择的初始序列号。
值得注意的是,TCP三次握手仅仅是建立连接的一部分,数据传输会在三次握手之后开始,而在数据传输结束后,TCP用另一个独立的四次挥手(Four-way Handshake)过程来关闭连接。
TCP四次挥手#
TCP(传输控制协议)四次挥手是用于终止一个已经建立的TCP连接的过程。这个过程确保了双方都能够完成数据传输并且正确关闭连接。以下是TCP四次挥手的详细步骤:
第一次挥手:FIN_WAIT_1#
- 假设客户端决定关闭连接,它发送一个FIN(结束)标志的TCP段给服务器,表示客户端已经没有数据要发送了。
- 客户端进入FIN_WAIT_1状态,等待服务器的确认。
第二次挥手:CLOSE_WAIT#
- 服务器收到这个FIN段后,发送一个ACK(确认)标志的TCP段作为回应,确认已经收到客户端的终止请求。
- 服务器进入CLOSE_WAIT状态,此时客户端收到ACK后进入FIN_WAIT_2状态。
- 此时,客户端到服务器的连接已经关闭,但是服务器如果还有数据要发送,可以继续发送。
第三次挥手:LAST_ACK#
- 当服务器完成数据发送后,它也会决定关闭连接,发送一个FIN标志的TCP段给客户端。
- 服务器进入LAST_ACK状态,等待客户端的确认。
第四次挥手:TIME_WAIT#
- 客户端收到服务器的FIN段后,发送一个ACK标志的TCP段作为回应,确认已经收到服务器的终止请求。
- 客户端进入TIME_WAIT状态,持续2个最大段生命周期(MSL)的时间后,确保服务器能够接收到确认,然后关闭连接。
- 服务器收到ACK后,关闭连接,进入CLOSED状态。
这个过程确保了双方都有机会完成数据传输并清理连接。如果在四次挥手过程中的任何一步发生网络延迟或丢包,TCP协议会重试发送丢失的段,直到成功完成四次挥手过程。这个过程是TCP提供可靠传输服务的关键机制之一。
简化的表示如下:
客户端 服务器
FIN_WAIT_1 |-----FIN---->|
FIN_WAIT_2 |<----ACK-----| CLOSE_WAIT
|<----FIN-----| LAST_ACK
TIME_WAIT |-----ACK---->| CLOSED