美文网首页
TCP三次握手四次挥手

TCP三次握手四次挥手

作者: 栀心_d553 | 来源:发表于2020-02-12 14:15 被阅读0次

    tcp稳定 面向连接

    udp不稳定 只管发送,不管对方有没有收到


    三次握手:(客户端先发起)

    第一次握手:客户端告诉服务器要准备好资源(syn来标记第一次请求的值)

    第二次握手:服务器告诉客户端,我已经准备好了,你呢(ack表示应答)

    第三次:客户端回复服务器,准备好了


    在四次挥手中,为什么客户端先调close(),而服务器不能先调?(面试)

    1、因为先调close()的一方最终要等2分钟之后才能释放资源,这段期间是不允许用bind的方式重新绑定端口的,就会出现端口被占用的情况
    2、而客户端的端口是操作系统随机分配的,被占用之后会再分配一个
    3、若服务端先调,则需要设定套接字选项,配置重复利用端口资源才可以
    

    服务器端先调close,解决端口被占用的问题

    tcp_sever_socket .setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
    

    在服务器收到第4次挥手的数据包之前,服务器会释放资源吗?(面试)

    不会,即便服务器调用了close(),仍然会保留资源,保留到客户端发来第4次挥手的数据包到了为止,什么时候到了,什么时候才释放资源
    

    客户端发送了这四次挥手之后,会立即释放资源吗(面试)

    不会。客户端在发送四次挥手之后,也会继续等待,因为他是最后一个数据的发送者,必须确定数据对方已经收到了。双方有约定,要是最后一个包,服务器没有收到的话,服务器会发送(也就是下图中的黄箭头)第三次挥手的数据包。有超时时间,一超时就重发。这个数据包可能有,也可能没有,所以必须等两分钟。
    
    三次挥手.png

    为什么不合并四次挥手的第二次和第三次合并(面试)

    第二次回收的目的是为了确认,客户端发的包已经确认收到了
    而第三次挥手的目标是一个新的请求,因为客户端第一次挥手数据包过来的时候,服务器是有两件事要做,第一就是二次挥手的回复,第二呢,就是通知应用程序截阻塞,之后才能调用close,但是只要不调用close,第三次挥手就发不了
    

    三次握手、四次挥手的目的是什么(面试)

    三次握手的目的是保证双方都准备好了资源
    四次挥手是为了保证双方都释放掉了资源
    
    

    四次挥手的过程(面试)

    当客户端一旦调用了close,应用程序虽然看起来没效果,但是操作系统底层已经发了一个包,也就是第一次挥手。
    由于发送的tcp的数据包,所以有约定。服务器会做两件事情,第一件:马上就会给客户端回复,也就是第二次挥手,此时客户端也就知道了,第一次挥手成功了。
    第二件:服务器在接收到第一次挥手之后,操作系统底层会调用套接字的recv截阻塞,如果判断没有数据,就会调用close,也就是第三次挥手
    客户端就会进行第四次挥手,告诉服务端,自己已经收到了
    
    

    服务器的第三次挥手什么时候发(面试)

    服务器什么时候调用了close什么时候发,约定的就是,上图recv截阻塞之后,如果收不到对方的数据,就调用close。
    

    相关文章

      网友评论

          本文标题:TCP三次握手四次挥手

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