TCP的三次握手和四次挥手

BitLuminaryMaster
• 阅读 3446

目录

  • 名词解释
  • TCP的三次握手

    • TCP建立链接的步骤
    • TCP的三次握手步骤
    • 思考:TCP握手为什么不是两次 or 四次?
  • TCP的四次挥手

    • TCP断开链接的步骤
    • TCP的四次挥手步骤
    • 思考:为什么断开链接的时候要多一个步骤2呢?
    • 思考:为什么最后客户端确认断开链接之后还要等待2WSL呢?
  • 面试题:TCP为什么是3次握手,4次挥手?
这是一个计算机网络中一个很热门,很基础的问题,也是面试常考的一个题,如果你会那不稀奇,如果你不会,那就会凉凉。我这里来对我学的东西做一个整理,看完时候对这里的知识应该会很清晰。首先先来名词解释,如果遇到不清晰的名词,记得反过头来看。

名词解释

  • TCPTCP在计算机网络模型的传输层,对应的是主机到主机的传输,为应用间通信提供能力。TCP 是一个双工协议,数据任何时候都可以双向传输,这就意味着客户端和服务端可以平等地发送、接收信息。
  • 链接:是传输层的概念,链接是一种传输数据的行为,是网络行为状态的记录。在传输之前,建立一个链接,就是在数据收发双方的内存中都建立一个用于维护数据传输状态的对象,里面记录了双方的IP和端口号,状态是怎样,传输速度是如何等。
  • 双工/单工
名称概念线路数量
单工在任何一个时刻,如果数据只能单向发送只需1条( =1 )
半双工在某个时刻数据可以向一个方向传输,也可以向另一个方向反方向传输,而且交替进行至少 1 条( >= 1 )
全双工任何时刻数据都可以双向收发大于 1 条( >1 )
  • 握手TCP的握手目的是为了建立稳定的链接通道。
  • 挥手TCP的挥手目的是为了断开链接。
  • WSL(Maximum Segment Lifetime):报文最大生存时间,TCP允许不同的实现可以设置不同的WSL值。
  • seq序号:用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记📌。
  • ack确定序号:只有ACK标志为1时,确认序号字段才有效,ack = seq + 1
  • 标志位:

    • SYN(Synchronization):一个 Host主动向另一个 Host 发起连接,请求同步。
    • ACK(Acknowledgement):因为要保持连接和可靠性约束,TCP 协议要保证每一条发出的数据必须给返回。接收方收到数据后,都需要给发送方一个响应确认序号有序。
    • RST(Reset):重置链接
    • FIN(Finish):一个 Host 主动断开请求,请求完成
    • PSH(Push):一个 Host 给另一个 Host 发送数据,数据推送
    • ...

TCP的三次握手

TCP的三次握手,相对来说是一个比较完整的机制,旨在建立稳定的传输通道。

TCP建立链接的步骤

下面来看一下TCP建立链接的6个步骤:

  1. 客户端发消息给服务端(SYN)
  2. 服务端准备好进行连接
  3. 服务端针对客户端的(SYN)给一个(ACK)
  4. 服务端发送一个(SYN)给客户端
  5. 客户端准备就绪
  6. 客户端给服务端发送一个(ACK)

其中,2和5步骤是不需要进行握手的,3和4是可以合并到一起的。所以虽然建立链接要6步但是只需要三次握手,分别是1,3+4,6。

TCP的三次握手步骤

下面我们把三次握手的过程还原一下:

TCP的三次握手和四次挥手

  • 开始客户端和服务端都处于CLOSED的状态,客户端发送SYN=1给服务端表示要求建立链接,并且发送了一个seq序号,这个时候客户端的状态变成SYN-SEND
  • 服务端收到消息返回一个ACK=1表示确认收到,还有ack确定序号,是上一个seq序号+1,即x+1,还有本次的seq序号y,还有一个SYN=1建立链接,这个时候服务端状态变成SYN-REVD
  • 客户端收到消息之后向服务端发送一个ACK=1表示确认收到,还有一个新的seq序号是x+1,还有一个ack确定序号是上一个seq序号+1,即y+1。完成之后客户端的状态编程ESTABLISHED
  • 服务端接收到消息之后状态也变成ESTABLISHED,链接通道建立。

简要总结就是:

  1. 客户端 -> SYN -> 服务端
  2. 客户端 <- SYN+ACK <- 服务端
  3. 客户端 -> ACK -> 服务端

思考:TCP握手为什么不是两次 or 四次?

设想一下,如果只有两次,服务端还没有确定客户端是否准备好了,这样是无法稳定的进行数据传输的。如果四次,服务端根据客户端的ACK再给客户端回复一个ACK,没有什么很大的作用还造成资源浪费,那就是很没有必要的事情了。三次正好既可以保证可靠传输,也可以提高传输效率,

TCP的四次挥手

TCP的挥手旨在把链接状态断开

