首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏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腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表

    48430编辑于 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(时间等待)状态。

    60120编辑于 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)这边已经正确收到了 至此服务器到客户端的连接关闭 客户端到服务器的连接也关闭了 四次挥手保证了双端正确的断开连接 发布者:全栈程序员栈长,转载请注明出处

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

    TCP四次挥手

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

    31130编辑于 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.8K11编辑于 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提供了连接的一方在结束它的发送后还能接受来自另一端数据的能力。

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

    Networks 02 - TCP四次挥手

    CP四次挥手 过程 ? A发送连接释放报文段, FIN = 1. B收到后发出确认, 这个时候TCP处于半关闭状态. B能向A发送数据, A不能向B发送数据. A收到后发送确认请求, 进入TIME-WAIT状态, 等待2个MSL(最大报文存活时间)后释放连接. B收到A的确认后释放连接. 四次挥手的原因 客户端发送FIN释放报文请求后, 服务器收到这个报文, 就会进入CLOSE-WAI状态. 这个状态是为了让服务器发送还未传送完毕. 传送完毕后服务器会发送FIN连接释放报文. 客户端接收到服务器的FIN报文后进入TIME_WAIT状态, 并不是直接进入CLOSED状态, 需要等待2MSL. 原因有二: 确保最后一个确认报文到达.

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

    TCP四次挥手原因

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

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

    TCP四次挥手原理

    我们知道TCP建立连接时需要三次握手,而TCP连接释放则需要四次挥手,是不是很像诗中描述的意境——见面很难,分开更难。 如果你还不清楚相见之难—TCP三次握手过程,可以看我的上篇博文TCP三次握手原理,这样便于你更好理解TCP四次挥手释放连接的过程。 二、TCP四次挥手过程 TCP四次挥手指的是TCP连接释放过程, 不同于TCP连接建立时的三次握手过程,TCP连接释放过程更加复杂。 下面我们一起来看下TCP四次挥手的过程都发生了什么。 第四次挥手:client收到server连接释放报文后,给出确认报文(ACK=1,ack=w+1,seq=u+1),此时连接还没释放掉,client要时间等待计时器设置的2MSL的时间,才最终进入CLOSED

    42530编辑于 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状态,完成四次挥手2MSL的 TIME WAIT的时间? 之内收到该FIN,因此A只需要等待2MSL。

    45340编辑于 2022-05-13
  • 来自专栏Java

    面试题:四次挥手

    面试题:四次挥手 四次挥手是TCP协议用于关闭连接的过程,保证数据正常传输并释放资源。具体地,四次挥手的过程如下: 客户端向服务器发送一个FIN(结束)包,表示客户端没有数据要发送了。 客户端收到FIN包后,向服务器发送ACK包以确认收到请求,然后进入TIME_WAIT状态,等待两倍于最长报文段生命周期(Maximum Segment Lifetime, 简称MSL)时间(2MSL长度的时间 四次挥手目的是为了保证所有数据都能正确传输,并释放占用的TCP相关资源。任何一方都不能直接退出,得确保另一方成功退出后再退出,以免由于网络拥堵等原因,对方仍需要完成相关操作。

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

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

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

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

    窗口:占2个字节。窗口值作为接收方让发送方设置其发送窗口的依据。 检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分。 04 — TCP 关闭连接:四次挥手过程 数据传输完毕后,双方都可以释放连接. 3, 客户端收到服务器的确认请求后,此时客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最终数据) 4, 服务器将最后的数据发送完毕后,就向客户端发送连接释放报文 时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。 为什么建立连接是三次握手,关闭连接确是四次挥手呢? 建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。

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

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

    服务器端回应客户端,是三次握手中的第2个报文段,同时带ACK标志和SYN标志。表示对刚才客户端SYN的回应;同时又发送SYN给客户端,询问客户端是否准备好进行数据通讯。 服务器发出段2,也带有SYN位,同时置ACK位表示确认,确认序号是1001,表示“我接收到序号1000及其以前所有的段,请你下次发送序号为1001的段”,也就是应答了客户端的连接请求,同时也给客户端发出一个连接请求 四次挥手: 所谓四次挥手(Four-Way-Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。 客户端向服务器发出取消连接请求 服务器向客户端返回一个响应,表示收到请求 服务器向客户端发出确认取消请求 客户端再次确认连接取消 为什么握手只有三次,挥手却要四次 因为握手的时候两端没有连接 ,只要确认连接就行 但是挥手的时候是已经连接了,这个时候服务器要在第二次握手以后处理最后的数据,处理完最后数据跟客户端确认了才能取消 关闭连接(四次握手)的过程: 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭

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

    TCP 四次挥手的过程

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

    39520编辑于 2022-08-24
  • 来自专栏CSDN搜“看,未来”

    三次握手 && 四次挥手

    syn攻击 预防SYN攻击 四次挥手 TCP的半关闭 普通问题解答 TCP状态变迁图 2MSL等待状态 端口被占用 解决CLOSE_WAIT、TIME_WAIT连接状态过多正确姿势 正确的tcp优化姿势 为什么握手只要三次,挥手四次? 专治难题 第一次握手失败 第二次握手失败 第三次握手失败 第一次挥手失败 第二次挥手失败 第三次挥手失败 第四次挥手失败 TCP连接的建立与终止 TCP是一个面向连接的协议。 ---- 四次挥手 建立一个连接需要三次握手,而终止一个连接要经过 4次握手。这由TCP的半关闭(half-close)造成的。 三次握手,四次挥手,哈哈。。。 还记得那天晚上,我们躺在草坪上看星星,你问我的那个问题吗?我给你的答复,很快我就要达成了。你的答复是啥来着?我忘了,忘咯。

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

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

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

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

    TCP三次握手四次挥手

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

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

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

    来源:公众号【编程珠玑】 作者:守望先生 前言 在《网络编程-从TCP连接的建立说起》中介绍了TCP的三次握手以及一些常见问题,那么四次挥手又有哪些需要特别关注的问题?四次挥手你真的懂了吗? 四次挥手 四次挥手的流程在很多地方都可以看到,这里简略介绍一下,其最常见流程如下图所示: ? 2MSL时间结束后,无论服务端是否收到最终ACK,客户端完全结束连接 作为一种最常见的四次挥手场景,我们可能习以为常了,但需要注意的是,连接的断开并不只有这种情况,还可以是服务端发起主动关闭,或者双方同时发起 TIME_WAIT状态的存在主要考虑以下两个方面: 实现可靠的四次挥手 避免收到老的报文 为什么说TIME_WAIT是为了实现可靠的四次挥手呢? 而如果客户端此时处于TIME_WAIT状态,即等待2MSL时间,它还可以再次回应服务端ACK。这也就保证了可靠的四次挥手

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

    TCP四次挥手和TIME_WAIT

    而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用 (主动方) FIN_WAIT_2 :实际上FIN_WAIT_2状态下的SOCKET,表示半连接 ,也即有一方要求close连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。 同时关闭 为什么需要四次挥手? 那可能有人会有疑问,在tcp连接握手时为何ACK是和SYN一起发送,这里ACK却没有和FIN一起发送呢。 (最后一个ACK可能丢失并导致HOST2重新发送FIN消息,导致老连接的包会干扰新连接) TIME_WAIT占用的资源 1、TW会占用内存,但是占用内存很小(1W的TW连接占用1M左右) 2、对CPU也是有影响的 状态;(说明如果没有数据被丢弃,也是正常的四次挥手;不是rst) 3)设置 l_onoff 为非0,l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)。

    80020编辑于 2022-08-25
领券