一、建立连接---三次握手
TCP连接的建立需要三次握手来同步双方的序列号,并确保双方都准备好进行数据传输。具体过程如下:
1. 客户端发起连接请求 (SYN):
- 客户端发送一个SYN(Synchronize Sequence Numbers)报文给服务器。
- 报文中包含了一个初始序列号
ISN
(Initial Sequence Number),用于标识这个连接中的第一个字节的数据。 - 客户端进入
SYN_SENT
状态,等待服务器回应。
2. 服务器接收并回应 (SYN+ACK):
- 服务器接收到客户端的SYN报文后,它将自己也设置为SYN状态,并生成自己的初始序列号。
- 服务器向客户端发送一个SYN-ACK报文作为响应,其中包含了对客户端SYN的确认(ACK字段)以及服务器自身的初始序列号。
- 服务器进入
SYN_RECV
状态,等待客户端的最终确认。
3. 客户端确认 (ACK):
- 客户端接收到服务器的SYN-ACK报文后,发送一个ACK报文给服务器以确认收到其SYN。
- ACK报文中会包含服务器SYN报文的序列号加1,表示已经成功接收到了该报文。
- 客户端进入
ESTABLISHED
状态。 - 服务器接收到ACK后也进入
ESTABLISHED
状态,连接建立完成,此时双方可以开始传输数据。
二、关闭连接---四次挥手
TCP连接是全双工的,因此关闭连接时需要分别关闭两个方向的数据流。这通常需要四个步骤来完成:
1. 主动关闭方发送FIN (第一次挥手)
- 主动关闭方(可能是客户端或服务器)发送一个FIN报文给对方,表示不再发送数据。
- 发送方进入
FIN_WAIT_1
状态。
2. 被动关闭方接收FIN并回应ACK (第二次挥手)
- 被动关闭方接收到FIN后,发送一个ACK报文作为回应,确认序号为收到的FIN报文的序列号加1。
- 被动关闭方进入
CLOSE_WAIT
状态,而此时主动关闭方进入FIN_WAIT_2
状态,等待被动关闭方的FIN报文。
3. 被动关闭方发送FIN (第三次挥手)
- 当被动关闭方也没有数据要发送时,它会发送一个FIN报文给主动关闭方。
- 被动关闭方进入
LAST_ACK
状态,等待最后一个ACK。
4. 主动关闭方接收FIN并回应ACK (第四次挥手)
- 主动关闭方接收到FIN后,发送一个ACK报文作为回应,确认序号为收到的FIN报文的序列号加1。
- 主动关闭方进入
TIME_WAIT
状态,等待一段时间(通常是2倍的最大段生存时间MSL),以确保被动关闭方能够接收到ACK报文。这段时间结束后,如果没有任何重传发生,则主动关闭方关闭连接,进入CLOSED
状态。 - 被动关闭方在接收到ACK后立即关闭连接,进入
CLOSED
状态。
三、总结
- 三次握手:确保了双方都能正确初始化序列号,并且保证双方都知道对方已准备好通信。
- 四次挥手:因为TCP连接是双向的,所以每个方向都需要单独关闭。
TIME_WAIT
状态的存在是为了处理可能在网络中延迟到达的重复报文,确保旧连接的数据不会影响新连接。此外,它还有助于解决网络分组重组的问题。