java.io.IOException: Connection reset by peer问题解决

2023-10-27

java.io.IOException: Connection reset by peer问题解决

今天检查日志。发现:ClientAbortException: java.io.IOException: Connection reset by peer
具体日志如下:

org.apache.catalina.connector.ClientAbortException: java.io.IOException: Connection reset by peer
   at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:393)
   at org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:426)
   at org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:342)
   at org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:317)
   at org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:110)
   *******
   at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:106)
   at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:231)
   at org.springframework.web.servlet.mvc.method.annotation.HttpEntityMethodProcessor.handleReturnValue(HttpEntityMethodProcessor.java:203)
   at org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:81)
   at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:113)
   at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
   at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
   at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
   at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
   at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
   at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
   at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
   at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
   at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
   at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
   at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
   at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:720)
   at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:468)
   at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:391)
   at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318)
   at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:445)
   at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:304)
   at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:181)
   at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
   at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
   at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:522)
   at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1095)
   at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
   at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1500)
   at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1456)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
   at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
   at java.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: Connection reset by peer
   at sun.nio.ch.FileDispatcherImpl.write0(Native Method)
   at sun.nio.ch.SocketDispatcher.write(SocketDispatcher.java:47)
   at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:93)
   at sun.nio.ch.IOUtil.write(IOUtil.java:65)
   at sun.nio.ch.SocketChannelImpl.write(SocketChannelImpl.java:471)
   at org.apache.tomcat.util.net.NioChannel.write(NioChannel.java:124)
   at org.apache.tomcat.util.net.NioBlockingSelector.write(NioBlockingSelector.java:101)
   at org.apache.tomcat.util.net.NioSelectorPool.write(NioSelectorPool.java:172)
   at org.apache.coyote.http11.InternalNioOutputBuffer.writeToSocket(InternalNioOutputBuffer.java:139)
   at org.apache.coyote.http11.InternalNioOutputBuffer.addToBB(InternalNioOutputBuffer.java:197)
   at org.apache.coyote.http11.InternalNioOutputBuffer.access$000(InternalNioOutputBuffer.java:41)
   at org.apache.coyote.http11.InternalNioOutputBuffer$SocketOutputBuffer.doWrite(InternalNioOutputBuffer.java:320)
   at org.apache.coyote.http11.filters.ChunkedOutputFilter.doWrite(ChunkedOutputFilter.java:116)
   at org.apache.coyote.http11.AbstractOutputBuffer.doWrite(AbstractOutputBuffer.java:256)
   at org.apache.coyote.Response.doWrite(Response.java:501)
   at org.apache.catalina.connector.OutputBuffer.realWriteBytes(OutputBuffer.java:388)

从代码中可以初步判断是在服务端输出内容时,通道断开了。然后在网上查询和运维沟通。结果整理如下:

使用 Java NIO 建立 Socket 服务端,当客户端意外关闭的情况,不是发送指定指令通知服务器退出,就会产生此错误。

常见产生问题的场景有:

  1. 服务器在接受处理用户请求时,自身的cpu、io、内存、线程等资源都是有最大限制的。当并发请求超过服务器的承载量时,服务器会停掉一些请求。(但是要注意如果实际的并发数量没有超过服务器的承载量,可能中了木马病毒问题导致的。这个时候需要分析了)。
  2. 客户端关闭了浏览器,但是服务端还是继续发送数据。
  3. 浏览器端按了Stop。(ps:有的文档说浏览器弹框阻止也类似stop情况,本人没有亲自测试。可以参考:这篇文章)。
    上面两种都是客户端造成的,但是因为服务端在进行读写,依然会记录日志的,如果频繁发生,也会造成困扰。可以区分日志进行捕获,少量记录。(一般来说则上面3中情况出现的频率很低)
  4. 防火墙/nginx影响了。
    • 一种是他们都设置了超时机制,超过了会关闭这个TCP会话。这个可以通过重新定义心跳机制,进行会话维护。
    • 一种是设置防高频策略。我的就是这种情况。防火墙DDos攻击常见防御方法

然后再查看了这些请求:
这些请求都是些非正常项目的路径请求。首先根据地址确认了试内网的地址,然后跟安全部门沟通后,确认确认了他们是在说资产发现和常规的外部漏洞扫描。因为我们做了防高频策略,所以产生了Connection reset by peer的信息。

在分析的过程中,涉及几个需要深入的课题,后续慢慢补全:
1>高并发的处理。
2>防DDOS攻击。
3>爬虫扫描等等

参考文档:
https://blog.csdn.net/testcs_dn/article/details/78707219
https://www.cnblogs.com/panxuejun/p/7160148.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.io.IOException: Connection reset by peer问题解决 的相关文章

随机推荐