Quantos processos podem escutar em uma porta específica?

6

Quantos processos podem escutar em uma porta específica, como 80? e como os processos filhos de algum aplicativo podem usar a mesma porta para escutar? Existe alguma diferença entre ouvir em uma porta ou estabelecer uma conexão de escuta?

    
por faressoft 12.01.2016 / 13:28

2 respostas

8

Q: How many processes can listen on a specific port?

R: todos quantos você pode gerar.

No entanto, para SOCK_STREAM sockets, e a menos que você use a opção SO_REUSEPORT (nova no Linux 3.9), um processo não pode ligar um soquete a um terminal local (endereço + porta para TCP, nome de arquivo para Unix .. .) se já houver outro soquete vinculado a ele (ou um de escuta nessa porta com o endereço curinga).

Portanto, a menos que você use SO_REUSEPORT, a única maneira de ter processos diferentes escutando na mesma porta é ter seus descritores de arquivo correspondentes apontando para a mesma descrição do arquivo aberto (para o mesmo soquete). / p>

Isso acontece automaticamente quando você usa fork() de um processo. Se o fd 3 apontar para um soquete TCP de escuta no endereço curinga e na porta 12345, ambos os processos após a bifurcação estarão escutando nessa porta naquele fd (sintaxe zsh abaixo):

$ zmodload zsh/net/tcp
$ ztcp -ld 3 12345
$ sleep 10 &
$ lsof -ni tcp:12345
COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
zsh     26277 stephane    3u  IPv4 506354      0t0  TCP *:12345 (LISTEN)
sleep   26988 stephane    3u  IPv4 506354      0t0  TCP *:12345 (LISTEN)

Para processos que não estão relacionados, a única maneira (que eu sei) de um processo para obter acesso a esse soquete de escuta seria usar o SCM_RIGHT mechanism para passar fds (na verdade mais como descrições de arquivos abertos ) entre processos usando sockets de domínio unix.

Você notará que um argumento para listen() é o backlog .

Assim que houver um soquete escutando em determinado endpoint, o kernel começará a aceitar conexões de entrada para esse endpoint ( o backlog é uma dica para o kernel quanto a quantos podem aceitar que não foram accept ed por aplicativos ).

Em seguida, o primeiro processo que executa accept() em qualquer um dos fds que apontam para o soquete de escuta (ou qualquer um dos soquetes de escuta com SO_REUSEPORT ) obterá a conexão de entrada. accept() cria um novo soquete e retorna um novo fd para esse socket . Por sua vez, esse fd pode ser duplicado (um novo fd apontando para o mesmo socket) e os processos filhos herdarão o soquete conectado como se estivessem ouvindo.

    
por 12.01.2016 / 17:20
3

Esta resposta discute o TCP no IPv4.

Apenas um processo pode ouvir para novas conexões. Você receberá um erro "endereço já usado" se mais de um processo tentar reivindicar a mesma porta.

Isso é totalmente diferente da quantidade de processos que estão usando ativamente essa porta.

Veja a seguinte saída:

remote          local        state
*:*           - 4.3.2.1:5000 LISTENING
1.2.3.4:12345 - 4.3.2.1:5000 CONNECTED
4.5.6.7:83247 - 4.3.2.1:5000 CONNECTED

O que precisa ser exclusivo é o 4-tupla (remote-ip, remote-port, local-ip, local-port) . Como o (remote-ip, remote-port) no estado LISTENING é um *:* , apenas um processo pode escutar.

O aplicativo de escuta iniciará um novo thread / tarefa / processo em cada conexão de entrada.

    
por 12.01.2016 / 13:54