当前位置:   article > 正文

TCP连接与建立_tcp是怎样建立和连接的

tcp是怎样建立和连接的

TCP连接与建立

文章参考链接:

(视频讲解)https://www.bilibili.com/video/BV15E411K76A/?redirectFrom=h5

(公众号文章)

https://mp.weixin.qq.com/s/8t_KFtrrBkFyZKPJg_y6pw

TCP连接

TCP连接过程中要解决的三个问题
  1. 要使每一方都能够确知对方的存在。

  2. 要允许双方协商一些参数(如最大窗口值,是否选用窗口扩大选项和时间戳选项以及服务质量等)

  3. 能够对运输实体资源进行分配(如缓存大小,连接表中的项目等)

    作用是为了确认双方的(1)接收与(2)发送能力是否正常

TCP连接的建立采用客户服务区方式。TCP连接的过程叫做握手。握手需要在客户服务器之间交换三个TCP报文,称之为三报文握手。主要是为了防止已失效的连接请求报文突然又传送到了,因而产生错误。

TCP连接的建立过程

刚开始双方TCP进程都处于关闭状态,客户主动打开连接,服务器被动打开连接,开始时TCP服务器先创建传输控制块TCB,准备接受客户进程的连接请求,此时服务器处于收听状态,等待客户连接请求。客户TCP进程首先创建传输控制块,在打算建立TCP连接时

  1. 客户端向服务器发出连接请求报文段,其首部中的同步位SYN=1,并选择序号 seq = x ,表明传输数据字节的序号是 x 。

    TCP规定SYN=1的报文段不能携带数据,但要消耗掉一个序号,TCP客户端进入同步已发送状态

  2. 服务器的TCP收到连接请求报文后,如同意则发回确认。

    在确认报文段中应使**SYN=1,ACK =1,**其确认号 ack =x+1,(上一个序号加一),自己选择的序号 seq =y

    需要确认的地方就要有ACK,有ACK就要有ack。

    这个报文段也不能携带数据,但同样要消耗掉一个序号,这时TCP服务器进入TCP同步接收状态

  3. TCP客户端收到确认报文后还要向服务器给出确认,其ACK=1,ack=y+1,(接收到seq+1),seq=x+1(自己上一次请求报文序号+1)

    TCP报文段规定ACK报文段可以携带数据,不携带数据不消耗序号,这种情况下下一个报文段序号仍然是x+1,客户端的TCP通知上层应用进程,连接已经建立,客户端进入已连接状态

    服务器收到确认后也通知上层应用进程,进入已连接状态

    之后就可以进行数据传送

    == 连接小结 ==:

    刚开始双方TCP进程都处于关闭状态(closed),客户主动打开连接,服务器被动打开连接,服务器处于收听状态(listen 状态),等待客户连接请求。

    1. 客户端向服务器发出连接请求报文段:SYN=1seq = x

      TCP客户端进入同步已发送状态(SYN_Send)。

    2. 服务器的TCP收到连接请求报文后,发送确认报文段,SYN=1,ACK =1,ack =x+1 ,seq =y

      TCP服务器进入TCP同步接收状态(SYN_REVD ),使用半连接队列

    3. TCP客户端收到确认报文后还要向服务器给出确认,其ACK=1,ack=y+1seq=x+1

      客户端进入已连接状态(establised )。

      服务器收到确认后也进入已连接状态(establised )。

      主动建立连接的客户端两个状态,被动建立连接的服务端三个状态

为什么是三次?
  • 第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:(1)客户端的发送能力、(2)服务端的接收能力是正常的。

  • 第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:(1)客户端的发送能力、(2)服务端的接收能力、(3)客户端的接收、(4)服务端的发送能力是正常的。

    不过此时服务器并不能确认客户端的接收能力是否正常。

  • 第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常

TCP连接释放

TCP连接释放过程
  • TCP连接释放过程比较复杂。数据传输结束后,通信的双方都可释放连接。TCP连接释放过程是四报文握手(四次挥手)
  1. 客户端的应用进程先向TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。

    连接释放报文段首部FIN=1,其序号seq=u,(u为前面已经传输数据的最后一个字节的序号+1),进入终止等待状态,等待服务器的确认。

    TCP规定FIN即使不携带数据也要消耗掉一个序号

  2. 服务器收到连接释放报文段后,发送确认ACK=1ack=u+1,这个报文段自己的序号seq=v(服务器已经传送的数据的最后一个字节的序号+1),服务器处于关闭等待状态

    • TCP服务器进程通知高层应用进程。
    • 从客户端到服务器这个方向的连接就释放了,TCP连接处于半关闭状态(客户端不再向服务器发送数据),服务器若发送数据,客户端仍然接受
  3. 若服务器已经没有数据要发送,其应用进程就通知TCP释放连接。因为要确认关闭FIN=1,ACK=1,ack=u+1(重复上次半关闭状态的确认号),seq=w。这时服务器进入最终确认状态,等待A的确认。

  4. 客户端在收到服务器的连接释放报文段后必须对其确认,ACK=1,ack=w+1,seq=u+1

    TCP标准,前面发送过的TCP报文段要消耗一个序号,进入时间等待状态。现在TCP报文连接没有释放,必须经过时间等待计时器设置的两倍的最长报文段(MSL)时间寿命后才进入关闭状态

    • 等待原因
      1. 为了保证客户端发送的最后一个ACK报文段能够到达服务器
      2. 防止“已失效的连接请求报文段”,出现在本连接中。
    • 时间等待计时器、保活计时器(服务器每收到数据就重置)

    释放小结

    刚开始都处于建立状态(ESTAB-LISHEN)

    1. 客户端先发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。

      FIN=1,seq=u

      客户端进入终止等待状态FIN_WAIT1),等待服务器的确认。

    2. 服务器收到连接释放报文段后,发送确认ACK=1ack=u+1,seq=v

      服务器处于关闭等待状态CLOSE_WAIT

      客户端收到确认依然在终止等待FIN_WAIT2

    3. 若服务器也要断开,就发送TCP连接释放报文。FIN=1,ACK=1,ack=u+1,seq=w

      服务器进入最终确认状态LAST_ACK),等待A的确认。

    4. 客户端在收到服务器的连接释放报文段后必须对其确认,ACK=1,ack=w+1,seq=u+1

      客户端进入时间等待状态TIME_WAIT)。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入关闭状态 (CLOSED )。

    5. 服务端收到 ACK 报文之后,就处于关闭状态( CLOSED)。

      注意:

      这里特别需要主要的就是TIME_WAIT这个状态了,这个是面试的高频考点,就是要理解,为什么客户端发送 ACK 之后不直接关闭,而是要等一阵子才关闭。这其中的原因就是,要确保服务器是否已经收到了我们的 ACK 报文,如果没有收到的话,服务器会重新发 FIN 报文给客户端,客户端再次收到 FIN 报文之后,就知道之前的 ACK 报文丢失了,然后再次发送 ACK 报文。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/694228
推荐阅读
相关标签
  

闽ICP备14008679号