在网络通信中,TCP(Transmission Control Protocol)是一种可靠的传输协议,它通过三次握手建立连接,实现数据的可靠传输。而当通信结束时,需要进行四次挥手来关闭连接。 本文将深入探讨TCP四次挥手的过程,并解释为什么TIME_WAIT状态至少设置两倍的MSL(Maximum Segment Lifetime)时间。 第一部分:TCP四次挥手的过程 在正式介绍四次挥手之前,我们先回顾一下TCP三次握手的过程: 客户端向服务器发送一个SYN(同步)报文,请求建立连接。 接下来,我们将详细介绍TCP四次挥手的过程: 客户端向服务器发送一个FIN(结束)报文,请求关闭连接。 服务器收到FIN报文后,回复一个ACK报文,表示接受关闭请求。 希望本文对读者理解TCP四次挥手及TIME_WAIT状态有所帮助,欢迎点赞评论互动,共同探讨网络通信的技术细节。 我正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表
一、TCP四次挥手的例子 男生女生建立恋爱关系,一段时间后,他们要分手了。 1.男生:请求分手:我想跟你分手了,可以么? 2.女生收到了消息,发一个确认消息:我收到了你的消息,我同意跟你分手。 这样一个过程同样像极了TCP要断开连接的过程。 二、TCP四次挥手的过程 客户端和服务端正在进行消息的发送。直到有一方消息发送完毕,发一个FIN包,表示我的报文发送完毕了。 TCP四次挥手的过程就完成了。 三、TCP四次挥手的状态 1.刚开始是建立连接的状态。发送报文,直到客户端发送完毕了想释放连接。所以发了个FIN包过去给服务端。
四次挥手 状态转化: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发出连接释放报文段 (FIN = 1,序号seq = u),并停止再发送数据,主动关闭TCP连接,进入FIN-WAIT-1状态,等待B的确认。 第二次挥手:B收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),B进入CLOSE-WAIT关闭等待状态,此时的TCP处于半关闭状态,A到B的连接释放。 第四次挥手:A收到B的连接释放报文段后,对此发出确认报文段(ACK = 1,seq=u+1,ack=w+1),A进入TIME-WAIT(时间等待)状态。
四次挥手主要用到了两个标志位(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)这边已经正确收到了 至此服务器到客户端的连接关闭 客户端到服务器的连接也关闭了 四次挥手保证了双端正确的断开连接 发布者:全栈程序员栈长,转载请注明出处
---- 在开始之前可以先了解一下 TCP三次握手 ---- TCP四次挥手过程和状态变迁 为什么挥手需要四次? 为什么TIME_WAIT等待的时间是2MSL? ---- TCP四次挥手过程和状态变迁 在断开连接之前客户端和服务器都处于ESTABLISHED状态,双方都可以主动断开连接,以客户端主动断开连接为优。 ---- 由客户端到服务器需要一个FIN和ACK,再由服务器到客户端需要一个FIN和ACK,因此通常被称为四次握手。 为什么挥手需要四次? 这是由于TCP的半关闭(half-close)造成的。半关闭是指:TCP提供了连接的一方在结束它的发送后还能接受来自另一端数据的能力。 这一特性是由于TCP双向通道互相独立所导致的,也使得关闭连接必须经过四次握手。 可能有些人会有疑惑:为什么中间的ACK和FIN不可以像三次握手那样合为一个报文段呢?
在代码层面来理解: 当我们服务端的read函数返回0,说明客户端的数据已经到结尾了,然后客户端半关闭事件喽 当服务端close返回的时候,说明4次挥手成功,连接关闭喽。 相同概念,所以客户端和服务端各自都来关一次,就4次挥手 接下来两次挥手 综合起来就是: 这里大家是不是还会有一个小疑问?半关闭后的客户端为什么还能发送ACK呢? 四次挥手: 主动关闭连接请求端,发送FIN标志位。 被动关闭连接请求端,应答ACK标志位。 ————–半关闭完成 被动关闭连接请求端,发送FIN标志位。 主动关闭连接请求端,应答ACK标志位。
"挥手是为了终止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包(如果在这个时间之内,对面说没收到,我们这边都可以进行重传) 避免新旧连接混淆 为什么需要四次挥手才能断开连接 因为TCP连接是全双工(双方都有发送数据和接收数据功能),发送方和接收方都需要FIN报文和ACK报文 有人会说,为什么不像三次握手一样,把第二次挥手和第三次挥手放在一起,我认为这个原因是因为,通常情况下
我们对TCP三次握手耳熟能详,那么你知道TCP四次挥手过程吗? 一、前言 唐代诗人李商隐在《无题》诗中写到:“相见时难别亦难,东风无力百花残”,表达了自己与心爱之人相见之难、离别之苦。 如果把这句诗用在形容TCP连接的建立与释放过程,也很贴切。我们知道TCP建立连接时需要三次握手,而TCP连接释放则需要四次挥手,是不是很像诗中描述的意境——见面很难,分开更难。 如果你还不清楚相见之难—TCP三次握手过程,可以看我的上篇博文TCP三次握手原理,这样便于你更好理解TCP四次挥手释放连接的过程。 二、TCP四次挥手过程 TCP四次挥手指的是TCP连接释放过程, 不同于TCP连接建立时的三次握手过程,TCP连接释放过程更加复杂。 下面我们一起来看下TCP四次挥手的过程都发生了什么。
CP四次挥手 过程 ? A发送连接释放报文段, FIN = 1. B收到后发出确认, 这个时候TCP处于半关闭状态. B能向A发送数据, A不能向B发送数据. 四次挥手的原因 客户端发送FIN释放报文请求后, 服务器收到这个报文, 就会进入CLOSE-WAI状态. 这个状态是为了让服务器发送还未传送完毕. 传送完毕后服务器会发送FIN连接释放报文.
上篇文章讲述了TCP三次握手原理,这次来了解一下TCP四次挥手,废话不多说,上图,一目了然: 最开始客户端和服务端都是处于ESTABLISHED状态,数据传输完毕,双方都可以释放连接 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。 第二次挥手:服务端收到来自客户端发送过来的断开连接报文,随即向客户端回一个确认报文,报文首部ACK置为1,ack=u+1,其序号为v。 第四次挥手:客户端收到服务端发送过来连接释放报文后,向服务端发送一个确认报文,ACK置为1,ack=w+1,序号Seq=u+1,客户端随即进入TIME-WAIT状态。 第四次挥手为什么要等待2MSL? 要弄懂第四次挥手为何要等待2MSL时间,需要明白TIME-WAIT状态的目的: > 优雅的关闭 TCP 连接,保证被动关闭的一端收到它自己发出去的 FIN 报文的 ACK 确认报文;
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。
三次握手: 三次握手表示建立通信阶段,在TCP协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠,由于这种面向连接的特性, TCP协议可以保证传输数据的安全,所以应用十分广泛 在数据传输过程中,ACK和确认序号是非常重要的,应用程序交给TCP协议发送的数据会暂存在TCP层的发送缓冲区中,发出数据包给对方之后,只有收到对方应答的ACK段才知道该数据包确实发到了对方,可以从发送缓冲区中释放掉了 四次挥手: 所谓四次挥手(Four-Way-Wavehand)即终止TCP连接,就是指断开一个TCP连接时,需要客户端和服务端总共发送4个包以确认连接的断开。 客户端向服务器发出取消连接请求 服务器向客户端返回一个响应,表示收到请求 服务器向客户端发出确认取消请求 客户端再次确认连接取消 为什么握手只有三次,挥手却要四次 因为握手的时候两端没有连接 ,只要确认连接就行 但是挥手的时候是已经连接了,这个时候服务器要在第二次握手以后处理最后的数据,处理完最后数据跟客户端确认了才能取消 关闭连接(四次握手)的过程: 由于TCP连接是全双工的,因此每个方向都必须单独进行关闭
TCP四次挥手过程和状态变迁 在断开连接之前客户端和服务器都处于ESTABLISHED状态,双方都可以主动断开连接,以客户端主动断开连接为优。 第一次挥手:客户端打算断开连接,向服务器发送FIN报文(FIN标记位被设置为1,1表示为FIN,0表示不是),FIN报文中会指定一个序列号,之后客户端进入FIN_WAIT_1状态。 由客户端到服务器需要一个FIN和ACK,再由服务器到客户端需要一个FIN和ACK,因此通常被称为四次握手。 为什么挥手需要四次? 这是由于TCP的半关闭(half-close)造成的。半关闭是指:TCP提供了连接的一方在结束它的发送后还能接受来自另一端数据的能力。 这一特性是由于TCP双向通道互相独立所导致的,也使得关闭连接必须经过四次握手。 可能有些人会有疑惑:为什么中间的ACK和FIN不可以像三次握手那样合为一个报文段呢?
至此 A B 双方都确认了对方可以正常发送消息 四次挥手是为了保证数据已经完整的发送完成 图片 A向B发送, 我要关闭了, 那此时的A肯定没有数据要向B发送的 B向A发送ack表示收到关闭请求, 但此时
来源:公众号【编程珠玑】 作者:守望先生 前言 在《网络编程-从TCP连接的建立说起》中介绍了TCP的三次握手以及一些常见问题,那么四次挥手又有哪些需要特别关注的问题?四次挥手你真的懂了吗? 四次挥手 四次挥手的流程在很多地方都可以看到,这里简略介绍一下,其最常见流程如下图所示: ? 我们直接看看四次挥手有哪些需要注意的。 什么是TCP的半关闭 TCP半关闭指的是一端结束发送后还能够接受来自另一端的数据。 为什么要四次挥手 为什么建立一个TCP连接需要三次握手,而终止一个连接需要四次挥手呢?这是因为TCP半关闭造成的。由于一个TCP连接是全双工的,在两个方向上都能传输数据,因此两个方向就需要单独关闭。 TIME_WAIT状态的存在主要考虑以下两个方面: 实现可靠的四次挥手 避免收到老的报文 为什么说TIME_WAIT是为了实现可靠的四次挥手呢?
同时关闭 为什么需要四次挥手? 那可能有人会有疑问,在tcp连接握手时为何ACK是和SYN一起发送,这里ACK却没有和FIN一起发送呢。 和tcp_tw_recycle才能起作用。 另外tcp_timestamps可以解决PAWS和计算RTT的问题。 tcp_tw_reuse 需要开启tcp_timestamps时才有效。 tcp_tw_recycle 快速回收TW,应该是RTO时间内回收。需要开启tcp_timestamps时才有效。 状态;(说明如果没有数据被丢弃,也是正常的四次挥手;不是rst) 3)设置 l_onoff 为非0,l_linger为非0,当套接口关闭时内核将拖延一段时间(由l_linger决定)。
四次挥手 以下内容 摘自 【面试官,不要再问我三次握手和四次挥手】 建立一个连接需要三次握手,而终止一个连接要经过四次挥手(也有将四次挥手叫做四次握手的)。 TCP 连接的拆除需要发送四个包,因此称为四次挥手(Four-way handshake),客户端或服务端均可主动发起挥手动作。 四次挥手的过程如下 1.第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。 Client:好吧,结束吧……(ACK=1,seq=1091,ack=2057) 为什么需要四次挥手 因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。 故需要四次挥手。 总结面试回答 面试官:你了解TCP/IP协议里面的三次握手与四次挥手机制吗?
TCP 三次握手 TCP 连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方的序列号和确认号并交换 TCP 窗口大小信息。 3. .客户端接收到服务器端返回的SYN+ACK报文后,向服务器端返回一个确认号y+1和序号x+1的ACK报文,一个标准的TCP连接完成。 TCP 使用类似的握手过程来结束连接。 /IP协议的连接建立与释放 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接,如图1所示。 TCP采用四次挥手关闭连接如图2所示。 图2 TCP四次挥手关闭连接 1.为什么建立连接协议是三次握手,而关闭连接却是四次握手呢? 本文摘自: 《TCP连接的状态转换图深度剖析》 http://www.diybl.com/course/6_system/linux/Linuxjs/2007104/76065.html TCP三次握手及四次挥手详细图解
书接上文:电脑A(192.168.11.111)启动TCP Server,端口号60000;电脑B(192.168.11.1)启动WireShark,并启动TCP Client 断开TCP连接,需要四次挥手 序列号为0xC0563477+1,确认号为0x57B6972C+1 补充一下TCP连接的各种状态 TCP_S_LISTEN,等待来自任何远程TCP和端口的连接请求 TCP_S_SYN_SENT,在发送连接请求后等待匹配的连接请求 数据传输阶段的正常状态 TCP_S_FIN_WAIT_1,等待来自远程TCP的连接终止请求、或之前发送的连接终止请求的确认 TCP_S_FIN_WAIT_2,正在等待来自远程TCP的连接终止请求 TCP_S_CLOSE_WAIT ,正在等待本地用户的连接终止请求 TCP_S_LAST_ACK,等待来自远程TCP的连接终止请求确认 TCP_S_CLOSING,等待之前发送给远程TCP的连接终止请求的确认(包括其连接终止请求的确认) TCP_S_TIME_WAIT,等待足够的时间以确保远程TCP收到其连接终止请求的确认 TCP_S_CLOSED,表示完全没有连接状态 总结一下,四次挥手长这样
一 TCP四次挥手是什么?以及过程? TCP连接是全双工的,所以客户端client到服务端server的连接需要关闭,同理server到client的连接也需要关闭。 所以TCP四次挥手做的事情就是,关闭两条TCP连接并释放资源。 ? 二 开讲! 和昨天一样,边解释名词,边解释挥手: FIN 关闭序号,是1,它表示关闭连接。 第四次挥手,client告诉server:对于你要关闭向我传输数据的TCP连接这个请求,我也确认收到了。自此,两个TCP连接关闭,释放资源,即ip+port。 2.为什么TCP需要四次挥手?三次挥手不行吗? A:三次还是四次的问题主要集中在,为什么server要把FIN和ACK分到两次数据包发送?打包成一次发送不行吗? 插一个问题:我曾经遇到过一个面试官,问我,如果server也没有数据要发送了,那四次挥手能不能改成三次挥手呢?即server把ACK和FIN打包一起发送?我想了想,确实可以,我回答是。