什么是 TCP?
TCP(Transmission Control Protocol,传输控制协议) 是一种面向连接的、可靠的、基于字节流的传输层协议。它是互联网协议套件(TCP/IP)的核心协议之一,广泛应用于需要可靠数据传输的场景(如网页浏览、文件传输、电子邮件等)。
TCP 的特点:
- 面向连接:通信前需要建立连接(三次握手),通信结束后需要断开连接(四次挥手)。
- 可靠性:通过确认机制、重传机制、校验和等确保数据可靠传输。
- 有序性:数据按发送顺序到达接收端。
- 流量控制:通过滑动窗口机制控制发送方的发送速率。
- 拥塞控制:通过拥塞窗口机制避免网络拥塞。
TCP 的三次握手
三次握手(Three-way Handshake) 是指 TCP 建立连接时,确保客户端和服务器双方都能正常发送和接收数据。
三次握手的过程:
-
第一次握手(SYN):
- 客户端向服务器发送一个 SYN 报文(SYN=1,seq=x),并指明客户端的初始化序列号,表示请求建立连接。
- 客户端进入
SYN_SENT状态。 - 服务器确认了客户端发送能力和服务器端接收能力。
-
第二次握手(SYN + ACK):
- 服务器收到 SYN 报文后,向客户端发送一个 SYN + ACK 报文(SYN=1,ACK=1,seq=y,ack=x+1),表示同意建立连接。
- 服务器进入
SYN_RECEIVED状态。 - 客户端确认了双方发送和接收能力,服务器无法确认客户端接收能力。
-
第三次握手(ACK):
- 客户端收到 SYN + ACK 报文后,向服务器发送一个 ACK 报文(ACK=1,seq=x+1,ack=y+1),表示确认连接已建立。
- 客户端和服务器都进入
ESTABLISHED状态,连接建立成功。 - 服务器确认了客户端接收能力。
三次握手的作用:
- 确认双方的发送和接收能力:通过三次握手,客户端和服务器都能确认对方的发送和接收能力正常。
- 确保数据有序传输:通过交换初始序列号(seq),确保数据有序传输。
TCP 的四次挥手
四次挥手(Four-way Handshake) 是 TCP 断开连接的过程,确保客户端和服务器双方都能正常关闭连接。
四次挥手的过程:
-
第一次挥手(FIN):
- 客户端向服务器发送一个 FIN 报文(FIN=1,seq=u),表示请求关闭连接。
- 客户端进入
FIN_WAIT_1状态。
-
第二次挥手(ACK):
- 服务器收到 FIN 报文后,向客户端发送一个 ACK 报文(ACK=1,seq=v,ack=u+1),表示确认收到关闭请求。
- 服务器进入
CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。
-
第三次挥手(FIN):
- 服务器完成数据发送后,向客户端发送一个 FIN 报文(FIN=1,seq=w,ack=u+1),表示请求关闭连接。
- 服务器进入
LAST_ACK状态。
-
第四次挥手(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 的状态转换
建立连接时的状态转换:
- 客户端:
CLOSED->SYN_SENT->ESTABLISHED - 服务器:
CLOSED->LISTEN->SYN_RECEIVED->ESTABLISHED
释放连接时的状态转换:
- 客户端:
ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED - 服务器:
ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
总结
- TCP 是一种可靠的、面向连接的传输层协议。
- 三次握手:用于建立连接,确保双方的发送和接收能力正常。
- 四次挥手:用于断开连接,确保数据完整传输并防止旧连接的报文干扰。
- 三次握手和四次挥手的作用:确保连接的可靠性和数据的完整性。