详细信息

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)

场景回溯

  1. 首次请求 首次向其他系统API发送Https请求时报错
  2. 未得到响应
  3. 只有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异常相关推荐

  1. paho mqtt不定时抛出Connection reset异常导致客户端掉线

    paho mqtt不定时抛出Connection reset异常导致客户端掉线 现象 分析 优化方案 现象 我们的项目采用paho的mqttv3库作客户端,起初运行状况良好,随着终端设备和用户量的增加 ...

  2. 一次SocketException:Connection reset 异常排查

    一次SocketException:Connection reset 异常排查 参考文章: (1)一次SocketException:Connection reset 异常排查 (2)https:// ...

  3. Windows SSH无法连接之“connection reset by ip_address port 22“问题解决

    现象:ssh 链接服务器,报如下错误,链接不上 Connection reset by 10.251.130.26 port 22 查看Client的日志信息如下,没有明显的错误 C:\Users\l ...

  4. Redis远程连接失败-“Connection reset by peer”的解决方式(Win10以及Ubuntu)

    每篇一句: The business of life is the acquisition of memories. In the end that's all there is. 问题出现: 今天在 ...

  5. java网络编程的java.net.SocketException Connection reset异常

    一开始学Stream时没注意过write的flush()方法,今天在学网络编程时,注意到了 服务器端: import java.net.*; import java.io.*; public clas ...

  6. 记录一次Socket异常:java.net.SocketException: Connection reset

    先贴异常信息 java.net.SocketException: Connection resetat java.net.SocketInputStream.read(SocketInputStrea ...

  7. Netty 中 IOException: Connection reset by peer 与 java.nio.channels.ClosedChannelException: null

    最近发现系统中出现了很多 IOException: Connection reset by peer 与 ClosedChannelException: null 深入看了看代码, 做了些测试, 发现 ...

  8. https请求报Connection reset问题

    背景: 使用HttpsURLconnection或者HttpURLConnection进行https请求时,有时会报Connection reset异常 原因: 这是因为客户端的TLS版本服务端不支持 ...

  9. Connection reset 连接被重置的解决方法

    流是java的核心部分,,昨天在做android服务器连接服务器的时候出了问题,就将代码放到java中执行,结果还是一样连接被重置 被重置的代码如下; 客户端代码; package 通信软件服务器;i ...

最新文章

  1. 产品经理的核心能力——看清问题本质
  2. ros 配置udev
  3. 自己身份信息泄漏了怎么办,别怕,带你了解身份管理与访问控制
  4. ibatis的isequal_isequal ibatis
  5. Ubuntu 首次给root用户设置密码
  6. android n 发布时间,Android N 正式版将在9月发布
  7. 如何解决 IDEA 占用大量 CPU 导致的卡顿问题?这顿操作猛如虎
  8. 用Python绘制一套“会跳舞”的动态图形给你看看
  9. 怎么用命令启动服务器文件,linux启动服务器命令
  10. ubuntu编译libid3tag库报错问题解决
  11. python写二进制大文件,如何将文件写入二进制文件,或在大文件中编辑单行– Python...
  12. Java判段两个日期的先后
  13. 采用计算机发布调度命令时 必须严格遵守,关于调度命令规范格式.doc
  14. 体育新闻html模板,HTML5响应式体育新闻资讯类门户网站模板源码+自适应移动端...
  15. 电池型号 常见的电池型号有哪些
  16. 从冲突到和谐:智能新文化环境中人机关系的伦理重构
  17. gird布局解决 最后一行数量不对布局问题
  18. StarUml----逆向工程操作步骤
  19. processing画正多边形
  20. STM32L031 ADC管脚电压采样

热门文章

  1. 什么是java?以及java的初步简单学习
  2. 【莫安迪原创摄影作品】深圳最美夕阳-烟云成画
  3. 最适合十二星座的那些表白方式!
  4. 超有爱的并查集 6666
  5. 图片采集-输入关键词批量收集图片免费
  6. 后台模拟页面登陆_微信直播小程序后台,微信朋友圈可直达小程序直播了
  7. 11月14日:jquery
  8. A40I工控主板(SBC-X40I)CAN接口测试
  9. 张氏华孙公 福建省上杭县张氏第一代开基祖宗
  10. 中划线与下划线的区别