一个TCP连接的过程中,会经历一系列的状态变化,这些变化包括:
LISTEN,SYN_SENT,SYN-RECEIVED,ESTABLISHED,FIN-WAIT-1,FIN-WAIT-2,CLOSE-WAIT,CLOSING,LAST-ACK,TIME-WAIT,CLOSED。其中CLOSED是一个虚构的状态,因为CLOSED的TCP连接的TCB(Transmission Control Block)已经释放掉了,所以此时这个TCP连接已经不存在了。关于各个状态的一个简要说明:
- LISTEN:侦听并等待对端的TCP连接请求
- SYN-SENT:发送SYN连接请求后,等待对端回复SYN请求
- SYN-RECEIVED:收到来自对端的SYN请求,并回复SYN请求后,等待对端响应SYN请求的ACK消息
- ESTABLISHED:代表连接建立,双方在这个状态下进行TCP数据交互
- FIN-WAIT-1:发送FIN关闭连接请求后,等待对方响应FIN的ACK消息或者对端的FIN关闭请求
- FIN-WAIT-2:等待对方FIN关闭请求
- CLOSE-WAIT:等待本地用户(进程)发送FIN关闭请求给对端
- CLOSING:当双方同时发送FIN关闭请求时,会进入CLOSING状态,等待对端发送FIN报文的响应ACK消息
- LAST-ACK:收到对端FIN请求后,回复ACK及FIN并等待对方回复FIN的响应ACK消息,此时进入此状态
- TIME-WAIT:该状态是为了确保对端收到了FIN请求的ACK响应,默认会等待两倍MSL时长(MSL:Maximum Segment Lifetime,即报文最大生存时间,超过这个时间的报文会被丢弃)
对于上面的状态之间的变化关系,可以参考RFC-793中的TCP连接状态变化图:
注:
图中“---------”上下的内容表示状态变换的条件(例如snd SYN,ACK表示发送SYN和ACK报文,rcv FIN表示收到FIN报文等等)
图中“+-------+”中框起来的是各个TCP连接的状态
图中“-------->”这类箭头表示状态之间变换的顺序(还有各种折线箭头)
TCP三次握手的过程以及状态切换过程说明:
TCP A TCP B 1. CLOSED LISTEN 2. SYN-SENT --> <SEQ=100><FLAGS=SYN> --> SYN-RECEIVED 3. ESTABLISHED <-- <SEQ=300><ACK=101><FLAGS=SYN,ACK> <-- SYN-RECEIVED 4. ESTABLISHED --> <SEQ=101><ACK=301><FLAGS=ACK> --> ESTABLISHED 5. ESTABLISHED --> <SEQ=101><ACK=301><FLAGS=ACK><DATA> --> ESTABLISHED |
过程说明:
- B作为服务器端处于