TCP四次挥手客户端关闭链接为什么要等待2倍MSL

最长报文寿命
  在TCP协议中,当发送方发送释放连接报文收到确认报文后,只是在一个方向上断开了TCP连接,然后,接收方发送释放连接的报文,发送方回复确认。此时,连接还没有释放,发送方要等待2MSL(maximum segment lifetime——最大的生命周期)后关闭连接。

问题
  主动发起关闭连接的操作的一方将达到TIME_WAIT状态,而且这个状态要保持Maximum Segment Lifetime的两倍时间。为什么要这样做而不是直接进入CLOSED状态?

原因:
  保证TCP协议的全双工连接能够可靠关闭
  保证这次连接的重复数据段从网络中消失

解释:
  如果Client直接CLOSED了,那么由于IP协议的不可靠性或者是其它网络原因,导致Server没有收到Client最后回复的ACK。那么Server就会在超时之后继续发送FIN,此时由于Client已经CLOSED了,就找不到与重发的FIN对应的连接,最后Server就会收到RST而不是ACK,Server就会以为是连接错误把问题报告给高层。这样的情况虽然不会造成数据丢失,但是却导致TCP协议不符合可靠连接的要求。所以,Client不是直接进入CLOSED,而是要保持TIME_WAIT,当再次收到FIN的时候,能够保证对方收到ACK,最后正确的关闭连接。
  如果Client直接CLOSED,然后又再向Server发起一个新连接,我们不能保证这个新连接与刚关闭的连接的端口号是不同的。也就是说有可能新连接和老连接的端口号是相同的。一般来说不会发生什么问题,但是还是有特殊情况出现:假设新连接和已经关闭的老连接端口号是一样的,如果前一次连接的某些数据仍然滞留在网络中,这些延迟数据在建立新连接之后才到达Server,由于新连接和老连接的端口号是一样的,又因为TCP协议判断不同连接的依据是socket pair,于是,TCP协议就认为那个延迟的数据是属于新连接的,这样就和真正的新连接的数据包发生混淆了。所以TCP连接还要在TIME_WAIT状态等待2倍MSL,这样可以保证本次连接的所有数据都从网络中消失。

原文地址:https://www.cnblogs.com/yyxianren/p/11212445.html

时间: 2024-10-26 03:27:28

TCP四次挥手客户端关闭链接为什么要等待2倍MSL的相关文章

TCP三次握手(建立连接)/四次挥手(关闭连接)

相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. 而且对于有网络协议工程师之类笔试,几乎是必考的内容.因此在这里详细解释一下这两个过程. TCP数据包格式 顺序号( 32 位):用来标识从 TCP 源端向 TCP 目的端发送的数据字节流,它表示在这个报文段中的第一个数据字节的顺序号.如果将字节流看作在两个应用程序间的单向流动,则TCP用顺序号对每个字节进行计数.序号是32bit的无

TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手

这是一个很有意思的问题~ 首先,我们要知道TCP是全双工的,即客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息.而半双工的意思是A可以给B发,B也可以给A发,但是A在给B发的时候,B不能给A发,即不同时,为半双工. 单工为只能A给B发,B不能给A发: 或者是只能B给A发,不能A给B发. 我们假设A和B是通信的双方.我理解的握手实际上就是通信,发一次信息就是进行一次握手. 第一次握手: A给B打电话说,你可以听到我说话吗? 第二次握手: B收到了A的信息,然后对A说: 我可以听得到

TCP四次挥手

tcp四次挥手详解: 挥手之前,客户端和服务器端都处于建立连接状态,客户端是主动关闭,服务器是被动关闭 (1)首先客户端发送连接释放报文FIN=1,seq=u,主动关闭连接,并不在发送数据.TCP规定FIN报文不能携带数据,但是消耗一个序号,这时A进入FIN_WAIT_1(终止等待1) (2)服务器收到连接释放报文后,发送确认,ACK=1,seq=v,ack=u+1(因为上面消耗了一个序号),这个之后服务器进入了close_wait状态,并通知高层应用程序,因此从可客户端到服务器发送的这个连接就

计算机网络(五),TCP四次挥手

目录 1.TCP四次挥手详情 2.为什么会有TIME-WAIT状态 3.为什么需要四次握手才能断开连接 4.服务器出现大量CLOSE_WAIT的原因 五.TCP四次挥手 1.TCP四次挥手详情 (1)一开始双方都属于已连接状态 (2)客户端发送一个报文段:FIN=1,seq=u.FIN表示连接关闭请求,seq是之前最后一个发送的数据的标号+1.客户端进入关闭等待状态1(FIN-WAIT-1) (3)服务端接收到关闭连接请求之后,通知程序需要关闭连接,然后返回一个报文段:ACK=1,seq=v,a

TCP四次挥手及原因

一.TCP四次挥手 MSL是TCP报文里面最大生存时间,它是任何报文段被丢弃前在网络内的最长时间. 第一次挥手:A->B,A向B发出释放连接请求的报文,其中FIN(终止位) = 1,seq(序列号)=u:在A发送完之后,A的TCP客户端进入FIN-WAIT-1(终止等待1)状态.此时A还是可以进行收数据的 第二次挥手:B->A:B在收到A的连接释放请求后,随即向A发送确认报文.其中ACK=1,seq=v,ack(确认号) = u +1;在B发送完毕后,B的服务器端进入CLOSE_WAIT(关闭

TCP四次挥手(断开连接)(未完待续)

正常情况下,调用close(),其中产生的一个效果就是发送FIN. 断开为什么需要四次握手: TCP协议是一种面向连接的.可靠的.基于字节流的运输层通信协议.TCP是全双工模式,这就意味着,当主机1发出FIN报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2,它的数据已经全部发送完毕了:但是,这个时候主机1还是可以接受来自主机2的数据:当主机2返回ACK报文段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1的:当主机2也发送了FIN报文段时,这个时候就表示主

TCP四次挥手断开连接详解

TCP四次挥手. 数据传输结束后,通信的双方都可释放连接.现在A和B都处于ESTABLISHED状态.A的应用程序先向TCP发出连接释放报文段,主动关闭TCP连接.A把连接释放报文段的首部FIN置为1,序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1.这时A进入FIN-WAIT-1状态,等待B的确认. B收到连接释放报文段后即发出确认,确认号是ack=u+1,而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1.然后B就进入CLOSE-WAIT状态.TCP

TCP四步挥手的各种状态转换图

对于TCP四步挥手时的各种状态转换,网上有很多资料.但是有很多描述不是很容易理解,甚至是描述错误,不如这篇文章里http://www.cnblogs.com/Jessy/p/3535612.html#3428191 说: 对此我表示不以为然.而且很容易误导初学者.在这里我贴出一个网上画的比较好的TCP四步挥手时的状态转换图:

传输层(一)TCP的三次握手和四次挥手及关闭套接字的原理

TCP连接需三次握手才能建立,断开连接则需要四次握手. 客户端TCP状态迁移: CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED 服务器TCP状态迁移: CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED 整个过程如下图所示: 一.建立TCP连接 三次握手:所谓的