TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 连接的状态可以通过一个状态机来描述,这个状态机定义了 TCP 连接从建立到关闭过程中可能经历的各种状态。
一、状态
状态名称 | 描述 | 触发条件 |
---|---|---|
CLOSED | 表示没有连接。这是初始状态。 | 无 |
LISTEN | 服务器端等待客户端连接请求的状态。 | 服务器启动并调用 listen() 函数后进入此状态。 |
SYN_SENT | 客户端发送 SYN 请求后的状态。 | 客户端调用 connect() 函数后发送 SYN 包,进入此状态。 |
SYN_RECEIVED | 服务器端收到 SYN 请求,并发送 SYN+ACK 响应后的状态。 | 服务器在 LISTEN 状态下收到 SYN 包后,发送 SYN+ACK 包,进入此状态。 |
ESTABLISHED | 连接已经建立,双方可以进行数据传输的状态。 | 客户端收到服务器的 SYN+ACK 后,发送 ACK 包,双方都进入 ESTABLISHED 状态。 |
FIN_WAIT_1 | 主动关闭方发送 FIN 包后的第一个等待状态。 | 任一方调用 close() 函数后发送 FIN 包,进入此状态。 |
FIN_WAIT_2 | 主动关闭方收到对方的 ACK 后的第二个等待状态。 | 在 FIN_WAIT_1 状态下收到对方的 ACK 包后,进入此状态。 |
CLOSING | 双方同时关闭连接时的状态。 | 在 FIN_WAIT_1 状态下收到对方的 FIN 包,发送 ACK 后进入此状态。 |
TIME_WAIT | 主动关闭方在收到被动关闭方的 FIN 包并发送 ACK 后的状态。 | 在 FIN_WAIT_2 或 CLOSING 状态下收到对方的 FIN 包,发送 ACK 后进入此状态。 |
CLOSE_WAIT | 被动关闭方收到 FIN 包并发送 ACK 后的状态。 | 在 ESTABLISHED 状态下收到对方的 FIN 包,发送 ACK 后进入此状态。 |
LAST_ACK | 被动关闭方发送 FIN 包后的最后一个等待状态。 | 在 CLOSE_WAIT 状态下调用 close() 函数后发送 FIN 包,进入此状态。 |
二、详细说明
-
CLOSED
- 初始状态,表示没有任何连接。
-
LISTEN
- 服务器端等待客户端连接请求的状态。服务器通过调用
listen()
函数进入此状态。
- 服务器端等待客户端连接请求的状态。服务器通过调用
-
SYN_SENT
- 客户端发起连接请求,发送 SYN 包给服务器,然后进入此状态。
-
SYN_RECEIVED
- 服务器收到客户端的 SYN 包,发送 SYN+ACK 包作为响应,然后进入此状态。
-
ESTABLISHED
- 客户端收到服务器的 SYN+ACK 包,发送 ACK 包确认,双方都进入此状态,表示连接已建立,可以开始数据传输。
-
FIN_WAIT_1
- 任一方调用
close()
函数后,发送 FIN 包给对方,然后进入此状态。
- 任一方调用
-
FIN_WAIT_2
- 在 FIN_WAIT_1 状态下,发送方收到对方的 ACK 包,确认 FIN 包已收到,进入此状态。
-
CLOSING
- 在 FIN_WAIT_1 状态下,发送方收到对方的 FIN 包,发送 ACK 包确认,进入此状态。
-
TIME_WAIT
- 在 FIN_WAIT_2 或 CLOSING 状态下,发送方收到对方的 FIN 包,发送 ACK 包确认,进入此状态。在此状态下,发送方等待一段时间(通常是 2MSL,即两倍的最大报文段生存时间),确保对方收到 ACK 包。
-
CLOSE_WAIT
- 在 ESTABLISHED 状态下,接收方收到对方的 FIN 包,发送 ACK 包确认,进入此状态。此时,接收方需要调用
close()
函数来关闭连接。
- 在 ESTABLISHED 状态下,接收方收到对方的 FIN 包,发送 ACK 包确认,进入此状态。此时,接收方需要调用
-
LAST_ACK
- 在 CLOSE_WAIT 状态下,接收方调用
close()
函数,发送 FIN 包给对方,然后进入此状态。等待对方的 ACK 包确认。
- 在 CLOSE_WAIT 状态下,接收方调用
三、状态转换
+---------+
| CLOSED |
+---------+
|
v
+---------+
| LISTEN |
+---------+
|
v
+---------+
| SYN_RCVD|
+---------+
|
v
+---------+
| ESTAB |
+---------+
|
v
+---------+
| FIN_WAIT1|
+---------+
|
v
+---------+
| FIN_WAIT2|
+---------+
|
v
+---------+
| CLOSING|
+---------+
|
v
+---------+
| TIME_WAIT|
+---------+
|
v
+---------+
| CLOSED |
+---------+
+---------+
| ESTAB |
+---------+
|
v
+---------+
| CLOSE_WAIT|
+---------+
|
v
+---------+
| LAST_ACK|
+---------+
|
v
+---------+
| CLOSED |
+---------+
标签:状态,ACK,FIN,TCP,发送,+---------+,连接,WAIT
From: https://www.cnblogs.com/auv2009/p/18502197