tcp状态

作者: 大乔是个美少女 | 来源:发表于2020-02-12 15:59 被阅读0次

    客户端: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连接状态。

    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状态。

    什么是2MSL: https://blog.csdn.net/xiaofei0859/article/details/6044694

    注:为什么TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
    这是因为: 虽然双方都同意关闭连接了,而且握手的4个报文也都协调和发送完毕,按理可以直接回到CLOSED状态(就好比从SYN_SEND状态到 ESTABLISH状态那样);但是因为我们必须要假想网络是不可靠的,你无法保证你最后发送的ACK报文会一定被对方收到,因此对方处于 LAST_ACK状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT状态的作用就是用来重发可能丢失的 ACK报文。

    注:CLOSING状态比较特殊,他表示你发送FIN报文后并没有接收到对方的ACK报文,而是接收到对方的FIN报文。一般出现双方同时发送FIN报文,表示双方都在关闭连接。
    如果同时发送FIN,则在发送后会首先进入FIN_WAIT_1状态。在收到对端的FIN后,回复一个ACK,会进入CLOSING状态。在收到对端的ACK后,进入TIME_WAIT状态。这种情况称为同时关闭。
    同时关闭也需要有4次报文交换,与典型的关闭相同。

    相关文章

      网友评论

          本文标题:tcp状态

          本文链接:https://www.haomeiwen.com/subject/tircfhtx.html