Quando uma porta é considerada usada?

2

Eu estou recebendo porta em uso não pode ligar em reinícios do processo. Estou tentando descobrir quando uma porta é considerada em uso?

É somente quando está no modo LISTEN? Também pode ser se uma conexão estiver aberta para a porta no estado TIME_WAIT (ou qualquer outro estado na máquina de estado finita 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   -

O processo em questão é um processo Java que expõe a porta JMX. E há alguns agentes de monitoramento que enviam solicitações para essa porta para obter informações. Eu quero ter certeza de que quando a reinicialização ocorrer (após a parada e antes do início), as portas estarão livres para que ele não seja executado no problema de ligação da porta. Se uma conexão TIME_WAIT pendente nessa porta for considerada para a porta que está sendo usada, então adicionarei esperas entre a parada e a inicialização para que os estados TIME_WAIT sejam limpos antes do início do processo. A menos que haja outra opção preferida.

Obrigado

    
por krafts 28.01.2016 / 22:08

1 resposta

5

Uma porta é considerada "em uso" sempre que houver algum soquete associado a ela. Eles não precisam estar no estado LISTEN, apenas vinculados. Portanto, os soquetes TIME_WAIT que você vê contam.

Isso fica um pouco mais complicado se qualquer soquete estiver vinculado a endereços e portas. Soquetes diferentes podem ser ligados à mesma porta se estiverem vinculados a endereços diferentes. Mas se houver algum soquete vinculado ao endereço curinga ( INADDR_ANY , mostrado por netstat as * ) para essa porta, ele impedirá que outros soquetes se vinculem a qualquer endereço e a mesma porta .

Normalmente, a maioria dos softwares que usam soquetes de escuta define a opção SO_REUSEADDR socket nesses soquetes. Esta opção relaxa as regras. Com a opção definida, somente um soquete de escuta e impede que outro soquete seja vinculado ao mesmo endereço. Isso significa que qualquer TIME_WAIT remanescente e outros soquetes não impedirão que o software seja reiniciado e seja religado imediatamente à mesma porta.

Seu programa Java provavelmente não está configurando SO_REUSEADDR em seu soquete, mas deveria.

    
por 28.01.2016 / 22:20