一、TCP状态跃迁
对于TCP的三次握手和四次挥手每一个过程都有一个状态的变化,只有正确的状态变迁才能使Client和Server端进行通信。
- (Client)SYN_SENT:当Client 需要向Server端进行通信时,Client会通过三次握手与Server端建立连接,那么此时Client会向Server端发送一个请求连接信息(Seq_num,Syn=1,ACK=0)给Server,此时Client端由LISTEN状态变迁为SYN_SENT状态。
- (Server)SYN_RECD:当Server端和Client端结束四次挥手以后,Server端会从CLOSED状态变迁为LISTEN状态(其实这个这个CLOSED状态是虚构的)。当Server端再一次收到Client端发送的数据时,此时Server端由LISTEN变为SYN_RECD状态,并向Client端发送一个(Seq_num,Ack_num,Syn=1,Ack=1)的数据给Client表示Server收到了Client的请求连接信息。
- (Client)ESTABLISH:当Client收到Server端发送的确认和请求连接信息后,此时Client就由SYN_SENT跃迁为ESTABLISH,同时Client需要处理Server的请求连接,那么Client需要发送一个确认信息(Seq_num,Ack_num,Ack=1)向Server表示自己收到了请求连接,并准备好了连接。
- (Server)ESTABLISH:Server端收到Client端发送的确认信息,这时候Client端就和Server端建立起了连接。到这个时候,连接全部建立起来了
- (Client)FIN_WAIT_1:当Client端所有的数据都发送完毕以后,Client就会发送一个数据(Seq_num,Ack_num,Fin=1,Ack=1)给Server端,表示自己没有要发送的数据了。这个时候Client端还没有关闭,只是不再发送数据,但是还是可以接收数据。
- (Server)CLOSE_WAIT:当Server端接收到Client发送的数据以后会由ESTABLISH状态转换为CLOSE_WAIT状态。同时这个时候Server必须让Client知道自己收到了Client端请求关闭的信息,这个时候发送一个(Seq_num,Ack_num,Ack=1)给Client端。
- (Client)FIN_WAIT_2:当Client端接收到Server端的信息以后会将信息会由FIN_WAIT_1进入FIN_WAIT_2状态。
- (Server)LAST_ACK:当Server端已经全部接收到了Client端发送的数据以后,Server端此时会发送一个请求断开连接的信息给(Seq_num,Ack_num,Fin)Client,表示自己收到了所有数据,现在要关闭连接了。
- (Client)TIME_WAIT:当Client收到Server端的请求关闭的信息以后,Client此时由FIN_WAIT_2状态进入TIME_WAIT状态。此时由TIME_WAIT状态进入CLOSED状态需要经历2MSL(2个最大报文传输时间),这是因为,如果此时Client发送一个(Seq_num,Ack_num,Ack=1)给Server端的数据丢失,那么Server端就不会接收到Client端发送的数据,这个时间我们取一个MSL,然后Server端又会发送一个关闭请求连接(Seq_num,Ack_num,Fin=1)的数据给Client,然后Client接收到这个数据以后应该是又进入TIME_WAIT状态,所有上面所需的时间我们取2MSL。
- (Client、Server)CLOSED:最后Client端和Server端都进入了CLOSED状态。