• TCP的分分合合(面试必问)


    TCP连接与断开

    前言

    相信面试过的小伙伴对这个话题应该不陌生,算是面试必问了,三次握手,四次挥手,以及其中的一些衍生问题。
    

    TCP/IP(Transmission Control protocol / Internet Protocol)-传输控制协议,当前热门流行的网络传输控制协议,作用在传输层,同时TCP协议是面向连接的,是可靠的

    HTTP服务器.png

    http客户端.png

    握手

    首先是握手连接图解,

    一般回答的是也是分步骤来回答的;

    1、将三步具体回答出来,每一步做的是什么
    2、将标志位信息解释,同时还有序列号
    3、注意总结为什么需要三次
    

    客户首先发送一个特殊的TCP报文段,服务器用另一个特殊的TCP报文段来响应. 最后客户再用第三个特殊报文段作为响应, 前两个报文段不承载 “ 有效载荷" ,也就是不包含应用层数据; 而第三个报文段可以承载有效载荷,由于在这两台主机之间发送了3个报文段,所以这种连接建立过程常被称为三次握手。

    ​ --《计算机网络-自顶向下方法》

    1. 三次握手建立连接(****步骤)
      1.在一开始的请求当中,先是客户端发送请求,同时将标志位SYN值为1,请求建立连接,并将seq值变为x发送
      2.服务器接收到请求之后,表示同意建立请求,将ACK置1,并将seq变为x+1,同时发送一个数据位y过去
      3.客户端收到请求确认之后,再将收到的心情返回给服务器

    2. FLAG-SYN、ACK、FIN(重点关注

      1. SYN是Synchronize Sequence Numbers用来建立连接时所发送的同步信号
      2. ACK是Acknowledgement用于对收到的数据进行确认,确认的数据由确认序列号表示
      3. FIN是finish,常常在断开连接时候来使用,表明自己不会发送数据了,要断开连接了,但在这个标志位下,是可以接收数据的
    3. 为什么需要三次?

      1. 首先是也是比较重要的目的,确认信息对等。若只有两次握手,其中被请求建立连接的一方并不能确认自己的发报能力和对方的收报能力。因为在这里没有收到反馈,相当于第三次也算是个反馈,这样两者的发报和收报都是可以保证正常与否才建立连接。

      2. 第二是防止超时,假设只有两次请求,常常会有无效的请求被当作有效的,这时会建立了脏连接,此时像B一样,确认同意了建立连接,而A并不会理会。

        image.png

    挥手

    其次是挥手的图解,和上面一样也是有步骤和注意事项的

    1. 步骤(很经典的一个实例)

      1. 男生:我们分手吧(FIN = 1,seq = x)
      2. 女生:好的,分吧,我收拾一下就走;等我收拾完告诉你(ACk = 1, seq = y, ack = x+1)
      3. 女生:我收拾完了,分吧,滚(说完这话,女生不能拥抱男生了)(FIN =1,ACk = 1,seq = w, ack = y+1)
      4. 男生:好的,再见(双方还约定了两个月的过渡时期,才可以分别找新的对象)(Ack = 1,seq = x+1,acl = w+1)
    2. TCP连接时是同步的,但结束时是不同步的,当挥手第二次后宣告的了主动关闭方不会再主动发送数据,但仍然可以接收数据,此时处于半关闭状态。这样被动关闭方有足够的时间去处理以前没有处理完的数据,它可能还有一部分数据没发送出去需要处理,在此之后提出主动关闭连接。所以4次挥手的设计为连接双方都提供了一定的处理扫尾工作的时间,从而显的是必要的。 细比一下,这很人性化,连接不是你想关就关的,就仿佛,你说要停电就立马把电停了。这样让我处于一个窘境,提前为手机充满电的时间都没有。

    3. 关键状态的分析

      1. MSL:Maximum Segment LifeTime报文最大存活时间

      2. TIME_WAIT:在客户端最后一次发送ack报文后,就会进入这个阶段,等待2MSL之后进入closed状态;2MSL是报文在网文上生存的最长时间,在超过这个值就会被丢弃。常常面试会问道,为什么需要这个阶段?不是很浪费资源吗?

        1、可靠的终止TCP连接-确认被动关闭方能够顺利进入closed状态;常常有最后一个ack由于网络没法到达对方,和下面的2MSL问题回答相似
        2、保证让迟来的TCP报文段有足够的时间被识别并丢弃
        

        为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?

        虽然按道理,四个报文都发送完毕,我们可以直接进入CLOSE状态了,但是我们必须假象网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
        
      3. CLOSE_WAIT:发生在被动关闭方收到关闭请求,并做出第一次应答后进入的状态,该状态是在等待关闭,并且通知各个程序线程发送剩余数据,处理后事,关掉一些资源。

    最后

    借鉴了计算机网络书中的知识,还有码出高效的内容,有什么错误请大家及时指出,感谢阅读!!

  • 相关阅读:
    es6---let和const
    node.js开发指南系列(1)partial is not defined
    input唤起键盘影响移动端底部fixed定位
    vue滑动吸顶以及锚点定位
    nodejs开发准备工作(2)
    nodejs开发准备工作(1)
    php基础小知识
    php基础
    git基础
    ps基础
  • 原文地址:https://www.cnblogs.com/yhycoder/p/12742387.html
Copyright © 2020-2023  润新知