通俗易懂理解TCP协议三次握手和四次挥手及其常见问题

article/2025/9/15 16:14:22

TCP协议三次握手和四次挥手

  • 三次握手
    • 如果建立连接只需要2次握手,可能会出现的情况
  • 四次挥手
    • 为什么建立连接是三次握手,关闭连接确是四次挥手呢?
    • TIME_WAIT状态有什么作用,为什么主动关闭方没有直接进入CLOSED状态释放资源?
    • 为什么TIME_WAIT状态需要经过2MSL才能进入CLOSE状态?

图片来自网络,侵权请告知,会及时删除

三次握手

形象比喻
将小明当作客户端,小红当作服务器端,两人写信告白:
第一次握手:
小明告诉小红:我喜欢你。
第二次握手:
小红告诉小明:我知道了,我也喜欢你。
此时小红并不确定小明是否收到了告白信,直到
第三次握手:
小明回信:我也知道了,我们在一起吧。此时才真正建立连接。
图片来自网络,侵权请告知,会及时删除

标记位解释
SYN请求号标记位
ACK确认号标记位
seq序号,代表请求方将会发送的数据的第一个字节编号
ack返回的确认号,代表接收方收到收据后(也就是前面说的seq),代表希望对方下一次传输数据的第一个字节编号
状态位解释
CLOSEDclient处于关闭状态
LISTENserver处于监听状态,等待client连接
SYN-RCVD表示server接受到了SYN报文,当收到client的ACK报文后,它会进入到ESTABLISHED状态
SYN-SENT表示client已发送SYN报文,等待server的第2次握手
ESTABLISHED表示连接已经建立
  • 第一次握手:客户端第一次发送一条连接请求数据,SYN = 1,ACK = 0就是代表建立连接请求,发送的具体数据第一个字节编号记为x,赋值seq。

  • 第二次握手:服务端收到请求后,返回 客户端的SYN = 1,加上自己的确认号ACK=1,发送的具体数据第一个字节编号记为y,赋值seq,希望客户端下一次返回编号x + 1个字节为止的数据,记为ack = x + 1。

客户端得出客户端发送接收能力正常,服务端发送接收能力也都正常,但是此时服务器并不能确认客户端的接收能力是否正常

  • 第三次握手:客户端收到服务端返回的请求确认后,再次发送数据,原封不动返回ACK = 1,这里就不需要再发送 SYN=1了,为什么呢?因为此时并不是跟服务端进行连接请求,而是连接确认,所以只需要返回ACK = 1代表确认,同样的,发送的具体数据第一个字节编号记为seq = x + 1,希望服务端下次传输的数据第一个字节编号记为ack = y + 1

为什么TCP建立连接时候,要进行3次握手,2次不行吗?
一句话的答案:主要目的:防止server端一直等待,浪费资源,

如果建立连接只需要2次握手,可能会出现的情况

假设client发出的第一个连接请求报文段,因为网络延迟,在连接释放以后的某个时间才到达server 。
本来这是一个早已失效的连接请求,但server收到此失效的请求后,误认为是client再次发出的一个新的连接请求 。
于是server就向client发出确认报文段,同意建立连接。
如果不采用“3次握手”,那么只要server发出确认,新的连接就建立了 。
由于现在client并没有真正想连接服务器的意愿,因此不会理睬server的确认,也不会向server发送数据 。
但server却以为新的连接已经建立,并一直等待client发来数据,这样,server的很多资源就白白浪费掉了
采用“三次握手”的办法可以防止上述现象发生 ,例如上述情况,client没有向server的确认发出确认,server由于收不到确认,就知道client并没有要求建立连接。

四次挥手

形象比喻
恋爱之后,小明和小红煲电话粥。依旧将小明当作客户端,小红当作服务器端。小明跟小红说话,
第一次挥手:
小明说:我说完了。
第二次挥手:
小红说:好的,我知道了,我还没说完。
小红继续吧啦吧啦,说完之后
第三次挥手:
小红告诉小明:我说完了。
第四次挥手:
小明收到后告诉小红:好的,我知道了。等了2MSL之后小明挂断了。
如果此时小红说完,等了2MSL,小明一直不出声,这个时候就会重新说一次:我说完了。直到收到小明最后的回复,才挂断电话。
图片来自网络,侵权请告知,会及时删除

