TCP 状态

摘自 RFC793 , 3.2 - 术语

TCP 连接在生命周期中有一系列状态。包括: LISTEN, SYN-SENT, SYN-RECEIVED, ESTABLISHED, FIN-WAIT-1, FIN-WAIT-2, CLOSE-WAIT, CLOSING, LAST-ACK, TIME-WAIT 和一个虚拟状态 CLOSED 。 CLOSED 是虚拟的,因为它表示没有传输控制块(TCB)的状态,因此,无连接。这些状态的含义简单描述如下:

  • LISTEN - 表示等待任何远程 TCP 和端口请求连接
  • SYN-SENT - 表示发送连接请求后,等待对应的连接
  • SYN-RECEIVED - 表示接收并发送连接请求后,等待确认连接确认请求
  • ESTABLISHED - 表示打开的连接,收到的数据可以传递给用户。这个是连接数据传输阶段的正常状态
  • FIN-WAIT-1 - 表示等待从远程 TCP 的连接结束请求,或者之前发送的连接结束请求的确认
  • FIN-WAIT-2 - 表示等待远程 TCP 的连接结束请求
  • CLOSE-WAIT - 表示等待本地用户的连接结束请求
  • CLOSING - 表示等待远程 TCP 连接结束请求的确认
  • LAST-ACK - 表示等待之前发送给远程 TCP 的连接结束的确认(包括它的连接结束请求的确认)
  • TIME-WAIT - 表示等待足够时间,确保远程 TCP 收到它的连接结束请求确认
  • CLOSED - 表示无连接状态

TCP 连接通过事件从一个状态变为另一个状态。这些事件包括用户调用, OPEN, SEND, RECEIVE, CLOSE, ABORT 和 STATUS ;传入段, 特别是包含 SYN, ACK, RST 和 FIN 标记的;还有超时。

图 6 中的状态图只展示状态改变,与触发事件和结果操作,但是不包括错误和与状态改变无关的操作。在最后一节,提供了 TCP 对事件反应的更多细节。

注意:本图仅是一个总结,不应该看成是完整规范。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
                             +---------+ ---------\      active OPEN
| CLOSED | \ -----------
+---------+<---------\ \ create TCB
| ^ \ \ snd SYN
passive OPEN | | CLOSE \ \
------------ | | ---------- \ \
create TCB | | delete TCB \ \
V | \ \
+---------+ CLOSE | \
| LISTEN | ---------- | |
+---------+ delete TCB | |
rcv SYN | | SEND | |
----------- | | ------- | V
+---------+ snd SYN,ACK / \ snd SYN +---------+
| |<----------------- ------------------>| |
| SYN | rcv SYN | SYN |
| RCVD |<-----------------------------------------------| SENT |
| | snd ACK | |
| |------------------ -------------------| |
+---------+ rcv ACK of SYN \ / rcv SYN,ACK +---------+
| -------------- | | -----------
| x | | snd ACK
| V V
| CLOSE +---------+
| ------- | ESTAB |
| snd FIN +---------+
| CLOSE | | rcv FIN
V ------- | | -------
+---------+ snd FIN / \ snd ACK +---------+
| FIN |<----------------- ------------------>| CLOSE |
| WAIT-1 |------------------ | WAIT |
+---------+ rcv FIN \ +---------+
| rcv ACK of FIN ------- | CLOSE |
| -------------- snd ACK | ------- |
V x V snd FIN V
+---------+ +---------+ +---------+
|FINWAIT-2| | CLOSING | | LAST-ACK|
+---------+ +---------+ +---------+
| rcv ACK of FIN | rcv ACK of FIN |
| rcv FIN -------------- | Timeout=2MSL -------------- |
| ------- x V ------------ x V
\ snd ACK +---------+delete TCB +---------+
------------------------>|TIME WAIT|------------------>| CLOSED |
+---------+ +---------+

TCP 连接状态图
图 6