精华内容
下载资源
问答
  • 什么ServerSocket关闭后不进入time_wait状态啊?
  • 可以等待端口打开或进入请求状态。 特征: 检查TCP连接 检查HTTP连接以及状态代码和响应正文 检查Redis连接(Ping请求)和密钥存在 检查MySQL连接 检查PostgreSQL连接 安装 有多种不同的方法来安装Wait4X 使用...
  • 它是表示socket可以进入和留存相当长一段时间的状态,如果你的系统中有很多 socket 处于TIME_WAIT状态,那么当你需要创建新的 socket 连接的时候可能会受到影响,这也会影响到你的程序的扩展性。 1、TIME_WAIT...
    TIME_WAIT 在 TCP 的状态流程图中是一个很容易被误解的状态。它是表示socket可以进入和留存相当长一段时间的状态,如果你的系统中有很多 socket 处于TIME_WAIT状态,那么当你需要创建新的 socket 连接的时候可能会受到影响,这也会影响到你的程序的扩展性。
    1、TIME_WAIT状态原理

           通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。

    客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。

    下图是以客户端主动关闭连接为例,说明这一过程的。

    2、TIME_WAIT状态存在的理由
    TCP/IP协议就是这样设计的,是不可避免的。主要有两个原因:

    1)可靠地实现TCP全双工连接的终止

           TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。

    因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。
    2)允许老的重复分节在网络中消逝 
            TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。
    3、MSL时间
           MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。

    TIME_WAIT状态维持时间:

         TIME_WAIT状态维持时间是两个MSL时间长度,也就是在1-4分钟。Windows操作系统就是4分钟。

    展开全文
  • 什么TCP里面有TIME_WAIT状态

    千次阅读 2019-07-06 10:56:40
    今天在实现TCP/IP协议栈中的连接管理管理功能的时候,遇到一个TIME_WAIT状态,处于TIME_WAIT状态的tcp socket 在等待2个Max Segment Lifttime以后就会转移到closed状态。 觉得有些奇怪,以下是我的一点理解。 首先...

    今天在实现TCP/IP协议栈中的连接管理管理功能的时候,遇到一个TIME_WAIT状态,处于TIME_WAIT状态的tcp socket 在等待2个Max Segment Lifttime以后就会转移到closed状态。
    觉得有些奇怪,以下是我的一点理解。
    在这里插入图片描述
    首先这个TIME_WAIT一定是从FIN_WAIT_2转移过来的。进入TIME_WAIT意味着这个tcp socket在主动关闭的时候,自己的FIN已经被对方确认,而且对方也发了一个FIN过来表示对方也没有什么数据要主动传输了。
    因此,处于TIME_WAIT等待这么久的时间首先有第一个作用: 对 对方FIN的ACK确认有可能在传输过程被丢弃。于是对方会重新发送FIN,停留在TIME_WAIT可以对重传的FIN进行确认。否则,对方将一直处于LAST_ACK状态。

    第二个作用就比较隐蔽了,TCP的TIME_WAIT故意让主动关闭连接的socket等待这么长的时间是为了让这个socket的那些旧的仍然在网络中传输的数据包能够从整个网络清空出去。

    既然socket都跑到TIME_WAIT为什么还有在空中飞的旧数据包呢?这主要是一些超时的但是又没有被丢弃的数据包,这些数据包在前面的传输中被检测到超时了,于是tcp启动了超时重传机制,而且还走了新的、更不拥塞的链路,于是导致这些重传的数据包反而更快被对端确认。

    这些姗姗来迟的旧数据包如果在TIME_WAIT阶段到达,就会被丢弃掉。

    然而,如果这个主动的关闭的socket 没有等待足够长的时间,而是又用着相同的端口号去建立一个新的TCP连接,那么这些旧的数据包就干扰新的连接。虽然,新的连接可以通过seq和ack来识别出这些旧数据包的seq、ack不合理,但是TCP的规范是要求不能这么搞的,因为TCP规范并没有要求所有的初始序列号怎么选择,如果刚好选择的初始序列号和旧的数据包的seq吻合了,那么就很麻烦了。

    也正是因为有TIME_WAIT状态的存在,导致我们在主动关闭一个socket的时候,尽管包含这个socket的进程已经关闭了,但是这个socket还处与TIME_WAIT状态,再次启动这个进程是无法再去bind这个socket直到这个socket从TIME_WAIT转移到CLOSED去。

    展开全文
  • TIMEWAIT状态

    千次阅读 2018-12-11 09:17:12
    TIMEWAIT是友好的 ...客户端在接收到服务器发送的FIN段后,没有立即进入CLOSED状态,而是进入TIME_WAIT状态;在TIME_WAIT状态,客户端连接要等待一段长为2MSL的时间才能完全关闭。 TIME_WAIT状态存在的原因有...


    在这里插入图片描述
        图中可以看到:主动关闭方将进入TIME_WAIT状态;被动关闭方将进入CLOSE_WAIT状态。

        该计时器就是TIME_WAIT计时器,即当主动方A发送FIN给对方B后,被动方B回复ACK后,主动方A将进入TIME_WAIT状态(用来等待B发送FIN+ACK)。如果在计时器时间内没有接收到B发来的FIN+ACK,A将会重启TIME_WAIT计时器继续等待B发来的FIN+ACK。保证全双工管道的安全断开。

    TIMEWAIT是友好的

    Note1:什么是TIME_WAIT状态?
        客户端在接收到服务器发送的FIN段后,没有立即进入CLOSED状态,而是进入TIME_WAIT状态;在TIME_WAIT状态,客户端连接要等待一段长为2MSL的时间才能完全关闭。

    Note2:TIME_WAIT状态存在的2个原因
    (1)可靠的终止TCP连接
        假如报文段7(ACK)丢失:那么服务器将会重发报文段6(FIN),客户端需要停留在TIME_WAIT状态以处理重复收到的报文段6(FIN),(补充说明:假如没有2MSL的延时等待,客户端只能以RST段回应服务器,异常终止连接
    (2)允许老的重复分解在网络中消失
         假设在12.106.32.254的1500端口和206.168.112.219的21端口之间建立连接,我们关闭这个连接。过段时间后在相同的IP和端口之间建立另一个链接。后一个连接成为前一个连接的化身,因为它们的IP和端口相同。 ==> TCP必须防止来自某个连接的老的重复分组在该连接已经终止后再现,从而被误解成属于同一连接的某个新的化身。==> 为了做到这点,TCP协议栈规定,处于TIME_WAIT状态的连接不能发起新的化身。(又因为,TIME_WAIT状态的持续时间时MSL的2倍,这就足以让发送方向上的分组最多存活MSL秒后被丢弃,让接收应答方向上的分组最多存活MSL也被丢弃,所以,TIME_WAIT状态保证了该连接先前化身的老的重复分组已在网络中消逝了)

    大量TIMEWAIT在某些场景中导致的令人头疼的业务问题

        在高并发短连接的TCP服务器上,当服务器处理完请求后立刻按照主动正常关闭连接。这个场景下,会出现大量socket处于TIMEWAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。 ⇒ ⇒ 来解释下这个场景。主动正常关闭TCP连接,都会出现TIMEWAIT。为什么我们要关注这个高并发短连接呢?有两个方面需要注意:

    1. 高并发可以让服务器在短时间范围内同时占用大量端口,而端口有个0~65535的范围,并不是很多,刨除系统和其他服务要用的,剩下的就更少了。
    2. 在这个场景中,短连接表示“业务处理+传输数据的时间 远远小于 TIMEWAIT超时的时间”的连接。这里有个相对长短的概念,比如,取一个web页面,1秒钟的http短连接处理完业务,在关闭连接之后,这个业务用过的端口会停留在TIMEWAIT状态几分钟,而这几分钟,其他HTTP请求来临的时候是无法占用此端口的。单用这个业务计算服务器的利用率会发现,服务器干正经事的时间和端口(资源)被挂着无法被使用的时间的比例是 1:几百,服务器资源严重浪费。(说个题外话,从这个意义出发来考虑服务器性能调优的话,长连接业务的服务就不需要考虑TIMEWAIT状态。同时,假如你对服务器业务场景非常熟悉,你会发现,在实际业务场景中,一般长连接对应的业务的并发量并不会很高)

        综合这两个方面,持续的到达一定量的高并发短连接,会使服务器因端口资源不足而拒绝为一部分客户服务。同时,这些端口都是服务器临时分配,无法用SO_REUSEADDR选项解决这个问题。

        一对矛盾:TIMEWAIT既友好,又令人头疼。但是还是要抱着一个友好的态度来看待它,因为它尽它的能力保证了服务器的健壮性。

    可行而且必须存在,但是不符合原则的解决方式

    1. linux没有在sysctl或者proc文件系统暴露修改这个TIMEWAIT超时时间的接口,可以修改内核协议栈代码中关于这个TIMEWAIT的超时时间参数,重编内核,让它缩短超时时间,加快回收;
    2. 利用SO_LINGER选项的强制关闭方式,发RST而不是FIN,来越过TIMEWAIT状态,直接进入CLOSED状态。(详细请看socket套接字选项详解的SO_LINGER

    为什么说上述两种解决方式我觉得可行,但是不符合原则?
        首先认为,要依靠TIMEWAIT状态来保证服务器程序健壮,网络上发生的乱七八糟的问题太多了,先要服务功能正常。
        那是不是就不要性能了呢?并不是。如果服务器上跑的短连接业务量到了我真的必须处理这个TIMEWAIT状态过多的问题的时候,解决原则是尽量处理,而不是跟TIMEWAIT干上,非先除之而后快:)如果尽量处理了,还是解决不了问题,仍然拒绝服务部分请求,那我会采取分机器的方法,让多台机器来抗这些高并发的短请求。持续十万并发的短连接请求,两台机器,每台5万个,应该够用了吧。一般的业务量以及国内大部分网站其实并不需要关注这个问题,一句话,达不到需要关注这个问题的访问量。
        真正地必须使用上述我认为不合理的方式来解决这个问题的场景有没有呢?答案是有,像淘宝、百度、新浪、京东商城这样的站点,由于有很多静态小图片业务,如果过度分服会导致需要上线大量机器,多买机器多花钱,得多配机房,多配备运维工程师来守护这些机器,成本增长非常严重。这个时候就要尽一切可能去优化。

    如何尽量并合理地处理TIMEWAIT过多

    1. sysctl改两个内核参数就行了,如下:
      net.ipv4.tcp_tw_reuse = 1
      net.ipv4.tcp_tw_recycle = 1
          简单来说,就是打开系统的TIMEWAIT重用和快速回收,至于怎么重用和快速回收,这个问题我没有深究,实际场景中这么做确实有效果。用netstat或者ss观察就能得出结论。
    2. 还有些朋友同时也会打开syncookies这个功能,如下:
      net.ipv4.tcp_syncookies = 1
          打开这个syncookies的目的实际上是:“在服务器资源(并非单指端口资源,拒绝服务有很多种资源不足的情况)不足的情况下,尽量不要拒绝TCP的 syn(连接)请求,尽量把syn请求缓存起来,留着过会儿有能力的时候处理这些TCP的连接请求”。
      如果并发量真的非常非常高,打开这个其实用处不大。
    展开全文
  • 一、线程睡眠Thread.sleep 1)需要指定睡眠时间,如 ...2)睡眠时线程状态为TIMED_WAITING(限期等待)。 3)需要捕获InterruptedException异常。 4)不会释放持有的锁。 二、线程等待Object.wait 1...

    一、线程睡眠Thread.sleep

    1)需要指定睡眠时间,如

    Thread.sleep(10_000);// 睡眠10秒
    // TimeUnit.MINUTES.sleep(1);// 睡眠一分钟

    2)睡眠时线程状态为TIMED_WAITING(限期等待)。

    3)需要捕获InterruptedException异常。

    4)不会释放持有的锁。

    二、线程等待Object.wait

    1)可以指定等待时间,通过notify()或者notifyAll()唤醒,推荐notifyAll()。注意,notify需要在wait之后执行。

    2)等待时状态为WAITING(无限期等待)。

    3)需要捕获InterruptedException异常。

    4)需要在synchronized同步内使用会释放持有的锁。

    三、线程暂停LockSupport.park

    1)通过信号量实现的阻塞,类似Semaphore,只不过许可不能累积,并且最多只能有一个,可以指定暂停时间,通过unpark唤醒。注意,unpark可以比park先执行。

    2)暂停时状态为WAITING(无限期等待)。

    3)无需捕获InterruptedException异常,但是可以响应中断。

    4)不会释放持有的锁。

    以下是一个先进先出 (first-in-first-out) 非重入锁类的框架(摘自官方文档)

    class FIFOMutex {
       private final AtomicBoolean locked = new AtomicBoolean(false);
       private final Queue<Thread> waiters
         = new ConcurrentLinkedQueue<Thread>();
    
       public void lock() {
         boolean wasInterrupted = false;
         Thread current = Thread.currentThread();
         waiters.add(current);
    
         // Block while not first in queue or cannot acquire lock
         while (waiters.peek() != current ||
                !locked.compareAndSet(false, true)) {
           LockSupport.park(this);
           if (Thread.interrupted()) // ignore interrupts while waiting
             wasInterrupted = true;
         }
    
         waiters.remove();
         if (wasInterrupted)          // reassert interrupt status on exit
           current.interrupt();
       }
    
       public void unlock() {
         locked.set(false);
         LockSupport.unpark(waiters.peek());
       }
     }

     

    展开全文
  • TIME_WAIT状态原理

    2017-05-03 17:45:02
    TIME_WAIT状态原理 ...客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。 下图是以客户端主动关闭连接为例,说明这一过程的。  
  • 关于TIME_WAIT状态   TIME_WAIT是TCP状态转换中的一个非常重要的状态,TIME_WAIT状态的或多或少会极大的影响...  为什么TIME_WAIT状态需要经过2MSL(最大报文段生存时间)才能返回到CLOSE状态?   MSL(Max...
  • 客户端连接在收到服务器的结束报文段之后,不会直接进入CLOSED状态,而是转移到TIME_WAIT状态。在这个状态,客户端连接要等待一段长为2MSL,即两倍的报文段最大生存时间,才能完全关闭。 其原因主要有两点: 可靠地...
  • TIME_WAIT状态之后为什么要经过2MSL(2MSL,即两个最大报文段生存时间)的时长后才进入CLOSED状态,为什么不直接进入CLOSED状态? 因为客户端发送的第四次挥手的ACK数据包,服务端可能没有收到,那么服务端会在等待一...
  • TCP TIME_WAIT状态

    2019-01-22 07:48:11
    什么是TIME_WAIT状态 TCP的TIME_WAIT是指在四次挥手中,主动断开方 在收到对方发送的FIN后,向对方发送ACK后就会进入TIME_WAIT状态 处于TIME_WAIT状态时,端口被占用,无法创建新连接 只有等待2MSL(报文在网络中的...
  • 什么要有time_wait状态

    千次阅读 2018-08-22 15:14:31
    谁先关闭谁先进入time_wait状态。 通常服务器检测到客户端关闭连接后,(系统调用的一种事件类型,发生了这种事件就会告知服务器),就会立刻给客户端发送一个结束报文段来关闭连接,客户端收到这个结束报文段之后...
  • 关于timewait状态

    2018-08-08 22:53:57
    被动关闭的一方收到了FIN包之后,协议层回复ACK包,在他的TCP报头中将ACK设置为1,表示收到了对方的关闭连接请求,被动 的一方进入到了CLOSE_WAIT状态;主动关闭的一方收到了被动关闭一方的响应...
  • 值得一说的是,对于基于TCP的HTTP协议,关闭TCP连接的是Server端,这样,Server端会进入TIME_WAIT状态,可想而知,对于访问量大的Web Server,会存在大量的TIME_WAIT状态,假如Server一秒钟接收1000个请求,那么就会...
  • FIN_WAIT_2状态解释

    2020-11-03 09:31:12
    在HTTP应用中,存在一个问题,SERVER由于某种原因关闭连接,如KEEPALIVE的超时,这样,作为主动关闭的SERVER一方就会进入 FIN_WAIT2状态,但TCP/IP协议栈有个问题,FIN_WAIT2状态是没有超时的(不象TIME_WAIT状态)...
  • Java中进入wait状态的线程被唤醒后会接着上次执行的地方往下执行还是会重新执行临界区的代码 用一个例子来说明: 例子原理 启动一个线程A打印数字,从0打印到9,在数字等于5的时候,进入wait状态。在线程A启动后等待...
  • TIME_WAIT状态什么? TIME_WAIT状态是主动关闭TCP连接的一方(即先发起FIN包的一方),在发送完最后一个ACK包后进入状态。系统需要在TIME_WAIT状态下等待2MSL(maximum segment lifetime )后才能释放连接...
  • time_wait状态

    2016-04-29 20:15:27
    主动发起关闭连接的一方将出现time_wait状态 四次挥手如下所示: 主动关闭端 被动关闭端 第一次挥手--------FIN---------->主动关闭端发出FIN分节之后从established状态转为fin_wait_1状态。 第二次挥手&l...
  • TIME_WAIT状态

    千次阅读 2017-07-05 16:53:31
    在前面我们讲TCP的三次握手和四次挥手的时候,最后有一个问题就是为什么主动断开连接的一方会进入TIME_WAIT状态。三次握手和四次挥手的链接如下: http://blog.csdn.net/payshent/article/details/73773789 这一节...
  • TIME_WAIT和CLOSE_WAIT状态区别

    千次阅读 2016-04-27 12:10:33
    在服务器的日常维护过程中,会经常用到下面的命令: netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 它会显示例如下面的信息: TIME_WAIT 814 ...常用的三个状态是:...
  • 下面接着《详解TCPIP断开连接后的Time-wait状态》一文的内容,我们讨论下socket在断开连接中的另外三种状态FIN_WAIT1、FIN_WAIT2状态和CLOSE_WAIT状态。 首先启动socket服务端,然后用客户端进行连接,用netstat –...
  • 只有处于FIN_WAIT2状态的客户端等待到服务器的结束报文段,才能转移至TIME_WAIT状态,否则它将一直停留在这个状态,如果不是为了在半关闭状态下继续发送数据,连接长时间的停留在FIN_WAIT2状态并无益处,连接停留在...
  • close_wait状态和time_wait状态

    千次阅读 2011-05-08 18:34:00
    不久前,我的Socket Client程序遇到了一个非常尴尬的错误。它本来应该在一个socket长连接上持续不断地向服务器发送数据...它们为什么会都处在CLOSE_WAIT状态呢?CLOSE_WAIT状态的生成原因首先我们知道,如果我们的Clie
  • TCP的状态兼谈Close_Wait和Time_Wait状态 一 、TCP的状态: 1)、LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN. /* The socket is listening for incoming connections. 侦
  • TIME-WAIT状态

    2013-10-09 20:45:50
    关于time-wait状态 只有发起主动关闭的一方进入状态。例外情况是双方同时关闭,这时都进入状态在此状态中停留的时间是2MSL,MSL定义为30秒到2分钟,linux定义的是30秒,所以停留1分钟如果此状态下有数据达到...
  • 服务器发生close wait是在什么时候 CLOSE_WAIT状态的生成原因 首先我们知道,如果我们的Client程序处于CLOSE_WAIT状态的话,说明套接字是被动关闭的! 因为如果是Server端主动断掉当前连接的话,那么双方关闭这个TCP...
  • sleep和wait什么区别

    千次阅读 2017-04-22 11:36:30
    sleep和wait什么区别 第一种解释:功能差不多,都用来进行线程控制,他们最大本质的区别是:sleep()不释放同步锁,wait()释放同步缩. 还有用法的上的不同是:sleep(milliseconds)可以用时间指定来使他自动醒过来,如果...
  • 先给出四次挥手过程中C/S的状态变化示意图。有了图理解起来就容易许多。 TIME_WAIT 表示主动关闭,CLOSE_WAIT 表示被动关闭。...CLOSE_WAIT状态的生成原因 首先我们知道,如果我们的服务器程序APACHE处于CLOS

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 216,540
精华内容 86,616
关键字:

wait进入什么状态