美文网首页网络技术
三次挥手与四次挥手

三次挥手与四次挥手

作者: 岳峙 | 来源:发表于2019-01-24 20:54 被阅读41次

    三次握手


    image.png

    具体流程:
    客户端发送连接请求报文 服务器端收到后回复ack报文 并为这次连接分配资源 客户端收到ack报文后也向服务器端发送ack报文 并分配资源 这些tcp连接就建立了

    四次挥手


    image.png

    流程:
    中断连接的一端可以是客户端 也可以是服务器端 假设客户端发起中断连接的请求 意思是 我这里面没有数据发送了 但是你如果没有数据发送完成 不要先着急关闭socket 可以继续发送数据
    服务器收到消息之后 发送ack给客户端 你的请求我收到了 请等待我的后续消息
    这个时候客户端进入 fin_wait状态 继续等待服务端的fin报文 当服务端确定报文已经发送完成的时候 向客户端发送 fin报文 告诉客户端 我这边数据已经发送完了 准备好关闭连接了
    客户端收到fin报文之后 就知道可以关闭连接了 但是他不相信网络 怕服务器端不知道要关闭 所有发送ack进入time_wait状态 如果服务器端没有收到ack则重传
    服务器端收到ack后 就知道可以断开连接了
    客户端等待2mls后依然没有用收到回复 则证明服务器端已经正常关闭 那么客户端也能关闭了
    至此 tcp连接关闭

    反过来要是关闭请求由另一方提出 那么过程刚好相反

    问:为什么连接是三次握手 关闭的时候是四次握手
    当服务器端收到客户端的syn连接请求之后 直接发送syn+ack报文 前者用来同步 后者用来应答 但是当关闭连接的时候 服务器端收到fin报文时 很可能不会马上关闭socket 所以只能先回复一个ack报文 告诉 客户端 你的fin报文我收到了 但是只有等服务器端所有的报文都已经发送完成 才能发送fin报文 因此不能一起发送 所以需要四次握手

    为什么time_wait状态 需要进行2mls才能返回close状态
    虽然按 道理四个报文发送完毕就能进入close 状态 但是我们必须承认并假象网络是不可靠的 如果最后一个ack报文丢失 那么time_wait状态就是用来重发可能丢失的ack报文

    相关文章

      网友评论

        本文标题:三次挥手与四次挥手

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