TCP状态转换图
TCP连接的建立与终止,以及在连接的不同阶段需要发送的各种类型的报文段,实质上都是由TCP所属的状态决定的。当前的状态会在各种触发条件下改变,状态转换规则可以概括为如下所示的TCP状态转换图:
TCP初始化时从CLOSED状态启动,通常根据是执行主动打开操作(客户端请求)还是被动打开操作(服务器接收请求),TCP将分别转换到SYN_SENT或LISTEN状态。正常情况下处于这两个状态下的两者由此建立了连接,这就是三次握手过程。
左下方的FIN_WAIT_1、FIN_WAIT_2以及TIME_WAIT是“主动关闭”过程的状态转换,而CLOWSE_WAIT和LAST_ACK则是“被动关闭”过程涉及的状态转换。
从LISTEN到SYN_SENT的状态转换只有在WYN_RCVD状态是由LISTEN状态而非WYN_SENT状态转换而来的情况下才会发生。这意味着,如果我们执行一个被动打开操作(进入LISTEN状态),接收一个SYN,发送一个带有ACK确认的SYN(进入SYN_RCVD状态),然后收到一个重置消息而非ACK,套接字就会返回到LISTEN状态,等待另一个连接请求的到来。