连接重置Connection reset异常
详细信息
java.net.SocketException: Connection resetat java.net.SocketInputStream.read(SocketInputStream.java:168)at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:789)at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:623)at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)at org.apache.commons.httpclient.methods.StringRequestEntity.writeRequest(StringRequestEntity.java:146)at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323)at com.venustech.pm.flow.propchange.comm.http.HttpClientUtil.doPostPayload(HttpClientUtil.java:91)at com.venustech.pm.flow.propchange.comm.http.HttpClientUtil$1.run(HttpClientUtil.java:431)at java.lang.Thread.run(Thread.java:619)
场景回溯
- 首次请求 首次向其他系统API发送Https请求时报错
- 未得到响应
- 只有Soctet异常:Connection Reset
出现原因
Connection Reset——其中一端主动断开连接
Connection Reset是在建立TCP连接之后,其中一方的TCP标志位使用Reset标志主动重置了连接
客户端Or服务器端
而我这里既然是客户端报的错误信息,那势必是服务器主动断开了连接
为什么它要断开连接
服务器主动断开连接的原因:
- 服务器异常
- 服务器和客户端长短连接不匹配
- Https连接,服务器和客户端的TLS版本不一致
原因排查
- 服务器异常 运维给到结果,可以telnet通,但是curl不通,说明端口可以连接上但是握手失败,已经升级证书解决,curl可以连接,但是reset问题还未解决
- 长短连接不匹配 如果是长短连接不匹配,那么也是第一次响应之后短连接方断开连接,而我跟本没有收到响应,因此可以排除长短连接不一致的情况
- Https连接,TLS版本不一致(本次主要原因是线上老系统用的是jdk1.6, 默认支持tls1.0,调用的系统是jdk1.8,默认支持tls1.1)
解决方法
- 查服务器端支持的TLS版本,然后切换请求客户端的TLS版本
可以查指定域名TLS版本的网站
试出来服务器端支持的TLS版本
1. 打开Http客户端的配置(我用的是HttpClient,它的TLS配置在SSL连接工厂中的String数组参数)
public CloseableHttpClient closeableHttpClient() throws Exception {// Trust own CA and all self-signed certsString userDir = System.getProperty("user.dir");SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(new File(userDir + ocSetting.getCertPathCA()),ocSetting.getCertPasswordCA().toCharArray(),new TrustSelfSignedStrategy()).loadKeyMaterial(new File(userDir + ocSetting.getCertPathOutGoing()),ocSetting.getCertPasswordOutGoing().toCharArray(),ocSetting.getCertPasswordOutGoing().toCharArray()).build();// Allow TLSv1 protocol only//这里的问题,这里配置只允许TLSv1版本SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1"},//new String[] {"TLSv1","TLSv1.1","TLSv1.2",疯狂往里加}null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());return HttpClients.custom().setSSLSocketFactory(sslsf).build();
}
2. 以此切换TLS版本,直到不再出现Connection Reset
TLS版本有哪些?,这个在sun.security.ssl.ProtocolVersion中可以看到
static final ProtocolVersion NONE = new ProtocolVersion(-1, "NONE");
static final ProtocolVersion SSL20Hello = new ProtocolVersion(2, "SSLv2Hello");
static final ProtocolVersion SSL30 = new ProtocolVersion(768, "SSLv3");
static final ProtocolVersion TLS10 = new ProtocolVersion(769, "TLSv1");
static final ProtocolVersion TLS11 = new ProtocolVersion(770, "TLSv1.1");
static final ProtocolVersion TLS12 = new ProtocolVersion(771, "TLSv1.2");
3. 换上服务器支持的TLS版本,问题解决
本次公司解决方案
把nginx 支持的tls版本降低了,支持了tls1.0,虽然场景不同,但是原因相同
补充一些用法,客户端和服务器统一使用TCP短连接
既不用改nginx配置,也不用改tomcat配置,只需在使用HttpClient时使用http1.0协议并增加http请求的header信息(Connection: Close),源码如下:
httpGet.setProtocolVersion(HttpVersion.HTTP_1_0);
httpGet.addHeader(HTTP.CONN_DIRECTIVE, HTTP.CONN_CLOSE);
连接重置Connection reset异常相关推荐
- paho mqtt不定时抛出Connection reset异常导致客户端掉线
paho mqtt不定时抛出Connection reset异常导致客户端掉线 现象 分析 优化方案 现象 我们的项目采用paho的mqttv3库作客户端,起初运行状况良好,随着终端设备和用户量的增加 ...
- 一次SocketException:Connection reset 异常排查
一次SocketException:Connection reset 异常排查 参考文章: (1)一次SocketException:Connection reset 异常排查 (2)https:// ...
- Windows SSH无法连接之“connection reset by ip_address port 22“问题解决
现象:ssh 链接服务器,报如下错误,链接不上 Connection reset by 10.251.130.26 port 22 查看Client的日志信息如下,没有明显的错误 C:\Users\l ...
- Redis远程连接失败-“Connection reset by peer”的解决方式(Win10以及Ubuntu)
每篇一句: The business of life is the acquisition of memories. In the end that's all there is. 问题出现: 今天在 ...
- java网络编程的java.net.SocketException Connection reset异常
一开始学Stream时没注意过write的flush()方法,今天在学网络编程时,注意到了 服务器端: import java.net.*; import java.io.*; public clas ...
- 记录一次Socket异常:java.net.SocketException: Connection reset
先贴异常信息 java.net.SocketException: Connection resetat java.net.SocketInputStream.read(SocketInputStrea ...
- Netty 中 IOException: Connection reset by peer 与 java.nio.channels.ClosedChannelException: null
最近发现系统中出现了很多 IOException: Connection reset by peer 与 ClosedChannelException: null 深入看了看代码, 做了些测试, 发现 ...
- https请求报Connection reset问题
背景: 使用HttpsURLconnection或者HttpURLConnection进行https请求时,有时会报Connection reset异常 原因: 这是因为客户端的TLS版本服务端不支持 ...
- Connection reset 连接被重置的解决方法
流是java的核心部分,,昨天在做android服务器连接服务器的时候出了问题,就将代码放到java中执行,结果还是一样连接被重置 被重置的代码如下; 客户端代码; package 通信软件服务器;i ...
最新文章
- 产品经理的核心能力——看清问题本质
- ros 配置udev
- 自己身份信息泄漏了怎么办,别怕,带你了解身份管理与访问控制
- ibatis的isequal_isequal ibatis
- Ubuntu 首次给root用户设置密码
- android n 发布时间,Android N 正式版将在9月发布
- 如何解决 IDEA 占用大量 CPU 导致的卡顿问题?这顿操作猛如虎
- 用Python绘制一套“会跳舞”的动态图形给你看看
- 怎么用命令启动服务器文件,linux启动服务器命令
- ubuntu编译libid3tag库报错问题解决
- python写二进制大文件,如何将文件写入二进制文件,或在大文件中编辑单行– Python...
- Java判段两个日期的先后
- 采用计算机发布调度命令时 必须严格遵守,关于调度命令规范格式.doc
- 体育新闻html模板,HTML5响应式体育新闻资讯类门户网站模板源码+自适应移动端...
- 电池型号 常见的电池型号有哪些
- 从冲突到和谐:智能新文化环境中人机关系的伦理重构
- gird布局解决 最后一行数量不对布局问题
- StarUml----逆向工程操作步骤
- processing画正多边形
- STM32L031 ADC管脚电压采样