tcp状态详解网络
客户端:SYN_SENT FIN_WAIT1 FIN_WAIN2 CLOSING TIME_WAIT
服务端:LISTEN SYN_RCVD CLOSE_WAIT LAST_ACK
共有的:CLOSED ESTABLISHED并发
TCP/IP三次握手:
服务端socket监听端口时会处于LISTEN状态,表示端口开放随时可接受链接。
客户端第一次发送SYN报文后会进入SYN-SENT等待匹配链接状态。请求创建链接。
服务端收到SYN后并发送SYN和ACK报文,这时会进入SYN_RCVD状态,询问客户端是否准备进行数据链接传输。
客户端收到SYN和ACK报文并发送ACK报文后就进入ESTABLISHED链接状态,服务端收到也进会入ESTABLISHED链接状态。socket
TCP/IP四次断开:
客户端主动发送FIN断开链接请求后会进入FIN_WAIT_1。等待对方FIN中断请求。
服务端收到FIN并发送立刻发送ACK报文后进入CLOSE_WAIT状态,检测是否还有数据传输。
客户端收到ACK报文后会进入FIN_WAIT_2。会继续等待对方FIN中断请求。
服务端确认没有数据传输,则发送FIN给客户端后进入LAST_ACK状态。最后等待对方的ACK报文。当收到ACK报文后,也就进入CLOSED无链接状态了。
客户端收到FIN,并发送ACK后就进入TIME_WAIT状态。若是在FIN_WAIT_1状态下同时收到ACK和FIN报文时,能够直接进入TIME_WAIT状态,无需通过FIN_WAIN_2。
客户端在TIME_WAIT状态时须要等待2MSL后才能返回CLOSED状态。tcp
什么是2MSL: https://blog.csdn.net/xiaofei0859/article/details/6044694spa
注:为何TIME_WAIT状态还须要等2MSL后才能返回到CLOSED状态?
这是由于: 虽然双方都赞成关闭链接了,并且握手的4个报文也都协调和发送完毕,按理能够直接回到CLOSED状态(就比如从SYN_SEND状态到 ESTABLISH状态那样);可是由于咱们必需要假想网络是不可靠的,你没法保证你最后发送的ACK报文会必定被对方收到,所以对方处于 LAST_ACK状态下的SOCKET可能会由于超时未收到ACK报文,而重发FIN报文,因此这个TIME_WAIT状态的做用就是用来重发可能丢失的 ACK报文。.net
注:CLOSING状态比较特殊,他表示你发送FIN报文后并无接收到对方的ACK报文,而是接收到对方的FIN报文。通常出现双方同时发送FIN报文,表示双方都在关闭链接。
若是同时发送FIN,则在发送后会首先进入FIN_WAIT_1状态。在收到对端的FIN后,回复一个ACK,会进入CLOSING状态。在收到对端的ACK后,进入TIME_WAIT状态。这种状况称为同时关闭。
同时关闭也须要有4次报文交换,与典型的关闭相同。blog