언제 포트 사용을 고려해야 합니까?

언제 포트 사용을 고려해야 합니까?

프로세스를 다시 시작할 때 사용 중인 포트를 바인딩할 수 없다는 메시지를 받았습니다. 언제 포트 사용을 고려해야 하는지 궁금합니다.

"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   -

프로세스는 JMX 포트를 노출하는 Java 프로세스입니다. 그리고 정보를 얻기 위해 이 포트에 요청을 보내는 모니터링 에이전트도 있습니다. 다시 시작할 때(중지 후 및 시작 전) 포트가 사용 가능한지 확인하여 포트 바인딩 문제가 발생하지 않도록 하고 싶습니다. 해당 포트에서 보류 중인 TIME_WAIT 연결이 사용 중인 포트로 간주되면 프로세스가 시작되기 전에 이러한 TIME_WAIT 상태가 지워지도록 중지와 시작 사이에 대기 시간을 추가합니다. 다른 더 나은 옵션이 없다면 말이죠.

감사해요

답변1

포트는 바인드된 소켓이 있는 한 "사용 중"으로 간주됩니다. LISTEN 상태일 필요는 없으며 바인딩만 하면 됩니다. 따라서 보이는 TIME_WAIT 소켓이 작동합니다.

소켓이 주소에 바인딩되어 있으면 상황이 좀 더 복잡해집니다.그리고포트. 서로 다른 주소에 바인딩된 경우 서로 다른 소켓을 동일한 포트에 바인딩하는 것이 허용됩니다. 그러나 소켓이 해당 포트의 와일드카드 주소( INADDR_ANY, netstat로 표시됨 *)에 바인딩되어 있으면 다른 소켓이 해당 포트에 바인딩되지 않습니다.어느주소와 동일한 포트입니다.

일반적으로 청취 소켓을 사용하는 대부분의 소프트웨어는 SO_REUSEADDR이러한 소켓에 소켓 옵션을 설정합니다. 이 옵션은 규칙을 완화합니다. 옵션을 설정하면 한 번만 제한됩니다.그리고소켓을 수신하면 다른 소켓이 동일한 주소에 바인딩되는 것을 방지할 수 있습니다. 이는 지연 TIME_WAIT및 추가 소켓으로 인해 소프트웨어가 다시 시작되고 동일한 포트에 즉시 리바인딩되는 것을 방해하지 않는다는 것을 의미합니다.

Java 프로그램은 SO_REUSEADDR소켓을 설정하지 않을 가능성이 높지만 설정해야 합니다.

관련 정보