- 浏览: 761955 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
http://blog.csdn.net/kobejayandy/article/details/17655739
TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。
TIME_WAIT
TIME_WAIT 是主动关闭链接时形成的,等待2MSL时间,约4分钟。主要是防止最后一个ACK丢失。当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL.这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)
MSL(Maximum Segment Lifetime):一个报文段最大生存时间,RFP793为2分钟,但一般为30s,1分钟
由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接
CLOSE_WAIT
CLOSE_WAIT是被动关闭连接是形成的。根据TCP状态机,服务器端收到客户端发送的FIN,则按照TCP实现发送ACK,因此进入CLOSE_WAIT状态。但如果服务器端不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。
为什么需要 TIME_WAIT 状态?
假设最终的ACK丢失,server将重发FIN,client必须维护TCP状态信息以便可以重发最终的ACK,否则会发送RST,结果server认为发生错误。TCP实现必须可靠地终止连接的两个方向(全双工关闭),client必须进入 TIME_WAIT 状态,因为client可能面 临重发最终ACK的情形。
为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间?
如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。第二个拥有相同相关五元组的连接出现,而第一个连接的重复报文到达,干扰了第二个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT状态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被 丢弃。建立第二个连接的时候,不会混淆。
TIME_WAIT 和CLOSE_WAIT状态socket过多
如果服务器出了异常,百分之八九十都是下面两种情况:
1.服务器保持了大量TIME_WAIT状态
2.服务器保持了大量CLOSE_WAIT状态,简单来说CLOSE_WAIT数目过大是由于被动关闭连接处理不当导致的。
因为linux分配给一个用户的文件句柄是有限的,而TIME_WAIT和CLOSE_WAIT两种状态如果一直被保持,那么意味着对应数目的通道就一直被占着,而且是“占着茅坑不使劲”,一旦达到句柄数上限,新的请求就无法被处理了,接着就是大量Too Many Open Files异常,Tomcat崩溃。
TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不会被释放。网络服务器程序要同时管理大量连接,所以很有必要保证无用连接完全断开,否则大量僵死的连接会浪费许多服务器资源。在众多TCP状态中,最值得注意的状态有两个:CLOSE_WAIT和TIME_WAIT。
TIME_WAIT
TIME_WAIT 是主动关闭链接时形成的,等待2MSL时间,约4分钟。主要是防止最后一个ACK丢失。当TCP执行一个主动关闭,并发回最后一个ACK,该连接必须在TIME_WAIT状态停留的时间为2倍的MSL.这样可让TCP再次发送最后的ACK以防这个ACK丢失(另一端超时并重发最后的FIN)
MSL(Maximum Segment Lifetime):一个报文段最大生存时间,RFP793为2分钟,但一般为30s,1分钟
由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接
CLOSE_WAIT
CLOSE_WAIT是被动关闭连接是形成的。根据TCP状态机,服务器端收到客户端发送的FIN,则按照TCP实现发送ACK,因此进入CLOSE_WAIT状态。但如果服务器端不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。
为什么需要 TIME_WAIT 状态?
假设最终的ACK丢失,server将重发FIN,client必须维护TCP状态信息以便可以重发最终的ACK,否则会发送RST,结果server认为发生错误。TCP实现必须可靠地终止连接的两个方向(全双工关闭),client必须进入 TIME_WAIT 状态,因为client可能面 临重发最终ACK的情形。
为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间?
如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了。第二个拥有相同相关五元组的连接出现,而第一个连接的重复报文到达,干扰了第二个连接。TCP实现必须防止某个连接的重复报文在连接终止后出现,所以让TIME_WAIT状态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被 丢弃。建立第二个连接的时候,不会混淆。
TIME_WAIT 和CLOSE_WAIT状态socket过多
如果服务器出了异常,百分之八九十都是下面两种情况:
1.服务器保持了大量TIME_WAIT状态
2.服务器保持了大量CLOSE_WAIT状态,简单来说CLOSE_WAIT数目过大是由于被动关闭连接处理不当导致的。
因为linux分配给一个用户的文件句柄是有限的,而TIME_WAIT和CLOSE_WAIT两种状态如果一直被保持,那么意味着对应数目的通道就一直被占着,而且是“占着茅坑不使劲”,一旦达到句柄数上限,新的请求就无法被处理了,接着就是大量Too Many Open Files异常,Tomcat崩溃。
发表评论
-
NAT
2018-12-04 14:48 4031.在NAT网关,将不同设备的服务请求用NAT映射到不同端口号 ... -
TCP与性能优化
2017-10-13 15:14 476TCP的可优化点: 1.TCP三次握手增加了整整一次的往返时间 ... -
滑动窗口与拥塞控制
2017-09-29 14:47 759滑动窗口:用作流量控制: 1.发送端和接收端各维护一个独立的发 ... -
rawsocket发送tcp包
2017-09-25 11:52 983testTcp.h #ifndef TESTTCP_H ... -
柔性数组
2017-09-20 09:53 505#include <iostream> #i ... -
rawsocket发送dns包
2017-09-14 15:18 613#include <stdio.h> #in ... -
rawsocket发送icmp包
2017-09-06 09:54 658#include <stdio.h> #in ... -
netfilter
2016-10-04 20:31 474http://blog.chinaunix.net/uid-2 ... -
gdb的简单使用
2016-09-19 15:18 416注意编译的时间加上-g参数 1.调试运行 gdb a.out ... -
TCP各状态的意义
2016-03-01 14:06 420各个状态的意义如下: LISTEN - 侦听来自远方TCP端 ... -
Nagle算法
2016-01-07 21:13 949在一个Rlogin连接上客户一般每次发送一个字节到服务器,这就 ... -
TCP半打开连接
2016-01-03 10:08 878如果一方已经关闭或异常终止而另一方却还不知道,这样的TCP连接 ... -
TCP的半关闭
2016-01-02 08:08 585TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的 ... -
名字服务器
2015-12-20 09:03 463一个独立管理的DNS子树称为一个区域(zone). 一个名字 ... -
ICMP源站抑制差错
2015-12-12 09:28 901ICMP源站抑制差错: 当一个系统(路由器或主机)接收数据报的 ... -
动态选路
2015-11-29 09:20 663当相邻路由器之间进行 ... -
简单路由表
2015-11-23 23:27 586netstat -rn Flags:对于一个给定的路由器,可以 ... -
TTL
2015-11-01 09:18 552TTL(time-to-live):生存时间字段设置了数据报可 ... -
log
2015-03-30 17:42 451log.h #ifndef __LOG_H__ #def ... -
TcpClient
2015-01-16 17:46 470TcpClient.h #ifndef TCPCLIENT ...
相关推荐
标题 "tomcat-timewait-closewait.zip" 暗示了这个压缩包可能包含与Tomcat服务器在处理TCP连接时遇到的“Time_wait”和“Close_wait”状态相关的问题和解决方案。这两个术语是TCP/IP协议栈中的关键概念,尤其在高...
在IT领域,尤其是在服务器运维与数据库管理中,遇到“大量TIME_WAIT”状态的问题并不罕见,尤其是在高并发场景下,如MySQL服务器。本文将深入解析如何有效解决MySQL出现大量TIME_WAIT状态的问题,通过调整系统内核...
本文主要探讨了如何解决CentOS服务器上存在的大量TIME_WAIT TCP连接问题,这可能导致服务器连接数过多,进而引起服务假死。当服务器之间的通信过于频繁,如通过REST请求互相调用时,Java服务器可能无法及时回收TCP...
"解决TIME_WAIT过多造成的问题1" TIME_WAIT状态是TCP连接的四次挥手关闭协议中的一个重要状态,它存在的理由是为了确保TCP全双工连接的正常终止和避免老的重复分节在网络中消逝。 在TIME_WAIT状态中,客户端必须...
解决TIME_WAIT过多造成的问题
windows 2008 R2解决socket连接不释放补丁包_time-wait过多注册表修改, Windows time_wait过多解决办法解决办法: 修改注册表中的tcpip的TIMEWAIT回收时间属性值,需要重启后生效 在HKEY_LOCAL_MACHINE\SYSTEM...
通过修改注册表,直接修改tcp的连接时间,避免超多的timewait
问题描述:在Linux系统中高并发的Squid服务器,TCP TIME_WAIT套接字数量经常达到两、三万,服务器很容易被拖死。解决方法:通过修改Linux内核参数,可以减少linux服务器的IME_WAIT套接字数量。vi /etc/sysctl.conf...
在深入探讨如何有效释放TIME_WAIT状态的连接之前,我们首先需要理解TIME_WAIT状态的基本概念及其在TCP协议中的作用。TIME_WAIT是一种TCP连接的状态,当一个TCP连接被主动关闭时,客户端会进入TIME_WAIT状态,目的是...
TCP协议在连接关闭后会进入TIME_WAIT状态,这是为了确保数据包在网络中的正确传输和避免旧的数据包与新的数据包混淆。TIME_WAIT状态的时间长度默认为2MSL(Max Segment Lifetime),即最大报文段生存时间的两倍。在...
使用netstat -na命令可以查看当前的TCP连接状态,包括LISTEN、ESTABLISHED、TIME_WAIT等状态。在这个例子中,使用netstat -na命令可以发现服务器端的连接状态为CLOSE_WAIT,这就表明服务器端的连接尚未释放。 通过...
"服务器大量TIME_WAIT解决方法" 在 Linux 服务器中,TIME_WAIT 状态是一种常见的网络连接状态。然而,出现大量的 TIME_WAIT 状态可能会对服务器的性能产生影响。本文将详细介绍大量 TIME_WAIT 状态的成因、影响和...
在分析“服务端长连接与客户端短连接引起Nginx产生大量‘TIME_WAIT’状态的线程”的问题之前,我们先来了解一下几个关键知识点:Nginx连接处理方式、长连接与短连接、TIME_WAIT状态以及TLS session重用(resumption...
当我们看到netstat输出中存在大量的TCP连接处于TIME_WAIT状态时,这通常意味着系统可能存在一些性能问题或者配置上的挑战。本篇文章将深入探讨TIME_WAIT状态的原因以及如何解决。 TCP(传输控制协议)是一种面向...
timeWait-backEnd 前端代码前端代码: : angular2项目(时间等待) 数据库:mongonDB 数据库中间件:猫鼬 使用 git clone https://github.com/onaug6th/timeWait-backEnd cd timeWait-backEnd npm install node ...
1. Nginx作为负载均衡器,与PHP-FPM通信时通常采用短连接方式,这会导致大量连接在完成数据交换后进入TIME_WAIT状态。 2. TCP/IP协议的设计,为了防止旧连接的延迟数据影响新连接,以及确保TCP连接可靠关闭,会将...
在运维Apache服务器的过程中,经常遇到的一个问题是与负载均衡器之间的连接数异常增多,并且这些连接状态大多处于`TIME_WAIT`状态。这种情况会导致系统资源消耗过大,从而影响服务器性能甚至引发服务不可用的情况。 ...