TCP三次握手、四次断开详解

       “什么是三TCP次握手、四次断开?”

        这个问题很经典,如果你在面试中只被问到了一个关于 TCP 的问题,那大概率就是关于三次握手的问题。TCP 的重要特性之一就是面向连接,连接双方在发送数据之前必须经历握手的阶段,具体的过程我将展示出来。咱往下看。

三次握手

        建立连接的过程称为握手,握手需要在客户端和服务器之间交换三个TPC报文段。

举一个简单的例子,每扇门都有属于自己的特定钥匙,钥匙丢了,你就无法打开它们了。

虽然此例子并不那么恰当,但是可以类比到三次握手的原因上。如果客户端和服务端有一方出现了

问题,那么它们之间的通讯、资源传输必定会出问题

因此, TCP三次握手的作用就是使客户端和服务端双方都明确自己的责任,保证双方都具有资源接收和发送的能力

        为了方便理解,下面我将结合图片进行讲解

字符释意:

  • ACK: 确认报文段
  • ack: 确认号
  • SYN: 发送连接请求 / 接收报文段
  • seq: 发送数据的第一个字节的序号
  • 图例中的Ss、Sa分别表示 Server send、Server accept(服务端发送能力、服务端接收能力);Cs、Ca分别表示 Client send、Client accept(客户端发送能力、客户端接收能力)

客户端与服务端资源收发的三次握手过程:

1.第一次握手

        第一次握手由客户端发送资源包给到服务端,若该过程正常,则得出结论:

        服务端接收、客户端发送服务正常

2.第二次握手

        第二次握手由服务端发送资源包给到客户端,若该过程正常,则得出结论:

        服务端发送、客户端接收服务正常

3.第三次握手

        第三次握手由客户端发送资源包给到服务端,若该过程正常,则得出结论:

        服务端接收、客户端发送服务正常

        (可能会有小伙伴问了,为什么还要进行第三次握手,前两次不是已经得出服务端客户端接收都正常了吗。其实不是的,第一、二次握手只是在单独的过程中得出服务正常的结论,但是在第二次握手结束后,服务端的接收能力和客户端的发送能力未知,这时候便有了TCP的第三次握手过程)。

        然后通过这三次的握手过程我们可以知道:第二次其实是对第一次握手的补充,而第三次是对第二次握手的补充,最终才能使客户端和,服务端都确认自己的接收、发送能力正常,之后方可进行通信。

        (这就跟我们打电话一样,拨通之后不还得先喂两声确定通没通嘛。)

        并且,要完成两者状态的监测,这之间至少需要三次过程,两次并不足以判断自身的服务态。每一个步骤都相互关联,下一次握手的“响应”由上一次“请求“触发,每次握手得出的结论都是对上一次结果的补充,从而得出最终结果

        三次握手的关键是要确认对方收到了自己的数据包,这个目标就是通过“确认号(ack)”实现的。

四次挥手

        建立连接非常重要,它是数据正确传输的前提;断开连接同样重要,它可以让计算机释放不再使用的资源。如果连接不能正常断开,会造成数据传输错误,而且持续占用资源。

        而关闭连接时,服务端收到客户端的FIN报文时,仅表示对方不再发送数据,但仍然能够接收数据。注意,此时服务端不一定将全部数据都发送给了客户端

因此服务端关闭有两种方式:

  1. 立即关闭

  2. 继续发送一些数据给客户端后,再发送FIN报文给客户端(表示同意关闭连接),是否立刻关闭发送数据通道,需交由上层应用决定

        所以,客户端的ACK和FIN一般都会分开发送,这里就会导致次数增加一

        数据传输完毕后,双方均可释放连接。起初,客户端和服务端均处于ESTABLISHED状态,然后是客户端主动关闭,服务器被动关闭

整个过程差不多如下图:

字符释意:

  • FIN:连接终止位

  • seq:发送的第一个字节的序号

  • ACK:确认报文段

  • ack:确认号

四次挥手过程:

1.第一次挥手

  • 客户端发送第一次挥手,之后由ESTABLISHED状态转为FIN-WAIT-1状态

  • 服务器收到客户端的第一次挥手之后,发送第二次挥手服务器服务器进入CLOSE-WALT状态

2.第二次挥手

  • 客户端收到服务器的第二次挥手,进入FIN-WAIT-2状态,等待服务器关闭

3.第三次挥手

  • 服务器发送第三次挥手,然后进入LAST-ACK状态客户端收到第三次挥手,发送第四次挥手客户端进入TIME-WAIT状态;

4.第四次挥手

  • 服务器收到第四次挥手,进入CLOSED状态,随后客户端也进入CLOSED状态

        我举一个例子:(只是一个大概,方便理解)

  • A:“任务处理完毕,我希望断开连接。”
  • B:“哦,是吗?请稍等,我准备一下。”
  • 等待片刻后……
  • B:“我准备好了,可以断开连接了。”
  • A:“好的,谢谢合作。”

最后TCP的 状态转换过程就跟下面这张图差不多:

  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值