连接重置Connection reset

异常java.net.SocketException: Connection reset

详细信息

java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:210)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:465)
at sun.security.ssl.InputRecord.read(InputRecord.java:503)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:975)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1367)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1395)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1379)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:396)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:355)
at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:142)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:373)
at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:381)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:237)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:185)
at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:111)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
at com.senthink.www.oc.http.HttpRequester.execute(HttpRequester.java:170)

场景回溯

  1. 首次请求 首次向电信物联网平台API发送Https请求时报错
  2. 未得到响应
  3. 只有Soctet异常:Connection Reset

出现原因

Connection Reset——其中一端主动断开连接

Connection Reset是在建立TCP连接之后,其中一方的TCP标志位使用了Reset标志主动重置了连接

客户端Or服务器端

而我这里既然是客户端报的错误信息,那势必是服务器主动断开了连接

为什么它要断开连接

服务器主动断开连接的原因:

  • 服务器异常

  • 服务器和客户端长短连接不匹配

  • Https连接,服务器和客户端的TLS版本不一致

原因排查

  • 服务器异常 电信作为三大运营商,它的服务器出现异常的可能性不大
  • 长短连接不匹配 如果是长短连接不匹配,那么也是第一次响应之后短连接方断开连接,而我跟本没有收到响应,因此可以排除长短连接不一致的情况
  • Https连接,TLS版本不一致

用排除法分析出:此时连接重置的原因是TLS版本不一致

解决方法

  • 查服务器端支持的TLS版本,然后切换请求客户端的TLS版本

    可以查指定域名TLS版本的网站

  • 试出来服务器端支持的TLS版本

    1. 打开Http客户端的配置(我用的是HttpClient,它的TLS配置在SSL连接工厂中的String数组参数)

      public CloseableHttpClient closeableHttpClient() throws Exception {
      // Trust own CA and all self-signed certs
      String 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版本,问题解决

异常记录 Connection reset的更多相关文章

  1. 解决Jedis链接报超时异常和connection reset异常的方法

    一.链接池配置 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig" ...

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

    问题描述 上一期的需求上线之后,线上多了一个异常:Connection reset.如下: [2017-03-22 00:45:00 ERROR] [creativeAuditTaskSchedule ...

  3. Connection reset by peer问题分析

    extremetable导出excel,弹出一个下载窗口,这时不点下载而点取消,则报下面的异常: ClientAbortException Caused by: java.net.SocketExce ...

  4. 困扰我多年的Connection reset问题

    第一次出现:是thrift的python client去请求server,发现偶尔出现这个问题 第二次:接入第三方的api,去请求数据时,发现一个接入方的api第一次总是报这个错,当时又没有做处理,导 ...

  5. 从tcp原理角度理解Broken pipe和Connection reset by peer的区别

    从tcp原理角度理解Broken pipe和Connection reset by peer的区别 http://lovestblog.cn/blog/2014/05/20/tcp-broken-pi ...

  6. Java socket 说明 以及web 出现java.net.SocketException:(Connection reset或者Connectreset by peer:Socket write error)的解释

    另外http://www.cnblogs.com/fengmk2/archive/2007/01/15/using-Socket.html可供参考   一Java socket 说明 所谓socket ...

  7. java.net.SocketException: Connection reset 解决方法

    java.net.SocketException: Connection reset 解决方法 最近纠结致死的一个java报错java.net.SocketException: Connection ...

  8. 最近纠结致死的一个java报错java.net.SocketException: Connection reset 终于得到解决

    自从SEOTcs系统11月份24日更新了一下SEO得分算法以来,一直困扰我的一个问题出现了,java的数据job任务,在执行过程中会经常报以下的错误: “2011-12-03 18:00:32 Def ...

  9. Connection reset by peer的常见原因

    1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer). Socket默认连接60秒 ...

随机推荐

  1. 交互式计算和开发环境:IPython

  2. CNN如何识别一幅图像中的物体

    让我们对卷积神经网络如何工作形成更好直观感受.我们先看下人怎样识别图片,然后再看 CNNs 如何用一个近似的方法来识别图片. 比如说,我们想把下面这张图片识别为金毛巡回犬.   一个需要被识别为金毛巡 ...

  3. 伪静态的实现方法:IIS环境下配置

    URL 静态化可以提高搜索引擎抓取,开启本功能需要对 Web 服务器增加相应的 Rewrite 规则,且会轻微增加服务器负担.本教程讲解如何在 IIS 环境下配置各个产品的 Rewrite 规则. 下 ...

  4. hdu 1156 && poj 2464 Brownie Points II (BIT)

    2464 -- Brownie Points II Problem - 1156 hdu分类线段树的题.题意是,给出一堆点的位置,stan和ollie玩游戏,stan通过其中一个点画垂线,ollie通 ...

  5. oracle强制索引失效

    如果两个或以上索引具有相同的等级,你可以强制命令ORACLE优化器使用其中的一个(通过它,检索出的记录数量少) . 举例: SELECT ENAME FROM EMP WHERE EMPNO = 79 ...

  6. 给tomcat容器配置SSL的记录,包含项目完整部署过程

    给tomcat容器配置SSL(https) 昨天公司有一个旧的项目要部署, 服务器(OS是windows 10) 数据库都是新买的, 写个博客记录一下 1, 下载证书(以阿里云为例子) 参考链接: h ...

  7. 基于jquery读取input上传的文件内容

    <script src="/static/js/jquery.js"></script> // 前端页面实现头像预览 // 当用户选中文件之后,也就是头像的 ...

  8. 2018-2-25-git-rebase-合并多个提交

    title author date CreateTime categories git rebase 合并多个提交 lindexi 2018-02-25 11:41:26 +0800 2018-2-1 ...

  9. Python--day36--操作系统的作用;多道技术;

  10. Promise的封装

    要封装Promise,首先要了解Promise的使用. Promise有以下几个特点:1.Promise是一个构造函数 2.实例化Promise时有两个回调函数,resolve,reject ,成功执 ...