状态位: FIN = 1:代表要求释放连接

  • 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态。
  • 第二次挥手:Server收到FIN后,发送一个ACK给Client,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),Server进入CLOSE_WAIT状态。
  • 第三次挥手:Server发送一个FIN,用来关闭Server到Client的数据传送,Server进入LAST_ACK状态。
  • 第四次挥手:Client收到FIN后,Client进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,Server进入CLOSED状态,完成四次挥手

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

建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。为了确保正确关闭连接,所以需要四次。

TIME_WAIT状态有什么作用,为什么主动关闭方没有直接进入CLOSED状态释放资源?

答:防止连接关闭时四次挥手中的最后一次ACK丢失:如果主动关闭方进入CLOSED状态后,被动关闭方发送FIN包后没有得到ACK确认,超时后就会重传一个FIN包。如果客户端没有TIME_WAIT状态而直接进入CLOSED状态释放资源,下次启动新的客户端就可能使用了与之前客户端相同的地址信息,有两个危害,第一种是这个刚启动的新的客户端绑定地址成功时,就会收到了一个重传的FIN包,对新连接就会造成影响。第二种是如果该新客户端向相同的服务端发送SYN连接请求,但是此时服务端处于LAST_ACK状态,要求收到的是ACK而不是SYN,因此就会发送RST重新建立请求。

为什么TIME_WAIT状态需要经过2MSL才能进入CLOSE状态?

答:MSL指的是报文在网络中最大生存时间。在客户端发送对服务端的FIN确认包ACK后,这个ACK包有可能到达不了,服务器端如果接收不到ACK包就会重新发送FIN包。所以客户端发送ACK后需要留出2MSL时间(ACK到达服务器器+服务器发送FIN重传包,一来一回)等待确认服务器端缺失收到了ACK包。也就是说客户端如果等待2MSL时间也没收到服务器端重传的FIN包,则就可以确认服务器已经收到客户端发送的ACK包


http://chatgpt.dhexx.cn/article/gYDnUpsu.shtml

相关文章

TCP的三次握手和四次挥手详解

TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接,与之相反的,采用四次挥手来断开连接: TCP标志位有6种标示,即:SYN(建立联机) 、 ACK(确认) 、 PSH(传送) 、…

TCP三次握手和四次挥手详解(面试常见问题)

大概两个月前,一位朋友在面试360集团时,在面试过程中被问及TCP三次握手和四次挥手的相关知识,他当时只知道大概,但当时面试官问他TCP三次握手过程中发送的数字是多少,他一下子就懵住了,因为这也是他第一次参…

详解TCP 三次握手和四次挥手

任 TCP 虐我千百遍,我仍待 TCP 如初恋。 过去不会没关系,今天就让我们来消除这份恐惧,微笑着勇敢的面对它吧! 1、TCP 基本认识 2、TCP 连接建立 3、TCP 连接断开 4、Socket 编程 TCP 基本认识 瞧瞧 TCP 头格式 我们先来看看 TC…

简述三次握手和四次挥手

三次握手 第一次握手:客户端给服务端发送一个SYN报文,并指明客户端的初始化序列号,此时客户端处于SYN_SENT状态 第二次握手:服务端收到客户端的SYN报文之后,会回复SYN报文作为应答,并且也指定了自己的初始…

TCP三次握手和四次挥手最通俗解释说明

TCP三次握手和四次挥手以及11种状态 1、三次握手 置位概念:根据TCP的包头字段,存在3个重要的标识ACK、SYN、FIN ACK:表示验证字段 SYN:位数置1,表示建立TCP连接 FIN:位数置1,表示断开TCP连接 三…

简述TCP三次握手和四次挥手

为了准确无误地把数据送达目标处,TCP 协议采用了三次握手策略。 1.1 TCP三次握手漫画图解 如下图所示,下面的两个机器人通过 3 次握手确定了对方能正确接收和发送消息(图片来源:《图解 HTTP》)。 简单示意图: 客户端–发送带有 SYN 标志的数据包–一次握手–服务端服务…

tcp三次握手和四次挥手

TCP三次握手与四次挥手详解(最全面) 一、TCP 协议简述 TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接。 无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/I…

