TLS的一而再装置,互联网编程中send和recv常见错误梳理

by admin on 2019年5月30日

  一贯在Linux下玩,唯一不爽的哪怕未有Linux下好用的股票(stock)软件。
用了1个都10分之诡异。
都以用wine0.9去虚拟windows200叁下的股票(stock)软件,不精晓是还是不是和用代理服务器有关联,别的壹台机械有2块网卡,做代理,自个儿的连那多少个机器。

FTP over TLS 0.玖.5壹升格后, 进入管理面板, 会出现如下警告提醒:
Warning: FTP over TLS is not enabled, users cannot securely log in.
代表未启用tls格局, 为在此在此之前几日非常确切操作了叁遍.

自己是小小强,那是自个儿的第3篇原创小说,阅读供给差非常少1陆分钟。

背景

线上某台机器出现反复的获得mysql连接超时,
项目用的是阿里的Druid连接池

  同花顺

home88一必发 1


排查步骤

1、 通过日记能够观察服务时获得连接池超时

2017-07-14 13:10:01,973 [DubboServerHandler-10.25.65.225:20900-thread-174] ERROR com.alibaba.dubbo.rpc.filter.ExceptionFilter (ExceptionFilter.java:87) -  [DUBBO] Got unchecked and undeclared exception which called by 10.25.68.15. service: com.bilin.user.dynamic.service.IUserDynamicService, method: queryNewestDynamicMsgByUser, exception: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10000, active 0, dubbo version: 2.4.9, current host: 10.25.65.225
org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10000, active 0
        at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82)
        at org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:183)
        at org.springframework.orm.ibatis.SqlMapClientTemplate.executeWithListResult(SqlMapClientTemplate.java:220)
        at org.springframework.orm.ibatis.SqlMapClientTemplate.queryForList(SqlMapClientTemplate.java:267)
        at com.bilin.sdk.dao.base.BaseDAO.queryForList(BaseDAO.java:27)
Caused by: com.alibaba.druid.pool.GetConnectionTimeoutException: wait millis 10000, active 0
        at com.alibaba.druid.pool.DruidDataSource.getConnectionInternal(DruidDataSource.java:1071)
        at com.alibaba.druid.pool.DruidDataSource.getConnectionDirect(DruidDataSource.java:898)
        at com.alibaba.druid.filter.FilterChainImpl.dataSource_connect(FilterChainImpl.java:4544)
        at com.alibaba.druid.filter.stat.StatFilter.dataSource_getConnection(StatFilter.java:661)

二、 估计或然的因由

  • 并发量太高
    从数量上看,每秒不到一k呼吁,后端mysql服务器的负载也不高,所以这些原因基本免除
  • TLS的一而再装置,互联网编程中send和recv常见错误梳理。连接池连接数设置过低
    作业设置的minIdel 十0, maxConnection 300, 所以这些缘故基本免除。
  • TLS的一而再装置,互联网编程中send和recv常见错误梳理。mysql服务故障
    陈设在别的机器上的服务,还大概有使用同三个db实例的其余事情没出现非常情形,所以那原因概率非常小
  • mysql链接设置过低

三、
由于尚未比较显明的恐怕性,所以不得不看下源码(版本一.0.5)找下实际的来头。
DruidDataSource
可怜的抛出是在拾7一行
throw new
GetConnectionTimeoutException(errorMessage);
鉴于设置了链接获取的晚点时间

<property name="maxWait" value="10000" />

再正是由报错的日记可见,连接等待了拾秒获取失利,所以可获悉推行的措施时pollLast

            if (maxWait > 0) {
                holder = pollLast(nanos); //L 1021
            } else {
                holder = takeLast();
            }

druid的总是获取,是因此notEmpty和empty四个变量和煦线程的协同,pollLast开掘没可用连接时,就能notEmpty.await(),同有时候empty.signal().
emtpy.signal首要唤醒了CreateConnectionThread.
通过摸底CreateConnectionThread的源码,发掘在有个别意况下线程会退出。
情况1

  try {
      connection = createPhysicalConnection();
  } catch (SQLException e) {
      LOG.error("create connection error", e);

      errorCount++;
      //当错误次数达到设置值时,breakAfterAcquireFailure设置为true时线程会退出
      if (errorCount > connectionErrorRetryAttempts && timeBetweenConnectErrorMillis > 0) {
          if (breakAfterAcquireFailure) {
              break;
          }

          try {
              Thread.sleep(timeBetweenConnectErrorMillis);
          } catch (InterruptedException interruptEx) {
              break;
          }
      }
  } catch (RuntimeException e) {
      LOG.error("create connection error", e);
      continue;
  } catch (Error e) {
      LOG.error("create connection error", e);
      break;
  }

