首先我们再来回顾一下tcp四次挥手的状态,time_wait状态是在主动断开的一方发出的,他的作用和解释可以看这篇 可以看到对端发来FIN报文后客户进入time_wait状态,等待2MSL,MSL...是报文存在的最大时间,客户在发出最后一个ACK之后开始计时,这个ACK传输的最大时间是1MSL,如果这个ACK丢失了,服务端会发起重传,而重传FIN的报文最大到达时间是1MSL,所以考虑到重传,这里需要等待2MSL
本文主要分析为什么TIME_WAIT状态的持续时间是2MSL而不是1MSL,3MSL或其它的时长,而不会详细描述为什么需要TIME_WAIT状态。...这段文字说明了TIME_WAIT状态持续2MSL的时间可以让一个TCP连接的两端发出的报文都从网络中消失,从而保证下一个使用了相同四元组的tcp连接不会被上一个连接的报文所干扰。...如何理解TIME_WAIT状态持续2MSL的时间就可以让一个TCP连接的两端发出的报文都从网络中消失呢?...下面我们开始分析为什么在发送了最后一个ACK报文之后需要等待2MSL时长来确保没有任何属于当前连接的报文还存活于网络之中(前提是在这2MSL时间内不再收到对方的FIN报文,但即使收到了对端的FIN报文也并不影响我们的讨论...综上所述,TIME_WAIT至少需要持续2MSL时长,这2个MSL中的第一个MSL是为了等自己发出去的最后一个ACK从网络中消失,而第二MSL是为了等在对端收到ACK之前的一刹那可能重传的FIN报文从网络中消失
文章目录 前言 正文 前言 本文主要分析为什么 TIME_WAIT 状态的持续时间是 2MSL 而不是 1MSL,3MSL 或其它的时长,而不会详细描述为什么需要 TIME_WAIT 状态。...这段文字说明了 TIME_WAIT 状态持续 2MSL 的时间可以让一个 TCP 连接的两端发出的报文都从网络中消失,从而保证下一个使用了相同四元组的 TCP 连接不会被上一个连接的报文所干扰。...如何理解 TIME_WAIT 状态持续 2MSL 的时间就可以让一个 TCP连 接的两端发出的报文都从网络中消失呢?...下面我们开始分析为什么在发送了最后一个 ACK 报文之后需要等待 2MSL 时长来确保没有任何属于当前连接的报文还存活于网络之中(前提是在这 2MSL 时间内不再收到对方的 FIN 报文,但即使收到了对端的...综上所述,TIME_WAIT 至少需要持续 2MSL 时长,这 2 个 MSL 中的第一个 MSL 是为了等自己发出去的最后一个 ACK 从网络中消失,而第二 MSL 是为了等在对端收到 ACK 之前的一刹那可能重传的
MSL(Maximum Segment Lifetime)报文最大生存时间,2MSL即两倍的MSL,TCP允许不同的实现可以设置不同的MSL值。...,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL...时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。...客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。 ?
那么考虑最坏的情况A在发出Last_ack后,经过MSL的时间才到大B,B就可以正常断开连接了,而B在接收到这个包前一刻重传了Fin包,也经过MSL的时间才到达A,那么A就能在2MSL的时间等到B的最后一个重传...Fin包并处理掉,当然B的重传时间肯定小于MSL,因此A收到B重传的Fin包肯定小于2MSL。...另外MSL也是一个经验值,不同的系统实现默认值也不同,现在的协议栈已经能够处理重复序列号的情况,因此2MSL的时间实际意义也不大。
而2MSL的意思就是2倍的MSL的意思。 ? ? ? ? ? ?...乔戈里:小萌你说得很好,也因此出现了客户端要等待2MSL的情况。...小明与女神的对话: 所处的网络环境:如果客户端不等待2MSL直接进行关闭,前一次的连接的数据还在网络中 ?...这个时候小明以为他的消息会在这2MSL中的时间中消失(小明以为这个TCP是正常的四次挥手),悄悄说了一句女神的坏话,但是悲剧的是这个小明所在的网络环境不是可靠的没有等待2MSL的网络环境,并没有消失,因此如果没有...2MSL的等待时间上一次的小明说的坏话的数据包还在网络中。
文章目录 TCP通信过程的三次握手和四次握手 三次握手: 四次挥手: tcp通信过程中的2MSL的问题: TCP通信过程的三次握手和四次握手 三次握手: 此过程中: 第一次握手,客户端先发一个...的时间再完全断开链接(至于为什么要等待2MSL的时间,请看下文的MSL详解 _ ) 要点:在四次挥手的过程中,哪一方先调用close, 哪一方就会在第三次挥手后继续等待2MSL的时间 tcp通信过程中的...2MSL的问题: 2MSL即为在四次挥手的第三次过程中,先发起中断连接的一方将会继续等待2倍的MSL时间后再完全中断tcp连接 MSL即为一个数据包在网络上存活的最长时间,即数据包从被发送到被接收所经历的最长时间...等待2倍的MSL时间就是因为防止服务端没收到最后一次的ACK,即在2MSL的时间内,若服务端没收到最后的ACK,在超时时间(MSL)后,服务端会认为客户端没收到第三次挥手中的FIN,这时服务端会再发一份...FIN,这时一共经历了2MSL的时间,而客户端此时等待了2MSL的时间,正好可以接收这一次服务端重发的FIN请求,从而有效的保证了所有的请求和回应都会被对方接收 发布者:全栈程序员栈长,转载请注明出处:
此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,A才进入CLOSE状态。 为什么A在TIME-WAIT状态必须等待2MSL(最大报文生存时间)的时间?...这个ACK报文段有可能丢失,使得处于LAST-ACK状态的B收不到对已发送的FIN+ACK报文段的确认,B超时重传FIN+ACK报文段,A能2MSL时间内收到这个重传的FIN+ACK报文段,接着A重传一次确认...,同时重启2MSL计数器,2MSL时间后A和B进入CLOSE状态,如果A在TIME-WAIT状态时接收到B的FIN+ACK报文段之后向B发出确认报文段,而不再确认B是否收到立即进入CLOSED状态,如若...A在发送完最后一个ACK报文段并经过2MSL,会使本次连接持续时间内所有产生的报文段消失,保证在下一次新连接中不会出现旧连接遗留的请求报文段。
客户端处于TIME_WAIT状态时,此时的TCP还未释放掉,需要等待2MSL后,客户端才进入CLOSE状态。...TIME_WAIT等待的2MSL时间,可以理解为数据报一来一回所需要的最大时间。 2MSL时间是从客户端接收到FIN后发送ACK开始计时的。...如果在2MSL时间段内,没有收到任何数据报,客户端则会进入CLOSE状态。 等待2MSL的意义 1.保证客户端最后发送的ACK能够到达服务器,帮助其正常关闭。...服务器会重发FIN报文段,客户端能保证在2MSL时间内收到来自服务器的重传FIN报文段,从而客户端重新发送ACK应答报文段,并重置2MSL计数。...假如客户端不等待2MSL就之间进入CLOSE状态,那么服务器会一直处于LAST_ACK状态。
为什么TIME_WAIT等待的时间是2MSL? 等待2MSL的意义 TIME_WAIT状态过多有什么危害? 如何解决TIME_WAIT状态过多?...TIME_WAIT等待的2MSL时间,可以理解为数据报一来一回所需要的最大时间。 2MSL时间是从客户端接收到FIN后发送ACK开始计时的。...如果在2MSL时间段内,没有收到任何数据报,客户端则会进入CLOSE状态。 等待2MSL的意义 1.保证客户端最后发送的ACK能够到达服务器,帮助其正常关闭。...服务器会重发FIN报文段,客户端能保证在2MSL时间内收到来自服务器的重传FIN报文段,从而客户端重新发送ACK应答报文段,并重置2MSL计数。...假如客户端不等待2MSL就之间进入CLOSE状态,那么服务器会一直处于LAST_ACK状态。
MTU & MSS MSS=MTU-IP包头长-TCP包头长 三次握手 交换初始序列号 交换TCP窗口大小信息 四次挥手 可以三次挥手吗,可以,ack+fin一起发就是三次,启用延迟确认就有三次挥手 2MSL...等待状态 TIME_WAIT状态也称为2MSL等待状态。...这种2MSL等待的另一个结果是这个TCP连接在2MSL等待期间,定义这个连接的插口(客户的IP地址和端口号,服务器的IP地址和端口号)不能再被使用。这个连接只能在2MSL结束后才能再被使用。
为什么客户端在TIME-WAIT阶段要等2MSL? ---- 起因 昨晚模拟面试的时候,发现自己有很多细节没有照顾到位,然后还很飘。 感谢我的老师,九点下班后用他自己宝贵的时间帮我面试。...为什么客户端在TIME-WAIT阶段要等2MSL? 为的是确认服务器端是否收到客户端发出的ACK确认报文 当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。...所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。...2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。...客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段
为什么客户端在TIME-WAIT阶段要等2MSL? 故障模式 网络中断 对端有 FIN 包发出 服务器断开 网络断掉之后,emmm,不知道是一种什么体验,飞机坐过吧,其实还好啦,能忍得了的。...---- 为什么客户端在TIME-WAIT阶段要等2MSL? 为的是确认服务器端是否收到客户端发出的ACK确认报文 当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。...所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。...2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。...客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段
2MSL等待状态 TIME_WAIT状态也称为2MSL等待状态。每个具体 TCP实现必须选择一个报文段最大生存时间MSL(Maximum Segment Lifetime)。...这种2MSL等待的另一个结果是这个 TCP连接在2MSL等待期间,定义这个连接的插口(客户的I P地址和端口号,服务器的 I P地址和端口号)不能再被使用。...这个连接只能在 2MSL结束后才能再被使用。 遗憾的是,大多数 TCP实现(如伯克利版)强加了更为严格的限制。在 2MSL等待期间,插口中使用的本地端口在默认情况下不能再被使用。...它将让调用者对处于2MSL等待的本地端口进行赋值,但我们将看到TCP原则上仍将避免使用仍处于2MSL连接中的端口。 在连接处于2MSL等待时,任何迟到的报文段将被丢弃。...如果我们终止一个已经建立连接的服务器程序,并试图立即重新启动这个服务器程序,服务器程序将不能把它的这个熟知端口赋值给它的端点,因为那个端口是处于 2MSL连接的一部分。
FIN --- B A --- ACK --> B (2) 这里在(1)时B开始处于CLOSE_WAIT状态,一直到收到ACK后B才转为CLOSED ,而A就处于TIME_WAIT状态,一直到2MSL...(Max Segament Lifetime)才转为CLOSED 为什么需要2MSL才真正转为CLOSED?...是因为需要缓冲时间万一B丢失ACK重发FIN的话还可以回复ACK,还有就是2MSL后“迷失”在网络上的包全部失效 大量的 TIME_WAIT 和 CLOSE_WAIT 会造成服务器的连接资源被浪费甚至占满后导致服务器服务拒绝
当主动方收到了对方发来的FIN报文,并发出ACK报文,接下来就等2MSL就可以进入CLOSED状态了。...在上面的TIME_WAIT状态中有提到过2MSL,那么什么是2MSL呢?那么来详细说一下TIME_WAIT状态和里面的2MSL。 为什么需要TIME_WAIT?...所以就需要主动方发送最后一次ACK之后进入TIME_WAIT状态,等待2MSL(两个报文最大生命周期),等待这段时间就是为了如果接收到了重发的FIN请求能够进行最后一次ACK回复,让在网络中延迟的FIN.../ACK数据都消失在网络中,不会对后续连接造成影响 那么为什么TIME_WAIT的时间是2MSL呢?...MSL是TCP报文的最大生命周期,因为TIME_WAIT持续在2MSL就可以保证在两个传输方向上的尚未接收到或者迟到的报文段已经消失,否则服务器立即重启,可能会收到来自上一个进程迟到的数据,但是这种数据很可能是错误的
服务器出现大量CLOSE_WAIT状态的原因 对方关闭socket连接,我方忙于读或写,没有及时关闭连接 解决方案 检查代码,特别是释放资源的代码 检查配置,特别是处理请求的线程配置 为什么四次挥手要有2MSL...自己一定能收到 分析: ACK从A到B最多经过1MSL,超过这个时间B会重发FIN B重发的FIN最多经过1MSL到达A结论:如果B重发了FIN,且网络没有故障(重发的FIN被丢弃或错误转发),那么A一定能在2MSL...之内收到该FIN,因此A只需要等待2MSL。...另外等待 2MSL 可以避免前后两个使用相同四元组的连接中的前一个连接的报文干扰后一个连接,换句话说,就是为了让此次 TCP 连接中的所有报文在网络中消失. 详细可以看
2MSL 总时间是4分钟 MSL(Max Segment Lifetime):最长报文段寿命 RFC 793标准建议设置为2分钟 为什么TIME-WAIT状态需要等待2MSL?...最后一个报文没有确定 确定最后一个ACK报文一定能到达对方 2MSL时间内,如果没有到达对方,那么对方会重新进行第三次挥手,确保连接正常释放 1.确保当前连接所有的报文都已经过期 UDP vs TCP
报文段,向 Server 发送 ACK 报文段,然后 Client 进入 TIME_WAIT 状态;Server 收到 Client 的 ACK 报文段以后,就关闭连接;此时,Client 等待2MSL...2MSL即两倍的MSL,TCP的TIME_WAIT状态也称为2MSL等待状态,当TCP的一端发起主动关闭,在发出最后一个ACK包后,即第3次握手完成后发送了第四次握手的ACK包后就进入了TIME_WAIT...状态,必须在此状态上停留两倍的MSL时间,等待2MSL时间主要目的是怕最后一个ACK包对方没收到,那么对方在超时后将重发第三次握手的FIN包,主动关闭端接到重发的FIN包后可以再发一个ACK应答包。...在TIME_WAIT状态时两端的端口不能使用,要等到2MSL时间结束才可继续使用。当连接处于2MSL等待阶段时任何迟到的报文段都将被丢弃。...不过在实际应用中可以通过设置SO_REUSEADDR选项达到不必等待2MSL时间结束再使用此端口。 TTL与MSL是有关系的但不是简单的相等的关系,MSL要大于等于TTL。 为什么要三次握手?
Socket 运行流程 基于 TCP 基于 UDP Socket TCP 是如何建立连接的 三次握手发生在 socket 的哪几个函数中 Socket TCP 是如何断开连接的 第四次挥手后为何要等待 2MSL...第四次挥手后为何要等待 2MSL 首先 2MSL 的时间是从客户端(A)接收到 FIN 后发送 ACK 开始计时的。...如果在 TIME-WAIT 时间内,因为客户端(A)的 ACK 没有传输到服务端(B),客户端(A)又接收到了服务端(B)重发的 FIN 报文,那么 2MSL 时间会被重置。...这刚好是2MSL,这个时间,足以使得原来连接的数据包在网络中消失。...假设客户端不等待 2MSL ,而是在发送完 ACK 之后直接释放关闭,一但这个 ACK 丢失的话,服务器就无法正常的进入关闭连接状态。
领取专属 10元无门槛券
手把手带您无忧上云