三次握手和四次挥手详解

详解 TCP 连接的“ 三次握手 ”与“ 四次挥手 ” *TCP connection* 客户端与服务器之间数据的发送和返回的过程当中需要创建一个叫TCP connection(关系,连接)的东西; 由于TCP不存在连接的概念,只存在请求和响应&…

TCP三次握手和四次挥手过程

TCP三次握手和四次挥手过程 1、TCP报文段首部2、TCP三次握手过程及常见问题2.1 TCP三次握手过程2.2 常见问题 3、TCP四次挥手过程及问题3.1 TCP四次挥手过程3.2 常见问题 1、TCP报文段首部 要理解TCP三次握手和四次挥手的过程,首先需要了解TCP报文段的某些首部的含义…

三次握手和四次挥手

三次握手和四次挥手 三次握手四次挥手 ♠ \color{red}{\spadesuit} ♠ ok,上一篇介绍完TCP/IP的常见状态码,对TCP协议有一个大概的了解了,接下来进入TCP协议的(建立连接)三次握手和四次挥手(关闭连接&#…

详解三次握手和四次挥手

三次握手和四次挥手是各个公司常见的考点,也具有一定的水平区分度,也被一些面试官作为热身题。很多小伙伴说这个问题刚开始回答的挺好,但是后面越回答越冒冷汗,最后就歇菜了。 见过比较典型的面试场景是这样的: 面试官&#xff1…

TCP为什么需要3次握手与4次挥手

http://blog.csdn.net/xifeijian/article/details/12777187 为什么需要“三次握手” 在谢希仁著《计算机网络》第四版中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。在另一部经典的《计算机网络》一书中讲“三次…

一文搞懂TCP的三次握手和四次挥手

目录 1、三次握手 2、四次挥手 3、11种状态名词解析 TCP的三次握手和四次挥手实质就是TCP通信的连接和断开。 三次握手:为了对每次发送的数据量进行跟踪与协商,确保数据段的发送和接收同步,根据所接收到的数据量而确认数据发送、接收完毕…

【通俗易懂】三次握手与四次挥手

1.三次握手 三次握手(Three-way Handshake)是指在建立一个TCP连接时,客户端和服务器会一共发送三个报文段。 初始时客户端和服务器都处于CLOSED状态,当服务器应用程序创建一个监听套接字时,服务器处于LISTEN状态。 …

面试官,不要再问我三次握手和四次挥手

温馨提示:本篇文章会长期维护及更新,详情见:https://yuanrengu.com/2020/77eef79f.html 面试相关文章推荐: 面试必备 | 小伙伴栽在了JVM的内存分配策略。。。垃圾收集器(CMS、G1)及内存分配策略Java虚拟机…

C语言数据结构创建矩阵,及代入数据

创建一个这样的矩阵 数据由我们插入(定位坐标行列及插入的数据) 代码如下: 思路:将每个坐标节点和我们插入的节点坐标做对比,如果行列坐标都相等,则value置1并输出其相应的数据,否则value还是为0&#x…

数据结构-树(c语言实现篇)

数据结构之二叉树(c语言实现篇) 介绍树的概念和二叉树的概念和应用,内容主要是以二叉树为主。 1. 树 1.1 树的概念 树是n个结点的有限集,当n0时,称为空树。树是一种非线性的数据结构,与前面的线性表、栈和…

c语言的数据结构表达式求值

最近学习c语言的数据结构中有关栈的实现。下面是用栈实现表达式求值的一个实例,用的是顺序栈的形式 原理: List item 我们默认一‘#’开始,最后输入’#‘结束 在运算中的每一步中,任意两个相继出现的算符theta1和theta2之间的关…

C语言数据结构篇——栈的顺序存储

作者名:Demo不是emo 主页面链接:主页传送门创作初心:对于计算机的学习者来说,初期的学习无疑是最迷茫和难以坚持的,中后期主要是经验和能力的提高,我也刚接触计算机1年,也在不断的探索&#xf…

C语言数据结构之查找(顺序查找,折半查找)

C语言数据结构之查找(顺序查找,折半查找) tips:前些天已经学习了树和图的相关知识,今天来总结下两种常用的查找方式(顺序查找,折半查找)。 为了演示方便,顺序查找和折半…