深入拆解 Tomcat & Jetty
李号双
eBay 技术主管
38890 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 45 讲
开篇词 (1讲)
深入拆解 Tomcat & Jetty
15
15
1.0x
00:00/00:00
登录|注册

38 | Tomcat拒绝连接原因分析及网络优化

acceptCount
maxConnections
java.net.SocketException: Too many open files
java.net.SocketException: Broken pipe
java.net.SocketException: Connection reset/Connect reset by peer: Socket write error
java.net.SocketException: Socket is closed
java.net.ConnectException: Connection refused: connect
java.net.BindException: Address already in use: JVM_Bind
java.net.SocketTimeoutException
Tomcat网络调优实战
Tomcat网络参数
常见异常
课后思考
本期精华
网络通信中可能会碰到的各种错误
JVM OutOfMemory错误的原因和解决办法
标题:Tomcat拒绝连接原因分析及网络优化
参考文章

该思维导图由 AI 生成,仅供参考

专栏上一期我们分析各种 JVM OutOfMemory 错误的原因和解决办法,今天我们来看看网络通信中可能会碰到的各种错误。网络通信方面的错误和异常也是我们在实际工作中经常碰到的,需要理解异常背后的原理,才能更快更精准地定位问题,从而找到解决办法。
下面我会先讲讲 Java Socket 网络编程常见的异常有哪些,然后通过一个实验来重现其中的 Connection reset 异常,并且通过配置 Tomcat 的参数来解决这个问题。

常见异常

java.net.SocketTimeoutException
指超时错误。超时分为连接超时读取超时,连接超时是指在调用 Socket.connect 方法的时候超时,而读取超时是调用 Socket.read 方法时超时。请你注意的是,连接超时往往是由于网络不稳定造成的,但是读取超时不一定是网络延迟造成的,很有可能是下游服务的响应时间过长。
java.net.BindException: Address already in use: JVM_Bind
指端口被占用。当服务器端调用 new ServerSocket(port) 或者 Socket.bind 函数时,如果端口已经被占用,就会抛出这个异常。我们可以用netstat –an命令来查看端口被谁占用了,换一个没有被占用的端口就能解决。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了Tomcat拒绝连接的原因分析及网络优化。首先分析了Java Socket网络编程中常见的异常,如SocketTimeoutException、BindException、ConnectException等,并提出了相应的解决办法。接着详细解释了Tomcat中的两个关键参数:maxConnections和acceptCount,并指出它们对于控制连接队列长度和最大连接数的重要性。在实战环节中,通过调整参数和内核参数,成功增加了系统的并发度。最后,提出了课后思考问题,引发读者对文章内容的深入思考和讨论。整体而言,本文内容丰富,涵盖了网络通信异常、Tomcat参数调优等多个方面,对于需要深入了解Tomcat网络优化的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解 Tomcat & Jetty 》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(18)

  • 最新
  • 精选
  • 读书看报
    老师可以讲下:Jconsole 线程信息里 总阻止数和总等待数的含义吗?还有线程已启动的总数(这个数字很大)是什么意思?

    作者回复: 阻塞意味着线程在调用了lock或者synchronized等待锁,等待数表示等待某个条件变量,已启动线程总数包括了所有创建的线程,包括线程池中线程,acceptor,poller和后台线程

    2019-08-18
    7
  • 读书看报
    老师能讲下 maxConnections 与 maxThreads 的区别和联系吗?

    作者回复: maxconnections 是连接数,maxthreads是线程数

    2019-08-08
    5
    3
  • -W.LI-
    老师好!TCP链接time_wait我和线程状态搞混了。。。我哭

    作者回复: 😄

    2019-08-08
  • magicnum
    增大accept队列长度使得tomcat并发短连接数暴增,必然导致服务器处理完请求后需要主动断开连的连接数增加;断开连接时四次挥手的最后一个阶段,客户端要等待2mls时间来保证服务端收到了客户端的ack(如果服务端没有收到最后一次挥手ack会重试,这时客户端需要重新发送ack),这时会导致大量time_wait;一旦达到上限将导致服务器拒绝服务
    2019-08-08
    46
  • 许童童
    TCP 连接处在 TIME_WAIT 状态,这个是TCP协议规定的,四次挥手时主动关闭方所处的一个状态,会等待2个MSL,所以在这个时间段内不会释放端口,如果并发量大的话,会导致端口不够用,从而影响新的TCP连接。
    2019-08-08
    2
    16
  • yang
    老师 这个问题我查了一下别处的答案 https://mp.weixin.qq.com/s/KtcDxcY-pZBsvwJhwuKJmw 说是tcp连接关闭的最后一步 time_wait 需要2MLS 文中说到: 请求方过多time_wait会导致“Cannot assign requested address”异常。      服务方过多time_wait会导致”Too Many Open Files”异常。
    2019-08-08
    1
    9
  • QQ怪
    保留timewait是为了是高效复用tcp连接,避免重复创建连接造成资源浪费,但过多的也会造成服务端文件打开数过多造成资源浪费
    2019-08-08
    3
  • 脱缰的野马__
    首先有几点需要明确: 1.连接关闭的发起方是请求端,四次挥手中的TIME_WAIT状态存在于请求端(发起方); 2.请求端每次进行HTTP请求的时候,会使用一个临时的端口号,而机器的端口号是有限的,接收端是固定监听某个端口的; 3.建立连接时,机器是要打开一个文件句柄(这里我不太确定请求端要不要打开,接收端是肯定要打开一个文件句柄的,有肯定的同学可以赐教)。 然后我们来看如果存在大量TIME_WAIT状态的链接可能存在的问题: 如果在高并发场景下,可能会有如下问题 1.请求端的端口耗尽,因为处于TIME_WAIT状态不能释放连接所占用的相关资源,临时端口就是。如果端口耗尽的话请求端就无法再向外部进行HTTP请求,导致服务不可用等问题; 2.由于一直TIME_WAIT状态,最直接的原因是接收端一直没有接收到请求端最后一次挥手中的ACK,所以会重试发送FIN和ACK,所以导致的问题是接收端的相关资源无法释放,文件句柄就是,那极端情况下会导致服务端报Too many open files错误,致使接收端服务不可用
    2021-01-29
    2
  • yang
    哇 老师, 您这里讲的 和 网络编程 那一专栏里讲的部分内容一致诶 难怪我读起那篇文章来没有一点违和感,原来在这里已经阅读过一遍了啊。
    2019-08-09
    1
  • 罗 乾 林
    连接在TIME_WAIT状态停留的时间为2倍的MSL。在2MSL等待期间,该端口不能再被使用。
    2019-08-08
    1
收起评论
显示
设置
留言
18
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部