TCP断开链接的步骤

  1. 客户端发消息要求断开链接(FIN)
  2. 服务端接收到请求后,会先对自己是否收到请求回应(ACK)
  3. 服务端处理剩余的事情,例如服务端还有没有发送完的消息,服务端可能还有发送出去的消息没有得到 ACK;也有可能服务端自己有资源要释放等。
  4. 服务端处理完自己的事情,告诉客户端可以关闭链接了(FIN)
  5. 客户端收到FIN,处理自己完成的事情,比如客户端有发送给服务端没有收到 ACK 的请求等。
  6. 客户端处理完成自己的事情,告诉服务端可以关闭(ACK)

其中3和5是不需要进行挥手的,但是注意这里,2和4是无法合并的。所以这里需要四次挥手,分别是1,2,4,6。

TCP的四次挥手步骤

TCP的三次握手和四次挥手

  • 开始客户端向服务端发送FIN=1要断开链接,并且发送了一个seq序号=u,这个时候客户端变成FIN-WAIT1
  • 服务端接收到消息之后,返回一个ACK=1确定消息,还有ack确认序号,是上一个seq序号+1,即u+1,还有一个新的seq序号为v,此时服务端的状态变成CLOSE-WAIT,客户端收到消息之后,状态会变成FIN-WAIT2
  • 等服务端准备好所有的东西可以关闭链接的时候,向客户端发送ACK=1,还要发送ack确认序号,上一个seq序号+1,即u+1,还有一个新的seq序号为w,还要发送一个FIN=1。如果有之前没有发送完的数据,会跟着这次请求一并发送给客户端。此时服务端的状态变成LASE-ACK
  • 客户端收到消息之后,把自己这里的东西都完成向服务端发送ACK=1确认消息,还发送了ack确认序号,上一个seq序号+1,即w+1,还有一个新的seq序号为u+1,然后客户端的状态就变成了TIME-WAIT,这种状态会持续2WSL,如果等待的这段时间不再收到后端的消息,2WSL之后会变成CLOSED。服务端接收到消息之后,状态也变成CLOSED

简要总结就是:

  1. 客户端 -> FIN -> 服务端
  2. 客户端 <- ACK <- 服务端
  3. 客户端 <- FIN <- 服务端
  4. 客户端 -> ACK -> 服务端

思考:为什么断开链接的时候要多一个步骤2呢?

因为断开链接服务端接收到FIN时,断开连接要处理的问题比较多,不能直接关闭链接,这个时候如果不发送ACK回应说是内容收到了,客户端是无法判断这个消息服务端收到没有,不能让客户端在这种情况下等太久,所以应该先回复一个ACK报文说是收到了,你等会我这里还有事情要处理。等到服务端的事情都处理完毕了,再发送一个FIN,确定可以断开链接了。

思考:为什么最后客户端确认断开链接之后还要等待2WSL呢?

  • 第一用于保证客户端发送的最后一个ACK报文可以到达服务器,如果这个ACK报文丢失,服务器会觉得客户端没有收到我发的请求断开报文,于是服务器就会重发一次,如果客户端在这个2MSL时间段内收到重传的报文,就会重新给出回应报文,还会重启2MSL计时器。
  • 第二是在这个2WSL时间中,可以使本链接持续时间内产生的所有报文段从网络中消失,这样新的TCP三次握手的时候就不会出现旧链接中失效的请求报文。

面试题:TCP为什么是3次握手,4次挥手?

TCP在传输层,对应主机到主机的传输,为应用通信提供能力,且TCP是一个双工协议,为了保证双方都建立稳定而高效的数据传输,使用三次握手和四次挥手的工作机制。

三次握手的步骤是:

  1. 客户端向服务端发送SYN建立链接的请求(大哥,能建立链接吗?)
  2. 服务端要将ACK+SYN打包为一条消息回复(老妹儿,我收到你的消息了,可以进行链接,你收到了吗?)
  3. 客户端接收到消息之后给服务端发送ACK作为回复(好嘞,走起~),这个时候数据传输通道建立。

为什么不是两次,是因为客户端不返回ACK,那么服务端不知道客户端有没有接收到消息,如果是四次,根据ACK再返回一次ACK,浪费带宽且没有必要。

四次挥手的步骤是:

  1. 客户端向服务端发送FIN断开链接的请求(大哥,我这边东西都发完了,断开链接吧~)
  2. 服务端接收到信息,给客户端发送一个ACK进行回复(老妹儿?要断开链接?我知道了,你稍等会儿啊)
  3. 服务端处理完需要处理的事情,返回FIN给客户端(我这边完事儿了,断开链接吧~)
  4. 客户端收到消息,处理完自己的事情,返回ACK给服务端(好嘞,掰掰~),这个时候数据传输通道断开。

为什么这里是四次,是因为断开链接服务端收到FIN的时候,还有一些事情要处理,需要一些时间,这个时候不能让客户端等太久,所以先回复一个ACK表示消息已经收到了,这边有东西要处理稍微等一下。等到事情处理完,再给客户端发送FIN同意断开链接。