情况2

DruidConnectionHolder holder = null;
try {
    holder = new DruidConnectionHolder(DruidDataSource.this, connection);
} catch (SQLException ex) {
    //这里也会退出
    LOG.error("create connection holder error", ex);
    break;
}

动静1出于在该项目中没安装breakAfterAcquireFailure,选用暗许值false,所以景况一非常小大概出现,Error属于不可苏醒错误,所以退出也说得过去。
状态2就有一点点不创造,单个的SQLException也会招致整个的生存线程结束。

4、 所以接下去首借使承认CreateConnectionThread是还是不是留存十一分
经过jstack
grep线程名Druid-ConnectionPool-Create(线程有设置线程名是个好习于旧贯),从grep的结果,发掘存在一个CreateConnectionThread,由于专门的工作设置了五个连接池,所以2个是不正规

# sudo -u www-data jstack 10750  | grep "Druid-ConnectionPool-Create"
"Druid-ConnectionPool-Create-376416626" daemon prio=10 tid=0x00007faab4039800 nid=0x2ae3 waiting on condition [0x00007faac3ec6000]

后续grep一下Destroy线程,确认是五个线程,所以Destroy线程不荒谬,进一步承认了CreateConnectionThread线程存在难点。

# sudo -u www-data jstack 10750  | grep "Druid-ConnectionPool-Des"   
"Druid-ConnectionPool-Destory-376416626" daemon prio=10 tid=0x00007faab403a800 nid=0x2ae4 waiting on condition [0x00007faac3e85000]
"Druid-ConnectionPool-Destory-190586441" daemon prio=10 tid=0x00007faad8fb1800 nid=0x2a3d waiting on condition [0x00007faac9dda000]

5、
基本认同了是出于CreateConnectionThread不健康甘休,所以最终一步正是搜索证听别人阐明线程不正规的终结。通过上述源码,可看出Druid在每一步的老大管理都会记录日志,所以经过日记关键字伸开grep,开采在16八贰行写了个错误日志,对应到的正规线程退出情状2.所以难点的原原本本的经过便是druid在赢得mysql连接后创建DruidConnectionHolder时出于互连网原因报了MySQLException导致了CreateConnectionThread退出。

2017-07-14 00:26:59,609 [Druid-ConnectionPool-Create-190586441] ERROR com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread (DruidDataSource.java:1682) - create connection holder error
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
The last packet successfully received from the server was 0 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.
        at sun.reflect.GeneratedConstructorAccessor33.newInstance(Unknown Source)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:525)
        at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
        at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3673)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3562)
        at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4113)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2812)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2761)
        at com.mysql.jdbc.StatementImpl.executeQuery(StatementImpl.java:1612)
        at com.mysql.jdbc.ConnectionImpl.getTransactionIsolation(ConnectionImpl.java:3352)
        at com.alibaba.druid.filter.FilterChainImpl.connection_getTransactionIsolation(FilterChainImpl.java:347)
        at com.alibaba.druid.filter.FilterAdapter.connection_getTransactionIsolation(FilterAdapter.java:872)
        at com.alibaba.druid.filter.FilterChainImpl.connection_getTransactionIsolation(FilterChainImpl.java:344)
        at com.alibaba.druid.filter.FilterAdapter.connection_getTransactionIsolation(FilterAdapter.java:872)
        at com.alibaba.druid.filter.FilterChainImpl.connection_getTransactionIsolation(FilterChainImpl.java:344)
        at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.getTransactionIsolation(ConnectionProxyImpl.java:260)
        at com.alibaba.druid.pool.DruidConnectionHolder.<init>(DruidConnectionHolder.java:92)
        at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:1680)
Caused by: java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:189)
        at java.net.SocketInputStream.read(SocketInputStream.java:121)
        at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)
        at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)
        at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)
        at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3116)
        at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3573)
        ... 16 more

