端口被占用, 多个端口状态为TIME_WAIT

 报错抛出的异常:

java.io.IOException: Cannot bind to URL [rmi://127.0.0.1:1090/jmxconnector]: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: Exception creating connection to: 127.0.0.1; nested exception is: 
java.net.SocketException: No buffer space available (maximum connections reached?): connect]

 字面意思是说,缓冲池满了,达到最大连接。能看出来的就是端口被占用了,然后去查了一下端口的使用情况,发现状态全是TIME_WAIT

 什么是TIME_WAIT?(转载自:http://elf8848.iteye.com/blog/1739571)

TIME_WAIT状态原理

----------------------------

通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态。

客户端主动关闭连接时,会发送最后一个ack后,然后会进入TIME_WAIT状态,再停留2个MSL时间(后有MSL的解释),进入CLOSED状态。

下图是以客户端主动关闭连接为例,说明这一过程的。

TIME_WAIT状态存在的理由

----------------------------

TCP/IP协议就是这样设计的,是不可避免的。主要有两个原因:

1)可靠地实现TCP全双工连接的终止

TCP协议在关闭连接的四次握手过程中,最终的ACK是由主动关闭连接的一端(后面统称A端)发出的,如果这个ACK丢失,对方(后面统称B端)将重发出最终的FIN,因此A端必须维护状态信息(TIME_WAIT)允许它重发最终的ACK。如果A端不维持TIME_WAIT状态,而是处于CLOSED 状态,那么A端将响应RST分节,B端收到后将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。

因而,要实现TCP全双工连接的正常终止,必须处理终止过程中四个分节任何一个分节的丢失情况,主动关闭连接的A端必须维持TIME_WAIT状态 。

2)允许老的重复分节在网络中消逝 

TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个迟到的迷途分节到达时可能会引起问题。在关闭“前一个连接”之后,马上又重新建立起一个相同的IP和端口之间的“新连接”,“前一个连接”的迷途重复分组在“前一个连接”终止后到达,而被“新连接”收到了。为了避免这个情况,TCP协议不允许处于TIME_WAIT状态的连接启动一个新的可用连接,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个新TCP连接的时候,来自旧连接重复分组已经在网络中消逝。

MSL时间

----------------------------

MSL就是maximum segment lifetime(最大分节生命期),这是一个IP数据包能在互联网上生存的最长时间,超过这个时间IP数据包将在网络中消失 。MSL在RFC 1122上建议是2分钟,而源自berkeley的TCP实现传统上使用30秒。

TIME_WAIT状态维持时间

----------------------------

TIME_WAIT状态维持时间是两个MSL时间长度,也就是在1-4分钟。Windows操作系统就是4分钟。

用于统计当前各种状态的连接的数量的命令

为什么出现这样的问题?

这个问题是我在做公司项目,现场实施出现的问题。

第一种情况:很可能是现场实施操作不当出现的问题,这个项目是Jboos启动,端口用的是5555,上一个项目启动完,关闭的时候,很多实施会直接点Jboos启动后小黑框的× 关闭这项目,就会导致上个项目没有完全关闭。

第二种情况:项目创建的请求过多,比如界面有个请求按钮,用户一直在点请求按钮,导致一直发送请求,但是TIME_WAIT需要4分钟之后自动关闭,就会导致大量这个问题

第三种情况:项目代码书写有问题,有一个请求没有合理关闭,重复请求导致

怎么解决?

1. 优化代码(第二种情况,第三种情况)

2.更改TIME_WAIT的自动关闭时间配置(参考——解决TIME_WAIT过多造成的问题 - 芹溪 - 博客园)(但是其实对于对于第二种情况并没有什么卵用,用户才不会管你几分钟,就是一直点,老老实实优化代码才是正道)。

3. 在任务管理器里面关闭上一个程序(第一种情况)

4. 重启电脑(终极大招,无敌)

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值