其实这个很好理解,在生活中,我们收到对方发送的一个文件或者一个视频,这个时候他们需要我们根据内容进行回复或者点评。我们应该先说一句内容收到了,我看看给你回复,这样不会让对方有疑问半天没有回复是没有收到还是收到了正在看。等我们看完之后再告诉对方他们要的结果。
点赞
收藏
评论区
推荐文章
编程修养 编程修养
4年前
阿里二面,面试官居然把 TCP 三次握手问的这么细致
TCP的三次握手和四次挥手,可以说是老生常谈的经典问题了,通常也作为各大公司常见的面试考题,具有一定的水平区分度。看似是简单的面试问题,如果你的回答不符合面试官期待的水准,有可能就直接凉凉了。本文会围绕,三次握手和四次挥手相关的一些列核心问题,分享如何更准确的回答和应对常见的面试问题,以后面对再刁钻的面试官,你都可以随意地跟他扯皮了。面试TCP的意义
Easter79 Easter79
3年前
tcp编程、socket编程、redis
tcp编程(需要建立连接,三次握手,四次挥手,然后发送信息流,数据包是有序的)udp编程(知道IP、端口直接发送数据,数据包可能是无序的)1、客户端和服务器客!(http
xiguaapp xiguaapp
4年前
tcp的三次握手四次挥手
tcp的三次握手流程:在tcp/ip协议中,tcp协议提供可靠的连接服务,采用三次握手建立一个连接。第一次握手:建立连接时,客户端发送SYN包【synj】到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:服务器收到SYN包,必须确认客户的SYN(ackj1),同时自己也发送一个SYN包(syn
捉虫大师 捉虫大师
3年前
4个实验,彻底搞懂TCP连接的断开
前言看到这个标题你可能会说,TCP连接的建立与断开,这个我熟,不就是三次握手与四次挥手嘛。且慢,脑海中可以先尝试回答这几个问题:四次挥手是谁发起的?如果断电/断网了连接会断开吗?什么情况下没有四次挥手连接也会断开?这不是面试,而是遇到了实际问题,至于是什么问题,容我先卖个关子,本文也不会解答,后面会有一篇专门的文章来说遇到的问题是啥,所以在讲实际问题
Wesley13 Wesley13
3年前
TCP基础 —— 为什么建立连接需要三次握手,而断开连接则需要四次?能不能是三次?
一、TCP包概述一个segment包含header和data两个部分,对于这篇文章需要理解的就是,Sequencenumber和Acknowledgementnumber)这两个字段。TCP的可靠传输就是基于这两个字段来实现的。虽然文章的主旨是三次握手(threewayhandshake)与四次挥手(
Wesley13 Wesley13
3年前
TCP的三次握手与四次挥手
TCP的三次握手与四次挥手一、TCP(TransmissionControlProtocol传输控制协议)TCP是面向对连接,可靠的进程到进程通信的协议TCP是提供全双工服务,即数据可在同一时间双向传输二、TCP报文段(封装在IP数据报
Wesley13 Wesley13
3年前
TCP三次握手和四次挥手
建立TCP连接:三次握手TCP在传输数据之前,首先需要建立好TCP连接,后续所有数据都基于这个已建立的连接来传输,建立TCP连接的过程通常被描述为三次握手屏幕快照2020072716.44.59!TCP三次握手和四次挥手(https://s4.51cto.com/images/blog/202007/27/e095cdb6ee5e99
Wesley13 Wesley13
3年前
TCP连接过程及报文解析
可能大家都听过TCP建立连接时需要经历三次握手和四次挥手的。那么具体的握手挥手的过程是怎么样的呢?这篇文章就通过WireShark抓包来了解TCP连接建立和断开的过程。实验方法:写一段简单的代码代码客户端和服务端,分别部署,让客户端主动像服务器发起连接,随后断开。让WireShark抓股这个过程中产生了哪些包,并对其分析。(注:Wire
Wesley13 Wesley13
3年前
TCP三次握手和四次挥手
TCP建立连接为什么是三次握手,而不是两次或四次?TCP,名为传输控制协议,是一种可靠的传输层协议,IP协议号为6。顺便说一句,原则上任何数据传输都无法确保绝对可靠,三次握手只是确保可靠的基本需要。举个日常例子,打电话时我们对话如下:对应为客户端与服务器之间的通信:!(https://oscimg.oschina.net/oscnet
Stella981 Stella981
3年前
Linux TCP状态TIME_WAIT 过多的处理
首先处理这个问题,我们要知道一些网络知识,要知道tcp那些事,比如说三次握手,和四次挥手......很多人会问,为什么建链接要3次握手,断链接需要4次挥手?让我们一起看下下面的流程图:!(https://oscimg.oschina.net/oscnet/ba31b9bb7eb29744a5d169c56c656df7045.jpg)首先,是三次
Wesley13 Wesley13
3年前
TCP的三次握手和四次挥手
  客户端向服务端请求数据的过程中,如果是TCP协议,则需经历TCP的三次握手和四次挥手,其中具体的过程如下:  三次握手  !(https://oscimg.oschina.net/oscnet/61b5378d18062dca9748bb496c2eb99d11d.jpg)  这个过程其实就是确认对方的收发功能是否都正常的功能,形象表示如