陆、
查看了时尚版本一.1.贰那有的的代码,开掘那壹部分代码已经重构了,不设有该难点,所以升级版本就可以。

  不能够连接市场价格服务器,一连接就挂在那边不动了。应该是liveupdate不可能连接server。
想了多个方法,先脱机浏览,然后选拔晋级,会唤起进级战败,然后重新连接行情服务器就不会重新张开liveupdate了,就足以连绵不断上了。
不过最有一点点意料之外的事物,下载数据的时候总是会13分退出,也许直接开着过壹会就那多少个退出了,还尚无找到原因。

home88一必发 2
进去安装->ssl/tls设置.

互联网开采时,调用send和recv实行数量收发,平日会遇上有的不行难题,导致重返值为-一,errno被置为有个别特殊值。那时就必要大家依照经验,结合实际情况判断难题规范,那样技艺急速稳固和管理难题。下边计算了有的付出中,平日会遇上的主题素材。

总结

一、故障的本丑时1.0.五,公布于201肆年,属于比较旧的版本,开源工具不可幸免的会存在bug,所以须求立即的拓展提高
二、使用开源工具时,尽大概的选择最新的本子。

  大智慧5.50

 

  • Connection reset by peer
    以此荒唐一般是对端已经关闭连接(处于关闭连接进程中),本端还是向对端发送数据导致。

  • Broken pipe
    本条错误一般是向一个早已倒闭的套接字中写多少,导致管道错误。暗许操作系统会终止进程,在c程序中须要将该随机信号忽略。
    当向贰个早已倒闭的链接发送数据时,由于处在tcp的情景差异,恐怕会促成地点二种差别的结果。

  • errno为EAGAIN EWOULDBLOCK EINTR
    以此是程序中当send和recv重回-一时,决断errno即便为上述值,须要重新send和recv。有下边多少个状态:

    1. 用来非阻塞套接字
    2. 闭塞套接字,但是设置了SO_RCVTIMEO和SO_SNDTIMEO
    3. O_NODELAY会导致write接口再次来到EAGAIN。假设设置了O_NODELAY而当前不行写,那么write接口会设置errno为EAGAIN,可是write接口会重临0而不是-一。
  • **recv返回0 **
    本条是对端已经见惯不惊关闭套接字,本端获取那些重回值时,也应该常常关闭。假设对端调用close关闭套接字,本端的recv会从阻塞状态(若是处在阻塞的话)即刻重临0。

  • send和recv平素不通
    用于非阻塞套接字,且未设置超时时间。有以下景况:

    1. 发送方阻塞:内核发送缓冲区已满,无法将数据从用户空间拷贝到内核空间,一般对端未立刻读取数据导致。
    2. 接收方阻塞:发送方未发送数据导致基本接收缓冲区为空或然应用未立时取走数据。
      在阻塞状态下,假设断开互联网连接,有十分的大希望一贯不通下去。
  • 两边同不时间send导致死锁难题
    参考http://m.blog.csdn.net/article/details?id=64131277

  这么些就更难熬了,总是提醒要三个mozilla的activeX控件,没有装就不可能瞥见日k线。只可以看见分时市场价格,但是也选不了日k线。
还在大力追寻能在Ubuntu
六.0陆下得以常常的run的股票软件,再去试多少个去。

home88一必发 3
扭转多少个新证书. 服务器地址用机器的ip就能够.

其余在java中,会有壹对不行,从网络摘录如下

Connection reset by peer的相近原因:
一)服务器的并发连接数超越了其承载量,服务器会将个中一些总是关闭;
如果知道实际连接服务器的并发客户数未有当先服务器的承载量,则有非常的大希望是中了病毒依然木马,引起互连网流量十分。能够接纳netstat
-an查看网络连接意况。
贰)客户关掉了浏览器,而服务器还在给客户端发送数据;
三)浏览器端按了Stop;
那三种情况相似不会潜移默化服务器。不过1旦对那么些消息并未有特地管理,有望在服务器的日志文件中,重复出现该特别,变成服务器日志文件过大,影响服务器的运作。能够对滋生极其的一些,使用try…catch捕获该特别,然后不出口或然只输出一句提醒消息,制止选拔e.printStackTrace();输出全体可怜新闻。
四)防火墙的主题材料;
一经互联网连接通过防火墙,而防火墙一般都会有逾期的机制,在网络连接长日子不传输数据时,会停业这一个TCP的对话,关闭后在读写,就能招致格外。
假如关闭防火墙,消除了问题,供给重新配置防火墙,或许本人编写程序实现TCP的长连接。落成TCP的长连接,供给自身定义心跳协议,每隔壹段时间,发送贰次心跳协议,双方保持连接。
5)JSP的buffer问题。
JSP页面缺省缓存为八k,当JSP页面数据一点都十分的大的时候,有希望JSP未有完全传送给浏览器。那时能够适合调度buffer的尺寸。
<%@ page buffer=”100k”%>

