状态转换图

image.png

1. CLOSED

这个状态是一个「假想」的状态,是 TCP 连接还未开始建立连接或者连接已经彻底释放的状态。因此CLOSED状态也无法通过 netstat 或者 lsof 等工具看到。

2. LISTEN

一端(通常是服务端)调用 bind、listen 系统调用监听特定端口时进入到LISTEN状态,等待客户端发送 SYN 报文三次握手建立连接。

3. SYN-SENT

客户端发送 SYN 报文等待 ACK 的过程进入 SYN-SENT状态。同时会开启一个定时器,如果超时还没有收到ACK会重发 SYN。

4. SYN-RCVD

服务端收到SYN报文以后会回复 SYN+ACK,然后等待对端 ACK 的时候进入SYN-RCVD

5. ESTABLISHED

SYN-SENT或者SYN-RCVD状态的连接收到对端确认ACK以后进入ESTABLISHED状态,连接建立成功。

- 建立连接涉及的状态

image.png

6. FIN-WAIT-1

主动关闭的一方发送了 FIN 包,等待对端回复 ACK 时进入FIN-WAIT-1状态

7. FIN-WAIT-2

处于 FIN-WAIT-1状态的连接收到 ACK 确认包以后进入FIN-WAIT-2状态,这个时候主动关闭方的 FIN 包已经被对方确认,等待被动关闭方发送 FIN 包。

8. CLOSE-WAIT

当有一方想关闭连接的时候,调用 close 等系统调用关闭 TCP 连接会发送 FIN 包给对端,这个被动关闭方,收到 FIN 包以后进入CLOSE-WAIT状态。

9. TIME-WAIT

TIME-WAIT可能是所有状态中面试问的最频繁的一种状态了。这个状态是收到了被动关闭方的 FIN 包,发送确认 ACK 给对端,开启 2MSL 定时器,定时器到期时进入 CLOSED 状态,连接释放。

10. LAST-ACK

LAST-ACK 顾名思义等待最后的 ACK。是被动关闭的一方,发送 FIN 包给对端等待 ACK 确认时的状态。

- 关闭连接涉及的状态

image.png

11. CLOSING

CLOSING状态在「同时关闭」的情况下出现。这里的同时关闭中的「同时」其实并不是时间意义上的同时,而是指的是在发送 FIN 包还未收到确认之前,收到了对端的 FIN 的情况。

image.png