起因是这样的,线上log经常出现Connection Reset异常,从堆栈上分析是solr进行sharding request时发生的,solr部署在tomcat上。从现场来看,原因很明白Server端发出RST包。但具体原因是什么就得经过一番分析了,
经过google百度以及和网友沟通,发现会有以下场景导致RST:
1. 设置SoLinger,并设置停留时间为0
发现异常关闭非常适合出现问题的场景。啥叫异常关闭呢,正常的close是四次挥手
例如客户端执行close的时候,发出FIN,告诉对端我不再接受和发送数据,而对端也应该由应用程序调用close结束链接,也许你会说发出FIN只是告诉对端不再发送数据还能接收数据,事实上也是可以的,这样的关闭叫做半关闭,通过调用shutdown方法来实现。
solr为什么会遇到这样的问题,httpclient为了减少链接的建立开销使用connection manager的连接池管理链接,我们知道虽然Http1.1支持keep alive,但仍有条件限制,例如keepalivetimeout以及keepalive的个数。当tomcat进行keepalive的connectin timeout处理的处理的,只是单方面的close,对端趟在连接池中的connection并不知道也不会执行相应的close,恰巧这时候有一个reuest使用这个connection发出请求,这一点特别重要,还是能发送数据的,最初的时候我以为服务端close了客户端就不能再使用conneciton发送数据了。服务端不会读取client端发过来的数据坚决执行关闭,这时候这个关闭就是RST而不是FIN了。
B's TCP stack knows that some data is effectively lost and it will forcibly terminate with RST rather than use the orderly FIN
procedure.
有两种这样的场景:
1. A向B 发送数据,B的应用执行close,而这时A试图继续发而不是由应用调用close。
2. A向B发送数据,B不做任何处理,不读取任何数据坚决地close,这时候这个close发的就是RST。
我写了一段代码来模拟以上两种情况
Server
public static void run(){
try{
//InetSocketAddress address = new InetSocketAddress("10.58.99.27", 9090);
//InetAddress address = InetAddress.getByName("10.58.99.27");
ServerSocket serverSocket = new ServerSocket(9090,1);
ExecutorService threadPool = Executors.newCachedThreadPool();
// for(int i = 0; i < 1;i++){
// new Thread(new BioHttpServer.Connector()).start();
// }
// latch.countDown();
while(true){
Socket client = serverSocket.accept();
Thread.sleep(1000);//调整这个时间 如调整为100 则为情况1 1000为情况2
client.close();
// client.shutdownOutput();
// if(isDistribute){
// threadPool.execute(new SocketProcessor(client));
// }else{
// new SocketProcessor(client).run();
// }
}
}catch(Exception e){
e.printStackTrace();
}finally{
}
}
Client
try {
Socket client = new Socket("10.58.99.74", 9090);
// client.setSoTimeout(5000);
System.out.println(client);
InputStream ins =client.getInputStream();
int i = 0;
// System.out.println(ins.read());
while(i++ < 100000){
client.getOutputStream().write(64);
}
System.out.println(ins.read());
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
- 大小: 24.8 KB
- 大小: 39.1 KB
分享到:
相关推荐
本文主要介绍了java中的connection reset 异常处理分析的相关资料,具有很好的参考价值。下面跟着小编一起来看下吧
easy-connect的安装包,深信服EasyConnect远程应用发布解决方案凭借应用虚拟化技术,快速实现客户的移动信息化建设,减少客户在APP和应用系统开发中投入的成本和实践,并保证数据信息安全。
NULL 博文链接:https://desert3.iteye.com/blog/1041016
向yarn提交任务时Retrying connect to server 0.0.0.0:8032异常
应用程序异常应用程序异常应用程序异常应用程序异常应用程序异常应用程序异常应用程序异常应用程序异常应用程序异常
官方nrf connect各版本下载地址 https://github.com/NordicSemiconductor/Android-nRF-Connect/releases
EasyConnect用于连接内网
RocketMQ-Connect 二次开发源码。RocketMQ-Connect 二次开发源码。RocketMQ-Connect 二次开发源码。RocketMQ-Connect 二次开发源码。RocketMQ-Connect 二次开发源码。RocketMQ-Connect 二次开发源码。RocketMQ-...
EasyConnect最新版,下载解开压缩包后一键安装,亲测,可用。
EasyConnect
EasyConnect(mac版本)
easy connect for mac 4.9
easy connect客户端安装软件
hillstone secure connect Mac版本
Qt connect的几种写法
深信服easyconnect安装程序!
通过实例比较了 SYS_CONNECT_BY_PATH 和 CONNECT_BY_ROOT 的异同,和返回树形的数据结构
hillstone secure connect客户端软件
EasyConnect工具
开源的openconnect,github下载不易,搬运,此软件为openconnect gui 1.5.1版本,方便操作,mac平台使用