home88一必发 4

 

其余相当

第一个要命是java.Net.BindException:Address already in use:
JVM_Bind。该非常爆发在劳动器端进行new
ServerSocket(port)(port是二个0,6553陆的整型值)操作时。非常的原由是认为与port一样的四个端口已经被运维,并展开监听。此时用netstat
–an命令,能够看来多个Listending状态的端口。只须求找1个不曾被侵吞的端口就能够化解这些主题素材。

第一个13分是java.net.ConnectException: Connection refused:
connect。该非常发生在客户端举行 new Socket(ip,
port)操作时,该特别产生的来由是依旧有所ip地址的机器无法找到(约等于说从当下机械不设有到钦赐ip路由),可能是该ip存在,但找不到内定的端口进行监听。现身该难题,首先检查客户端的ip和port是不是写错了,借使没有错则从客户端ping一下服务器看是或不是能
ping通,假设能ping通(服务服务器端把ping禁掉则须求其它的法门),则看在服务器端的监听内定端口的主次是还是不是运行,这么些一定能一举成功这一个主题素材。

首个特别是java.net.SocketException: Socket is
closed,该特别在客户端和服务器均可能发生。分外的从头到尾的经过是己方主动关闭了连年后(调用了Socket的close方法)再对互连网连接实行读写操作。

第多个11分是java.net.SocketException: (Connection reset或许 Connect
reset by peer:Socket write
error)。该非常在客户端和劳动器端均有相当大希望产生,引起该极其的原由有三个,第二个便是1旦1端的Socket被关闭(或积极关闭大概因为特别退出而滋生的停业),另一端仍发送数据,发送的率先个数据包引发该非常(Connect reset by
peer)。另一个是一端退出,但剥离时未有关闭该连接,另1端借使在从三番五次中读数据则抛出该极度(Connection
reset)。简单来说正是在连接断开后的读和写操作引起的。

第四个极其是java.net.SocketException: Broken
pipe。该非常在客户端和服务器均有不小可能率爆发。在第陆个13分的率先种意况中(也正是抛出SocketExcepton:Connect
reset by peer:Socket write
error后),倘若再持续写多少则抛出该极度。前多个极度的消除措施是率先保障程序退出前关闭全部的互联网连接,其次是要检查测试对方的倒闭连接操作,开采对方关闭连接后自身也要关门该连接。

客户端错误代码100伍3 Software caused connection
abort(软件原因导致连日中断)

home88一必发 5
点击生成证书, ①会儿就提示成功.

 

home88一必发 6
密钥的密码轻便输入两个. 注意看上面有叁个端口. 那是意味着ssl,
tls连接端口.
末尾点击左下的承认就能够.

 

home88一必发 7
当您用sll 只怕 tls连接时, 它会提示您证书音信, 你选用经过并且保留就能够..

 

home88一必发 8
FTP日志突显, tls加密连接成功..

 

home88一必发 9
默许的ftp方式, 二一端口是力不从心连接的.

 

home88一必发 10
你会吸收接纳它的不胜音信.

 

home88一必发 11
Implicit SSL 端口为990, 能够连接. 那端口号也正是刚刚设置中那些.
explicit SSL 端口为二一, 能够连接.
home88一必发,explicit TLS 端口为二一, 能够连接.

民用推举用: Implicit SSL

Ubuntu
12.10下安装FileZilla 3.5.3 见
http://www.linuxidc.com/Linux/2012-11/73951.htm

FileZilla Server
0.九.45架构FTP服务器图文化教育程

http://www.linuxidc.com/Linux/2014-06/102840.htm

FileZilla Client
的详细介绍
:请点这里
FileZilla Client
的下载地址
:请点这里

本文永恒更新链接地址:http://www.linuxidc.com/Linux/2015-05/117620.htm

home88一必发 12

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图