美文网首页
TCP三次握手,四次挥手,及socket状态变化

TCP三次握手,四次挥手,及socket状态变化

作者: 江河湖海琴瑟琵琶 | 来源:发表于2020-08-06 15:04 被阅读0次

    客户端想要与服务器建立TCP连接需要三次握手,断开时需要四次挥手.
    整理一下通信过程.以及双方状态变化.

    三次握手,建立连接

    整个过程就是数据包的发送接收,双方每次发送或者接收数据包时状态发生改变.
    首先服务器处于LISTEN状态
    第一步:客户端发送SYN J数据包,客户端状态变为SYN_SEND.

    SYN J 中,SYN可以理解成数据包类型,这里表示同步,J是一个整数,可以理解成编号
    

    第二步:服务器收到SYN J数据包需要回应,于是服务器发送数据包ACK J+1 , SYN K 给客户端.服务器状态变为SYN_RECV
    (一个数据包里同时含有ACK和SYN)

    ACK J+1, ACK(acknowledge)意思为确认.要回应编号为`J`的包,那么ACK编号应该是`J+1`
    

    第三步:客户端收到数据包,里边含有SYN K,需要回应ACK K+1数据包给服务器,此时客户端状态变为ESTABLISHED,服务器在收到ACK K+1数据包时也会进入ESTABLISHED状态.
    到此连接成功建立.

    断开连接,四次挥手

    主动断开与被动断开,情况是不一样的,但整体类似.
    假设客户端主动断开连接,过程如下:
    此时双方都处于ESTABLISHED状态
    第一步:
    客户端发送FIN X,自身状态变成FIN_WAIT_1

    客户端想要主动关闭连接,所以给服务器发送断开请求的数据包. FIN (finished)意思为完成结束
    

    第二步:
    服务器收到FIN X,需要做出回应ACK X+1,自身状态变成CLOSE_WAIT.
    客户端收到响应包ACK X+1 , 客户端状态变成FIN_WAIT_2

    服务器收到客户端发来的结束请求,做出回应,表示收到.
    但此时服务器还不想断开连接,所以进入CLOSE_WAIT状态.
    此时服务器还能向客户端推送数据. 
    

    第三步:
    服务器发送FIN Y, 自身状态变为LAST_ACK

    当服务器数据都发送完毕,会主动给客户端一个`FIN`包
    `LAST_ACK` 状态下,只需等待客户端响应回来的` FIN Y+1 `就能关闭连接了
    

    第四步:
    客户端收到FIN Y,需要做出响应ACK Y+1, 自身状态变成TIME_WAIT

    `TIME_WAIT` 是客户端为了保证最后的 `ACK Y+1 `能够被服务器接收
    

    服务器收到ACKY+1就能正常关闭了


    主动关闭与被动区别

    #主动关闭连接的一方状态变化为
    `FIN_WAIT_1`  >>  `FIN_WAIT_2`  >> `TIME_WAIT`
    #被动
    `CLOSE_WAIT` >> `LAST_ACK`
    
    下边是网上找的图,可以自己看一下 复制过来的,侵删.png

    相关文章

      网友评论

          本文标题:TCP三次握手,四次挥手,及socket状态变化

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