我正在使用端口,不能在进程重新启动时绑定。我在试图找出端口何时被考虑使用?
只有在收听模式下才会这样吗?如果连接以TIME_WAIT状态打开到端口(或TCP 有限状态机中的任何其他状态),也可能是这样吗?
tcp 0 0 127.0.0.1:7199 0.0.0.0:* LISTEN 30099/java
tcp 0 0 192.168.1.2:9160 0.0.0.0:* LISTEN 30099/java
tcp 0 0 192.168.1.2:58263 192.168.1.2:9042 TIME_WAIT -
tcp 0 0 192.168.1.2:58262 192.168.1.2:9042 TIME_WAIT -
tcp 0 0 ::ffff:192.168.1.2:9042 :::* LISTEN 30099/java
tcp 0 0 ::ffff:192.168.1.2:9042 ::ffff:192.168.1.2:57191 ESTABLISHED 30099/java
tcp 0 0 ::ffff:192.168.1.2:9042 ::ffff:192.168.1.2:57190 ESTABLISHED 30099/java
tcp 0 0 ::ffff:192.168.1.2:9042 ::ffff:10.176.70.226:37105 ESTABLISHED 30099/java
tcp 0 0 ::ffff:127.0.0.1:42562 ::ffff:127.0.0.1:7199 TIME_WAIT -
tcp 0 0 ::ffff:192.168.1.2:57190 ::ffff:192.168.1.2:9042 ESTABLISHED 30138/java
tcp 0 0 ::ffff:192.168.1.2:57198 ::ffff:192.168.1.2:9042 ESTABLISHED 30138/java
tcp 0 0 ::ffff:192.168.1.2:9042 ::ffff:10.176.70.226:37106 ESTABLISHED 30099/java
tcp 0 0 ::ffff:192.168.1.2:57197 ::ffff:192.168.1.2:9042 ESTABLISHED 30138/java
tcp 0 0 ::ffff:192.168.1.2:57191 ::ffff:192.168.1.2:9042 ESTABLISHED 30138/java
tcp 0 0 ::ffff:192.168.1.2:9042 ::ffff:192.168.1.2:57198 ESTABLISHED 30099/java
tcp 0 0 ::ffff:192.168.1.2:9042 ::ffff:192.168.1.2:57197 ESTABLISHED 30099/java
tcp 0 0 ::ffff:127.0.0.1:42567 ::ffff:127.0.0.1:7199 TIME_WAIT -所讨论的过程是一个Java进程,它公开了JMX端口。有几个监控代理将请求发送到该端口以获取信息。我希望确保当重新启动发生时(停止之后和启动之前),端口是空闲的,因此不会遇到端口绑定问题。如果该端口上的挂起的TIME_WAIT连接被考虑用于所使用的端口,那么我将在停止和启动之间添加等待,以便在进程启动之前清理这些TIME_WAIT状态。除非还有其他更好的选择。
谢谢
发布于 2016-01-28 21:20:00
每当有任何套接字绑定到端口时,端口就被视为“正在使用”。他们不需要在听的状态下,只是被捆绑。因此,您看到的TIME_WAIT套接字是计数的。
如果任何套接字被绑定到地址和端口,它会变得更加复杂。如果不同的套接字绑定到不同的地址,则允许将它们绑定到同一个端口。但是,如果有任何套接字绑定到该端口的通配符地址(INADDR_ANY,由netstat显示为*),它将阻止其他套接字绑定到任何地址和同一个端口。
通常,大多数使用侦听套接字的软件都会在这些套接字上设置SO_REUSEADDR套接字选项。这个选项放宽了规则。使用选项集,只有绑定和侦听套接字才能防止另一个套接字绑定到同一个地址。这意味着任何挥之不去的TIME_WAIT和其他套接字都不会阻止软件立即重新启动和重新绑定到同一个端口。
您的Java程序很可能没有在其套接字上设置SO_REUSEADDR,但它应该设置。
https://unix.stackexchange.com/questions/258379
复制相似问题