TCP 三次握手详解
TCP(Transmission Control Protocol)的三次握手用于建立可靠的双向通信连接。过程如下:
-
第一次握手 (SYN):
客户端向服务器发送一个带有SYN
标志的包,表示客户端希望建立连接。此时,客户端进入SYN-SENT
状态。SYN
包中还包含一个初始序列号(Sequence Number,通常称为ISN
),用于标识后续传输的数据包。 -
第二次握手 (SYN-ACK):
服务器收到SYN
包后,响应一个带有SYN
和ACK
标志的包,表示同意连接请求。这个包中包含服务器的初始序列号,并对客户端发送的序列号加 1,表示确认了客户端的SYN
包。此时,服务器进入SYN-RECEIVED
状态。 -
第三次握手 (ACK):
客户端收到服务器的SYN-ACK
包后,发送一个带有ACK
标志的包,确认服务器的序列号加 1。此时,客户端进入ESTABLISHED
状态,服务器在收到客户端的ACK
包后,也进入ESTABLISHED
状态,连接正式建立。
这三次握手确保了双方都可以互相发送和接收数据,同时确认各自的接收能力。
TCP 四次挥手详解
TCP 的四次挥手用于可靠地断开连接:
-
第一次挥手 (FIN):
主动关闭连接的一方(通常是客户端)发送一个带有FIN
标志的包,表示数据发送完毕,想要关闭连接。此时,客户端进入FIN-WAIT-1
状态。 -
第二次挥手 (ACK):
服务器收到FIN
包后,确认收到,发送一个带有ACK
标志的包,并返回确认号。此时,服务器进入CLOSE-WAIT
状态,客户端收到此ACK
后进入FIN-WAIT-2
状态。此时,连接仍未完全关闭,服务器可能还有数据需要发送。 -
第三次挥手 (FIN):
服务器完成数据发送后,发送一个带有FIN
标志的包,表示它的数据也发送完毕,准备关闭连接。此时,服务器进入LAST-ACK
状态。 -
第四次挥手 (ACK):
客户端收到服务器的FIN
包后,发送一个带有ACK
标志的包,表示确认关闭连接。此时,客户端进入TIME-WAIT
状态,等待一定时间(通常是 2 倍的报文最大生存时间,2MSL)以确保服务器收到了ACK
,然后再进入CLOSED
状态。服务器在收到这个ACK
包后,也进入CLOSED
状态,连接彻底关闭。
为什么是三次握手而不是两次?
- 三次握手的核心目的是确保双向的同步:
- 第一次握手:客户端发送
SYN
,告知服务器自己可以发送数据。 - 第二次握手:服务器响应
SYN-ACK
,告知客户端它收到了请求,并且它也可以发送数据。 - 第三次握手:客户端确认收到服务器的响应,确保连接的双向通信是可靠的。
- 第一次握手:客户端发送
如果只有两次握手,服务器无法确认客户端是否收到了它的确认信息,可能导致不稳定的连接。
为什么关闭连接需要四次?
- 关闭连接需要四次是因为 TCP 是全双工通信协议,双方需要分别关闭各自的发送通道。
- 在发送
FIN
之后,接收方仍可以继续发送数据,直到它自己发送FIN
包关闭发送通道,因此需要四次挥手来确保双向通信完全关闭。