异常记录——Connection reset

连接重置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版本,问题解决
技术不分领域,思想一脉相承,欢迎访问橙味菌的博客
本文由博客一文多发平台 OpenWrite 发布!
Image placeholder
vincent_ting_syuan_wang
未设置
  72人点赞

没有讨论,发表一下自己的看法吧

推荐文章
通过一个示例了解kafka connect连接器

什么是kafka连接器connect在实际工作中使用kafka,有时候会有类似这样的场景。我们需要把某些数据源的数据导入到kafka,或者把kafka作为数据源导出数据。或者两种场景的需求都要。这算是

Kubernetes 基础信息:什么是 Kubernetes?

简介 Kubernetes(常简称为K8s,在希腊语意为“舵手”或“驾驶员”)是用于自动部署、扩展和管理容器化(containerized)应用程序的开源系统。 由JoeBeda、BrendanBur

Chaos Mesh —— 让应用跟混沌在 Kubernetes 上共舞

作者:殷成文2019年12月31日,我们在GitHub上正式开源了ChaosMesh。作为一个云原生的混沌测试平台,ChaosMesh提供在Kubernetes平台上进行混沌测试的能力。本篇文章将围绕

IBM Spectrum Protect 8.1.7在AIX7.1上的安装和配置

                                                本文作者: 谷铁柏摘要:    本文章主要讲述IBMSpectrumProtect8.1.7版本在AIX

【Kubernetes系列】第5篇 Ingress controller – traefik组件介绍

1.概述为了能够让Ingress资源能够工作,在Kubernetes集群中必须至少有一个运行中的ingresscontroller组件。也就是说如果在kubernetes集群中没有一个ingressc

pymysql fetchone () , fetchall () , fetchmany ()

最近在用python操作mysql数据库时,碰到了下面这两个函数,标记一下: 1.定义 1.1fetchone(): 返回单个的元组,也就是一条记录(row),如果没有结果则返回None 1.2fet

Spark in action on Kubernetes – 存储篇

作者|阿里云智能事业群技术专家莫源前言在上篇文章中,SparkinactiononKubernetes–SparkOperator的原理解析我们分析了SparkOperator内部的机制,今天我们会讨

innerHTML与jquery里的html()区别?

innerHTML与jquery里的html()区别?●html()可以设置tbody、tr这些只读标签,而innerHTML在低版本IE下不行;jQuery的html()做了些容错处理,原生的Dom

MVVM原理(Object.defineProperty和订阅者模式)

想着去了解vue的mvvm数据驱动是怎么实现的,百度中看了这篇文章,demo很好。其他文章只是讲到defineProperty的set,get。彻底理解Vue中的Watcher、Observer、De

.net core与vue有区别吗?

.netcore是什么?.NETCore是一个新的开源和跨平台的框架,用于构建如Web应用、物联网(IoT)应用和移动后端应用等连接到互联网的基于云的现代应用程序。.NETCore是适用于window

PostgreSQL DBA(31) – Backup&Recovery#4(搭建流复制)

PostgreSQL通过流复制StreamingReplication可轻松实现高可用HA环境的搭建.本节简单介绍了搭建流复制环境的基本步骤.Step1主库:创建用户 创建复制用户replicator

Twitter 宣布抛弃 Mesos,全面转向 Kubernetes

作者|阿里云智能高级技术专家张磊划重点Twitter的基础设施从Mesos全面转向Kubernetes阿里云容器平台团队即将开源 Kubernetes高级作业管理集合美国西部时间5月2日下午7点,Tw

从ResNet的诞生讲起:美公司在北京的AI研究所出了成果,中美究竟谁受益更多?

大数据文摘出品来源:macropolo编译:狗小白、Aileen中美之间摩擦不断,如今,AI竞争也成为了其中重要的组成部分。让我们假设这样一个场景:美国AI公司设立在中国的实验室取得了一些突破,谁从中

你真的了解 React 吗?这里有 50 个 React 面试问题

如果你是一位有理想的前端开发人员,并且正在准备面试,那么这篇文章就是为你准备的。本文收集了React面试中最常见的50大问题,这是一份理想的指南,让你为React相关的面试做好充分的准备工作。首先我

React Hooks 完全指南,读React作者博文感悟(2W字精华)

阅读facebook大佬:DanAbramov的文章颇有感悟大佬github地址https://github.com/gaearon 重点总结 useEffect是同步的 状态是捕获的当前props

PHP 内核:讲下 PHP 7 底层虚拟机工作原理 —— Zend Virtual Machine 7.2 版本

本文旨在提供Zend虚拟机的概述,如php7所示。这不是一个全面的描述,但我试图涵盖大部分重要部分,以及一些更精细的细节。 此描述针对的是PHP7.2版(目前正在开发中),但几乎所有内容都适用于PHP

Python可视化 | Seaborn5分钟入门(二)——barplot&countplot&pointplot

微信公众号:「Python读财」如有问题或建议,请公众号留言Seaborn是基于matplotlib的Python可视化库。它提供了一个高级界面来绘制有吸引力的统计图形。Seaborn其实是在matp

Python 容器 Collections

容器(Collections) Python附带一个模块,它包含许多容器数据类型,名字叫作collections。我们将讨论它的作用和用法。 我们将讨论的是: defaultdict counter

Collection 笔记

wherecollect($session)->where('is_valid',1)->count(); collect($temp)->where('phone','!=','')->count(

electron+vue实现div contenteditable功能|截图

最近在学习基于electron+electron-vue开发聊天客户端项目时,需要用到编辑器插入表情功能。一般通过input或textarea也能实现,通过插入[笑脸]、(:12这些标签,展示的时候解

SQL 查询语句总是先执行 SELECT?你们都错了

很多SQL查询都是以SELECT开始的。不过,最近我跟别人解释什么是窗口函数,我在网上搜索”是否可以对窗口函数返回的结果进行过滤“这个问题,得出的结论是”窗口函数必须在WHERE和GROUPBY之后,

jQuery怎么删除select选项?

jQuery怎么删除select选项?一、使用伪类选择器、属性选择器+remove()方法删除select选项$("#select_idoption:last").remove();//删除Selec

jquery怎么操作select?

jquery怎么操作select?jquery操作select分为获取option的值、删除option、增加option、获取option的长度、清空select、判断select框中是否存在某个值

如何将echarts集成到react中

如何将echarts集成到react中在使用echarts之前需要先安装echarts,可以直接使用node命令来安装npminstallecharts--save包依赖安装完毕后,这个时候我们的EC