• TCP状态转换


    三次握手

    四次挥手

     

    TCP状态转换

     TCP的11种状态:

    1. CLOSED:表示初始状态,在连接关闭或超时的时候变成此状态。

    2. LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接受连接。服务端调用socket、 bind、listen函数后就进入此状态。被动状态(等待客户端来连接)。

    3. SYN_RCVD:表示接受到了SYN报文,服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。

    4. SYN_SENT: 当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。

    5. ESTABLISHED:客户端和服务器端在完成三路握手后,两者最终进入的状态,表示连接已经建立成功,可以传送数据了。对于服务器端来说,就是在SYN_RCVD状态时,收到了来自客户端的ACK。于是SYN_RCVD->ESTABLISHED;对于客户端来说,就是在SYN_SENT状态时,收到了来自服务器端的SYN+ACK分节,状态从SYN_SENT->ESTABLISHED,然后发送ACK。

    6. FIN_WAIT_1: 主动关闭的一方发送FIN,从ESTABLISHED -> FIN_WAIT_1

    7. FIN_WAIT_2: 主动关闭的一方,接收到对方的FIN、ACK,进入此状态。由此不能再接收对方的数据。但是能够向对方发送数据

    8. CLOSE_WAIT: 接收到FIN以后,被动关闭的一方进入此状态。具体动作时接收到FIN,同时发送ACK。过会还要发送FIN表示自己也要关闭了,中间的这段就可以叫做CLOSE_WAIT(等待关闭)

    9. LAST_ACK:被动方发送FIN,导致CLOSE_WAIT -> LAST_ACK,TCP终止则还需要等待最后一个ACK,所以状态叫做LAST_ACK,等到最后ACK后,LAST_ACK ->CLOSED

    10. CLOSING:主动关闭方处于FIN_WAIT_1状态时,接收FIN,则从FIN_WAIT_1 -> CLOSING

            (举一个此种情况的例子,(前提是两者的tcp连接已经建立)当主动关闭方发送FIN(一般是调用close)给被动关闭方,状态从ESTABLISHED -> FIN_WAIT_1,如果是正常TCP终止,则主动方会收到一个ACK,状态从 FIN_WAIT_1 -> FIN_WAIT_2,然后一段时间后被动方会继续发送FIN给主动方,主动关闭方收到FIN后状态从FIN_WAIT_2 -> TIME_WAIT(2msl后超时,状态最终变为CLOSED),这是最正常的情况

            但当主动关闭方处于FIN_WAIT_1时,被动关闭方的FIN先于之前的自己发送的ACK到达,主动关闭方就直接FIN_WAIT_1 -> CLOSING,(其实就相当于同时关闭),然后迟来的ACK到达时,主动关闭方就从CLOSING -> TIME_WAIT)

    11. TIME_WAIT三种转化途径

            FIN_WAIT_1 -> TIME_WAIT: 接收到了FIN,ACK;

            FIN_WAIT_2 -> TIME_WAIT: 在正常TCP终止时,这种情况发生,处于FIN_WAIT_2的主动关闭方接收到被动关闭方的FIN,TCP状态发生改变,然后发送ACK;

            CLOSING -> TIME_WAIT: 处于CLOSING 状态的主动关闭端接收到了迟来的ACK;

  • 相关阅读:
    RabbitMQ的架构模型
    预防山体滑坡,泥石流监测智能预警系统
    《C++避坑神器·二十一》回调函数使用
    芯片胶点胶加工的效果和质量的检测方法有哪些?
    AQS之LimitLatch分析 (十)
    适合学生党的蓝牙耳机有哪些?学生党蓝牙耳机推荐
    二、Clion和STM32CubeMx---位带操作点亮LED(附及案例程序)
    爬虫实战:从网页到本地,如何轻松实现小说离线阅读
    英语小作文写作模板及步骤(1)
    asp.net core + jenkins 实现自动化发布
  • 原文地址:https://blog.csdn.net/kakaka666/article/details/126355623