首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏Java项目实战

    TCP四次挥手

    而当通信结束时,需要进行四次挥手来关闭连接。本文将深入探讨TCP四次挥手的过程,并解释为什么TIME_WAIT状态至少设置两倍的MSL(Maximum Segment Lifetime)时间。 第一部分:TCP四次挥手的过程 在正式介绍四次挥手之前,我们先回顾一下TCP三次握手的过程: 客户端向服务器发送一个SYN(同步)报文,请求建立连接。 接下来,我们将详细介绍TCP四次挥手的过程: 客户端向服务器发送一个FIN(结束)报文,请求关闭连接。 服务器收到FIN报文后,回复一个ACK报文,表示接受关闭请求。 确保对方收到最后的ACK报文 在四次挥手的过程中,最后一个ACK报文可能会丢失。如果没有TIME_WAIT状态的等待,那么对方将无法收到这个ACK报文,从而无法确认连接已经关闭。 希望本文对读者理解TCP四次挥手及TIME_WAIT状态有所帮助,欢迎点赞评论互动,共同探讨网络通信的技术细节。 我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

    36730编辑于 2023-09-25
  • 来自专栏全栈程序员必看

    TCP四次挥手过程

    四次挥手 状态转化:A、B连接建立状态ESTABLISHED -> A终止等待1状态FIN-WAIT-1 -> B关闭等待状态2CLOSE-WAIT -> A终止等待2状态FIN-WAIT-2 -> B最后确认状态LAST-ACK -> A时间等待状态TIME-WAIT -> B、A关闭状态CLOSED 四次挥手过程 第一次挥手:A数据传输完毕需要断开连接,A的应用进程向其TCP发出连接释放报文段 第二次挥手:B收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT关闭等待状态,此时的TCP处于半关闭状态,A到B的连接释放。 第三次挥手:当B数据传输完毕后,B发出连接释放报文段(FIN = 1,ACK = 1,序号seq = w,确认号ack=u+1),B进入LAST-ACK(最后确认)状态,等待A 的最后确认。 第四次挥手:A收到B的连接释放报文段后,对此发出确认报文段(ACK = 1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。

    41920编辑于 2022-09-05
  • 来自专栏全栈程序员必看

    简述TCP四次挥手

    四次挥手主要用到了两个标志位(ACK&FIN): ACK 示意参考:TCP三次握手 FIN: 终止数据传输标志位—->当FIN为1的时候代表此数据为终止断开连接的请求 四次挥手流程: 由于TCP连接是双向传输的对等的模式即双工 客户端发送ACK确认关闭连接 此时双方的连接都关闭了即挥手成功 第一次挥手: 客户端向服务器请求断开连接 seq:我(client)这条数据的序列号是300 FIN:我(client)已经没有数据给你发送了 我要断开连接 当服务器收到客户端终止连接请求的时候需要做出响应即第二次挥手 第二次挥手: 服务器表示已经收到了客户端断开连接的请求 ack: 我(server)已经收到你(client)序列号为300 当客户端收到服务器终止连接请求的时候需要做出响应即第四次挥手四次挥手: 服务器表示已经收到了客户端断开连接的请求 ack: 我(client)已经收到你(server)序列号为400的数据了 ACK :客户端表示你(server)断开连接的请求我(client)这边已经正确收到了 至此服务器到客户端的连接关闭 客户端到服务器的连接也关闭了 四次挥手保证了双端正确的断开连接 发布者:全栈程序员栈长,转载请注明出处

    28310编辑于 2022-09-02
  • 来自专栏清菡软件测试

    TCP四次挥手

    一、TCP四次挥手的例子 男生女生建立恋爱关系,一段时间后,他们要分手了。 1.男生:请求分手:我想跟你分手了,可以么? 2.女生收到了消息,发一个确认消息:我收到了你的消息,我同意跟你分手。 二、TCP四次挥手的过程 客户端和服务端正在进行消息的发送。直到有一方消息发送完毕,发一个FIN包,表示我的报文发送完毕了。我想释放连接,主动发了一个释放连接的请求。 TCP四次挥手的过程就完成了。 三、TCP四次挥手的状态 1.刚开始是建立连接的状态。发送报文,直到客户端发送完毕了想释放连接。所以发了个FIN包过去给服务端。

    28130编辑于 2022-03-30
  • 来自专栏全栈程序员必看

    TCP四次挥手详解

    ---- 在开始之前可以先了解一下 TCP三次握手 ---- TCP四次挥手过程和状态变迁 为什么挥手需要四次? 为什么TIME_WAIT等待的时间是2MSL? ---- TCP四次挥手过程和状态变迁 在断开连接之前客户端和服务器都处于ESTABLISHED状态,双方都可以主动断开连接,以客户端主动断开连接为优。 第一次挥手:客户端打算断开连接,向服务器发送FIN报文(FIN标记位被设置为1,1表示为FIN,0表示不是),FIN报文中会指定一个序列号,之后客户端进入FIN_WAIT_1状态。 ---- 由客户端到服务器需要一个FIN和ACK,再由服务器到客户端需要一个FIN和ACK,因此通常被称为四次握手。 为什么挥手需要四次? 这是由于TCP的半关闭(half-close)造成的。半关闭是指:TCP提供了连接的一方在结束它的发送后还能接受来自另一端数据的能力。

    12.2K11编辑于 2022-09-05
  • 来自专栏全栈程序员必看

    tcp的四次挥手(为什么三次握手和四次挥手)

    TCP四次挥手过程和状态变迁 在断开连接之前客户端和服务器都处于ESTABLISHED状态,双方都可以主动断开连接,以客户端主动断开连接为优。 第一次挥手:客户端打算断开连接,向服务器发送FIN报文(FIN标记位被设置为1,1表示为FIN,0表示不是),FIN报文中会指定一个序列号,之后客户端进入FIN_WAIT_1状态。 第二次挥手:服务器收到连接释放报文段(FIN报文)后,就向客户端发送ACK应答报文,以客户端的FIN报文的序列号 seq+1 作为ACK应答报文段的确认序列号ack = seq+1 = u + 1。 由客户端到服务器需要一个FIN和ACK,再由服务器到客户端需要一个FIN和ACK,因此通常被称为四次握手。 为什么挥手需要四次? 这是由于TCP的半关闭(half-close)造成的。半关闭是指:TCP提供了连接的一方在结束它的发送后还能接受来自另一端数据的能力。

    83620编辑于 2022-07-29
  • 来自专栏Reck Zhang

    Networks 02 - TCP四次挥手

    CP四次挥手 过程 ? A发送连接释放报文段, FIN = 1. B收到后发出确认, 这个时候TCP处于半关闭状态. B能向A发送数据, A不能向B发送数据. 四次挥手的原因 客户端发送FIN释放报文请求后, 服务器收到这个报文, 就会进入CLOSE-WAI状态. 这个状态是为了让服务器发送还未传送完毕. 传送完毕后服务器会发送FIN连接释放报文.

    28320发布于 2021-08-11
  • 来自专栏全栈程序员必看

    TCP四次挥手原理

    我们对TCP三次握手耳熟能详,那么你知道TCP四次挥手过程吗? 一、前言 唐代诗人李商隐在《无题》诗中写到:“相见时难别亦难,东风无力百花残”,表达了自己与心爱之人相见之难、离别之苦。 我们知道TCP建立连接时需要三次握手,而TCP连接释放则需要四次挥手,是不是很像诗中描述的意境——见面很难,分开更难。 如果你还不清楚相见之难—TCP三次握手过程,可以看我的上篇博文TCP三次握手原理,这样便于你更好理解TCP四次挥手释放连接的过程。 二、TCP四次挥手过程 TCP四次挥手指的是TCP连接释放过程, 不同于TCP连接建立时的三次握手过程,TCP连接释放过程更加复杂。 下面我们一起来看下TCP四次挥手的过程都发生了什么。

    33230编辑于 2022-09-05
  • 来自专栏软件工程

    TCP的四次挥手

    "挥手是为了终止TCP连接" ``` TCP采用四次挥手来释放连接 第一次挥手:Client发送一个FIN,用来关闭Client到Server的数据传送,Client进入FIN_WAIT_1状态; 发送一个FIN,用来关闭 Server到Client的数据传送,Server 进入LAST_ACK状态; 第四次挥手:Client收到FIN后,Client 进入TIME_WAIT状态,接着发送一个ACK 给Server,确认序号为收到序号+1,Server 进入CLOSED状态,完成四次挥手。 ``` 为什么会有TIME_WAIT状态 原因&作用 确保有足够的时间让对方收到ACK包(如果在这个时间之内,对面说没收到,我们这边都可以进行重传) 避免新旧连接混淆 为什么需要四次挥手才能断开连接    服务器出现大量CLOSE_WAIT状态的原因   对方关闭socket连接,我方忙于读或写,没有及时关闭连接 解决方案 检查代码,特别是释放资源的代码 检查配置,特别是处理请求的线程配置 为什么四次挥手要有

    36840编辑于 2022-05-13
  • 来自专栏全栈程序员必看

    TCP四次挥手原因

    在代码层面来理解: 当我们服务端的read函数返回0,说明客户端的数据已经到结尾了,然后客户端半关闭事件喽 当服务端close返回的时候,说明4次挥手成功,连接关闭喽。 相同概念,所以客户端和服务端各自都来关一次,就4次挥手 接下来两次挥手 综合起来就是: 这里大家是不是还会有一个小疑问?半关闭后的客户端为什么还能发送ACK呢? 四次挥手: 主动关闭连接请求端,发送FIN标志位。 被动关闭连接请求端,应答ACK标志位。 ————–半关闭完成 被动关闭连接请求端,发送FIN标志位。 主动关闭连接请求端,应答ACK标志位。

    35010编辑于 2022-08-27
  • 来自专栏Java

    面试题:四次挥手

    面试题:四次挥手 四次挥手是TCP协议用于关闭连接的过程,保证数据正常传输并释放资源。具体地,四次挥手的过程如下: 客户端向服务器发送一个FIN(结束)包,表示客户端没有数据要发送了。 四次挥手目的是为了保证所有数据都能正确传输,并释放占用的TCP相关资源。任何一方都不能直接退出,得确保另一方成功退出后再退出,以免由于网络拥堵等原因,对方仍需要完成相关操作。

    10310编辑于 2025-01-21
  • 彻底弄懂TCP四次挥手

    上篇文章讲述了TCP三次握手原理,这次来了解一下TCP四次挥手,废话不多说,上图,一目了然: 最开始客户端和服务端都是处于ESTABLISHED状态,数据传输完毕,双方都可以释放连接 ,这里以客户端主动释放连接为例: 第一次挥手:客户端发送断开连接报文,报文首部FIN置为1,其序号为u,报文发出后,客户端进入FIN-WAIT-1状态。 第四次挥手:客户端收到服务端发送过来连接释放报文后,向服务端发送一个确认报文,ACK置为1,ack=w+1,序号Seq=u+1,客户端随即进入TIME-WAIT状态。 第四次挥手为什么要等待2MSL? 要弄懂第四次挥手为何要等待2MSL时间,需要明白TIME-WAIT状态的目的: > 优雅的关闭 TCP 连接,保证被动关闭的一端收到它自己发出去的 FIN 报文的 ACK 确认报文;

    39410编辑于 2025-05-20
  • 来自专栏全栈程序员必看

    tcpip四次握手三次挥手_tcp四次挥手的全过程

    04 — TCP 关闭连接:四次挥手过程 数据传输完毕后,双方都可以释放连接. 为什么建立连接是三次握手,关闭连接确是四次挥手呢? 建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。

    42220编辑于 2022-11-15
  • 来自专栏全栈程序员必看

    TCP 四次挥手的过程

    1、四次挥手的过程 1、刚开始双方处于ESTABLISHED状态。 2、客户端要断开了,向服务器发送 FIN 报文,在 TCP 报文中的位置如下图: 发送后客户端变成了FIN-WAIT-1状态。 客户端需要等待足够长的时间,具体来说,是 2 个 MSL(Maximum Segment Lifetime,报文最大生存时间), 在这段时间内如果客户端没有收到服务端的重发请求,那么表示 ACK 成功到达,挥手结束 1 个 MSL 确保四次挥手中主动关闭方最后的 ACK 报文最终能达到对端 1 个 MSL 确保对端没有收到 ACK 重传的 FIN 报文可以到达 这就是等待 2MSL 的意义。 3、为什么是四次挥手而不是三次? 因为服务端在接收到FIN, 往往不会立即返回FIN, 必须等到服务端所有的报文都发送完毕了,才能发FIN。 这就造成了四次挥手。 如果是三次挥手会有什么问题? 等于说服务端将ACK和FIN的发送合并为一次挥手,这个时候长时间的延迟可能会导致客户端误以为FIN没有到达客户端,从而让客户端不断的重发FIN。

    32120编辑于 2022-08-24
  • 来自专栏全栈程序员必看

    tcp协议的三次握手和四次挥手_tcp为什么是四次挥手

    四次挥手: 所谓四次挥手(Four-Way-Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。 客户端向服务器发出取消连接请求 服务器向客户端返回一个响应,表示收到请求 服务器向客户端发出确认取消请求 客户端再次确认连接取消 为什么握手只有三次,挥手却要四次 因为握手的时候两端没有连接 ,只要确认连接就行 但是挥手的时候是已经连接了,这个时候服务器要在第二次握手以后处理最后的数据,处理完最后数据跟客户端确认了才能取消 关闭连接(四次握手)的过程: 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭

    54310编辑于 2022-11-10
  • 来自专栏CSDN搜“看,未来”

    三次握手 && 四次挥手

    为什么握手只要三次,挥手四次? 专治难题 第一次握手失败 第二次握手失败 第三次握手失败 第一次挥手失败 第二次挥手失败 第三次挥手失败 第四次挥手失败 TCP连接的建立与终止 TCP是一个面向连接的协议。 ---- 四次挥手 建立一个连接需要三次握手,而终止一个连接要经过 4次握手。这由TCP的半关闭(half-close)造成的。 TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。 为何建立连接时一起传输,释放连接时却要分开传输? 三次握手,四次挥手,哈哈。。。 还记得那天晚上,我们躺在草坪上看星星,你问我的那个问题吗?我给你的答复,很快我就要达成了。你的答复是啥来着?我忘了,忘咯。

    91110发布于 2021-10-09
  • 来自专栏全栈程序员必看

    tcp四次挥手,为什么是四次?「建议收藏」

    上一篇博客说了三次握手为什么是是三次(点这里),那么现在就介绍一下四次挥手。 大家都知道TCP是全双工的,再建立连接时的三次握手中的SYN和ACK一起发送,这里就会有疑问,为什么在四次挥手的时候没有将SYN和ACK一起发送呢?带着这个问题继续向下看,答案就在其中。    说到四次挥手,顾名思义,就是在关闭连接的时候双方一共要操作四次,来看一下这四次都是怎么操作的:   从图中可以看出来,在四次挥手的时候双方一共进入了六种状态,这六种状态就是理解四次挥手的关键所在 ,我们来看一下 四次挥手的状态 FIN_WAIT_1:这个状态和FIN_WAIT_2状态都在再等待对方的回复,但是这两种状态是有区别的,FIN_WAIT_1就是主动方在ESTABLISHED状态的时候 TIME_WAIT在四次挥手中有着不可替代的位置,如果没有TIME-WAIT,主动方就会直接进入CLOSED状态,(假设主动方时客户端,被动方时服务端)这时候如果立即重启客户端使用相同的端口,如果因为网络中种种原因最后一次

    46130编辑于 2022-08-22
  • 来自专栏code-x

    TCP三次握手四次挥手

    至此 A B 双方都确认了对方可以正常发送消息 四次挥手是为了保证数据已经完整的发送完成 图片 A向B发送, 我要关闭了, 那此时的A肯定没有数据要向B发送的 B向A发送ack表示收到关闭请求, 但此时

    26010编辑于 2022-08-17
  • 来自专栏编程珠玑

    网络编程-再看TCP的四次挥手

    来源:公众号【编程珠玑】 作者:守望先生 前言 在《网络编程-从TCP连接的建立说起》中介绍了TCP的三次握手以及一些常见问题,那么四次挥手又有哪些需要特别关注的问题?四次挥手你真的懂了吗? 四次挥手 四次挥手的流程在很多地方都可以看到,这里简略介绍一下,其最常见流程如下图所示: ? 我们直接看看四次挥手有哪些需要注意的。 什么是TCP的半关闭 TCP半关闭指的是一端结束发送后还能够接受来自另一端的数据。 为什么要四次挥手 为什么建立一个TCP连接需要三次握手,而终止一个连接需要四次挥手呢?这是因为TCP半关闭造成的。由于一个TCP连接是全双工的,在两个方向上都能传输数据,因此两个方向就需要单独关闭。 TIME_WAIT状态的存在主要考虑以下两个方面: 实现可靠的四次挥手 避免收到老的报文 为什么说TIME_WAIT是为了实现可靠的四次挥手呢?

    74920发布于 2019-07-16
  • 来自专栏全栈程序员必看

    TCP四次挥手和TIME_WAIT

    同时关闭 为什么需要四次挥手? 那可能有人会有疑问,在tcp连接握手时为何ACK是和SYN一起发送,这里ACK却没有和FIN一起发送呢。 0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态;(说明如果没有数据被丢弃,也是正常的四次挥手

    65820编辑于 2022-08-25
领券