来源:http://t.cn/E4J2p8i
艿艿:看到 Connection reset by peer 异常,会不会头疼???
最近在使用netty作为http客户端通过pool连接tomcat的时候,出现了很多Connection reset by peer 的IOException的异常。便对问题的根源做了细致的调研。
一般连接主要分为长连接,短连接和http的keepalive连接。
1.1 长连接:建立完连接后,该连接不再进行释放。
1.2 短连接:每次请求均需要tcp三次握手建立连接,业务执行,tcp四次挥手关闭连接。
1.3 http的keepalive:用于http协议。在http 1.1中,为了解决长连接提出的。
提到keepalive, 容易对下面三种机制混淆:
用途:高可用,一般是和lvs一起使用。
具体可参考:http://outofmemory.cn/wiki/keepalived-configuration
用途:socket连接的保活。在新建socket的时候,可以设置SO_KEEPALIVE 进行打开。
keepalive主要有三个参数:
用途:http的长连接,在http 1.0中使用的为短连接:每一次请求均需要新建tcp连接,http协议数据的发送接收,关闭tcp连接。 该种机制性能很 低,在http 1.1协议中引入了keepalive机制来保持tcp连接。
在http1.0中,全部是短连接,如果想建立长连接,需要在header里面加上keepalive,这样web服务器看到这个字段,不会立马关闭连接。而是将tcp连接维持一段时间。如果需要关闭,则在header中写 keepalive close,来告诉 客户端需要关闭该连接。
在http1.1中,默认会实现keepalive,如果使用的是http1.1协议,header是不需要加上keepalive的。
tomcat8中,如果发送的是http1.0的协议。 tomcat8返回的均是1.1的协议。并且不管请求的header有没有Connection:keepalive ,均会在返回的header中加上connection:close 。下面是访问tomcat8的截图:
img
img
tomcat8主要有两个参数来控制keepalive的机制。keepAliveTimeout 和maxKeepAliveRequests
如果需要tomcat保持长连接:可配置 maxKeepAliveRequests = "-1" keepAliveTimeout=-"-1" ,则tomcat8不会关闭掉该连接。
主要需要处理两个地方:
如果是IO(同步socket):则在获取连接的时候需要检查一下该socket的连接状态。 因为tcp在底层已经关闭了该连接。 如果不检查的话,则会SocketCloseException的错误。
如果是NIO(异步channel) :则在selector的时候,read数据的时候,会返回-1,然后将该连接从连接池给物理关闭掉。
异常场景:
连接池出现该异常分析:
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有