何时考虑使用端口?

kra*_*fts 2 networking process administration socket

我正在使用的端口无法在进程重新启动时绑定。我想知道何时考虑使用端口?

是否仅在 LISTEN 模式下?如果连接在 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   -
Run Code Online (Sandbox Code Playgroud)

有问题的进程是一个暴露 JMX 端口的 Java 进程。并且有一些监控代理向该端口发送请求以获取信息。我想确保当重启发生时(在停止之后和开始之前)端口是空闲的,所以它不会遇到端口绑定问题。如果正在使用的端口考虑该端口上挂起的 TIME_WAIT 连接,那么我将在停止和启动之间添加等待,以便在进程开始之前清除那些 TIME_WAIT 状态。除非有另一个首选选项。

谢谢

Cel*_*ada 5

只要有任何套接字绑定到端口,就认为该端口“正在使用”。他们不必处于 LISTEN 状态,只需绑定即可。因此,您看到的 TIME_WAIT 套接字确实很重要。

如果任何套接字绑定到地址端口,它会变得有点复杂。如果不同的套接字绑定到不同的地址,则允许它们绑定到同一个端口。但是,如果有任何套接字绑定到该端口的通配符地址(INADDR_ANY,显示为netstatas *),它会阻止其他套接字绑定到任何地址和同一端口。

通常,大多数使用侦听套接字的软件都会SO_REUSEADDR在这些套接字上设置套接字选项。此选项放宽了规则。设置该选项后,只有绑定侦听套接字才能防止另一个套接字绑定到同一地址。这意味着任何延迟TIME_WAIT和其他套接字都不会阻止软件重新启动并立即重新绑定到同一端口。

您的 Java 程序很可能没有SO_REUSEADDR在其套接字上设置,但它应该。