• 对TCP连接的“三次握手”和“四次挥手”详解!【不要再傻傻分不清了】


    三次握手

    由于 TCP 是面向有连接的通信协议,所以在数据传输之前需要建立好客户端与服务器端之间的连接,即通常所说的“三次握手”,三次握手的作用就是:双方都能明确自己和对方的收发能力是正常的,具体过程分为如下步骤。

     

    • 第一次握手:客户端生成一个随机数seq,假设其值为t,并将标志位SYN设为1,将这些数据打包发给服务器端后,客户端进入等待服务器端确认的状态!
    • 第二次握手:服务器端收到客户端发来的SYN=1的数据包后,知道这是在请求建立连接,于是服务器端将SYN与ACK都设置为1,并将请求包中客户端发来的随机数t加上1后赋值给ack,然后生成一个服务器端的随机数seq=k,完成这些操作后,服务器端将这些数据打包再发回给客户端,作为对客户端简历连接请求的确认应答!
    • 第三次握手:客户端收到服务器端的确认应答后,检查数据包中的ack的字段是否为t + 1,ACK是否等于1,若都正确就将服务器端发来的随机数加1(ack = k + 1),将ACK = 1的数据包再发送给服务器端以确认服务器端的应答,服务器端收到应答包后通过检查ack是否等于k + 1来确认连接是否建立成功!

     【只有连接建立成功后才可开始进行数据的传递,三次握手成功后即可相互传递数据了

                     ...............数据包的传递...........................................】

    当用户关闭标签页或者请求完成后,TCP连接会进行“四次挥手”断开连接【四次挥手的作用就是:确保在断开连接之前数据都是完整传递的,且客户端与服务端都确定可断开连接了】,具体过程如下:

    四次挥手

    • 第一次挥手:由客户端先向服务器端发送FIN = M指令,随后进入完成等待状态FIN_WAIT_!,表明客户端已经没有再向服务器端发送的数据,但若服务器端此时还有未完成的数据传递,可继续传递数据
    • 第二次挥手:当服务器端收到客户端的FIN报文后,会先发送ack=M+1的确认,告知客户端关闭请求已收到,但可能由于服务器端还有未完成的数据窜提,所以请客户端继续等待
    • 第三次挥手:当服务器端确认已完成所有的数据传递后,便发送带有FIN=N的报文给客户端,准备关闭连接
    • 第四次挥手:客户端收到FIN=N的报文后可进行关闭操作,但为保证数据正确性,会回传给服务器端一个确认报文ack=N+1,同时服务器端也在等待客户端的最终确认,如果服务器端没有收到报文则会进行重传,只有收到报文后才会真正断开连接。而客户端在发送了确认报文一段时间后,没有收到服务器端任何信息则会任务服务器端连接已关闭,也可关闭客户端信息。
       

    QA:为什么三次握手连接的TCP客户端最后还要发送一次确认呢?

     

    主要防止已经失效的连接请求报文突然又传送到了服务器,导致重新建立起连接,从而产生错误!

    如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送了第一个请求连接并且没有丢失,只是因为在网络节点中滞留的时间太长了,由于 TCP 的客户端迟迟没有收到确认报文,以为服务器没有收到,此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。此时此前滞留的那一次请求连接,网络通畅了到达了服务器,这个报文本该是失效的,但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。

    如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

     QA:为什么建立连接是三次握手,关闭连接确是四次挥手呢?

    建立连接的时候, 服务器在LISTEN(倾听)状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。

    而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。

    QA:如果已经建立了连接,但是客户端突然出现故障了怎么办? 

    TCP 还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

  • 相关阅读:
    GBase 8a MPP集群管理之虚拟集群镜像表
    【无标题】
    刷题之完全二叉树的权值和小字辈及根据后序和中序遍历输出先序遍历
    SpringBoot学习(六)——springboot整合后台模板
    PyTorch 结构重参数化 RepVGGBlock
    考研五大热门专业排名 考研热门专业排行榜
    分类预测 | Matlab实现PSO-GRU-Attention粒子群算法优化门控循环单元融合注意力机制多特征分类预测
    open stack安装
    RabbitMQ 基本概念、docker安装
    重磅出击,20张图带你彻底了解ReentrantLock加锁解锁的原理
  • 原文地址:https://blog.csdn.net/qq_43143025/article/details/127655660