A porta de origem TCP precisa ser exclusiva por host?


10

Aprendi que uma conexão TCP é identificada pela tupla (IP de origem, porta de origem, IP de destino, porta de destino). Teoricamente, seria possível ter um cliente do host1: porta1 conectado ao servidor1: porta1 e, ao mesmo tempo, outro cliente (executando no host1) do host1: porta1 ao servidor2: porta1.

Eu testei um pouco em Java, e até agora parece possível.

No entanto, li várias vezes que a porta de origem precisa ser exclusiva para o endereço do host, o que basicamente significa que existe um limite rígido de no máximo 65536 conexões TCP de saída simultâneas. Isso é verdade?

Atualização: Aqui está o meu código Java. Isso parece funcionar, e o netstat -t mostra claramente duas conexões de saída ativas da porta 9990 (uma a 9997, uma a 9998). Pelo menos em um Linux moderno, parece ser possível?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

E a saída netstat -t (truncada):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 

"Se você está perguntando sobre os limites superiores de sistemas bem projetados, você certamente está fazendo errado "
Chris S

Respostas:


16

Não é um requisito de TCP. No que diz respeito ao TCP, apenas a combinação de IP de origem, porta de origem, IP de destino e porta de destino precisa ser única. No entanto, na prática, a maioria das APIs TCP não fornece nenhuma maneira de criar mais de uma conexão com a mesma porta de origem, a menos que tenham endereços IP de origem diferentes.


2
Obrigado, isso responde completamente a parte teórica da minha pergunta! Eu só vou ter que tentar para cada implementação de TCP, eu acho.
Lxgr #

5

Esse é o máximo na prática, geralmente é menor. Por exemplo, o Linux usa o net.ipv4.ip_local_portparâmetro kernel para definir as portas que são usadas para conexões de saída. Isso geralmente é algo como

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Você pode aumentar o número disponível com o sysctl, por exemplo

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

ou você pode editar o arquivo /etc/sysctl.conf com as mesmas informações

net.ipv4.ip_local_port_range = 10000 65535

Todos os exemplos que encontrei mostram o valor mínimo também para 1024.


1

Além da resposta de Iain (acima), que pode haver apenas 10.000 portas permitidas para conexões de saída pelo seu kernel, em teoria, você está pelo menos limitado a um conjunto de XX, XXX portas por endereço IP no adaptador. Como o 127.1 não está disponível para o mundo externo, estando na rede local, para cada outro endereço IP ( externo ), você tem um conjunto de portas de saída dentro do seu intervalo de portas de 65K.

Portanto, o limite de saída é realmente:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

Para fazer isso funcionar, você precisaria ler a resposta para este tópico .


0

Sim. Isso é verdade.

As portas devem ligar e os aplicativos à rede.

Você não pode ter mais de 65553 aplicativos conectados por TCP e 65535 conectados por UDP no mesmo host. Os sistemas operacionais tipicamente gerenciavam dinamicamente as portas e atribuíam uma para cada aplicativo que se conecta à rede.

Se você tiver dois aplicativos listados na mesma porta quando um pacote de rede chegar, o computador não saberia para qual aplicativo os dados serão entregues. Por exemplo, se você tiver o Messenger e o Skype na mesma ligação à mesma porta, sua mensagem do messenger aparecerá no skype e vice-versa :)


Acho que a pergunta não era sobre o limite superior do número de aplicativos de escuta - que, como você ressalta, é limitado pelo número de números de porta exclusivos -, mas sobre o número de soquetes operando ao mesmo tempo. Os servidores Web geralmente têm dezenas de soquetes endereçados à porta única 80 ou 443. Se muitos servidores em um host fizeram isso, não há razão para que o número de soquetes abertos não exceda 2 ^ 32.
Brandon Rhodes

0

Embora um sistema possa ter um limite no número de conexões TCP abertas, normalmente não possui restrições quanto aos números de porta usados. No entanto, uma boa implementação de TCP deve impedir o uso do mesmo par de soquetes duas vezes. (soquete = endereço IP + porta). Uma porta, no entanto, é atribuída a um processo para impedir o roubo de conexões, e o método usual é solicitar uma porta livre para uma porta de escuta ou de saída. Isso evita soquetes de saída duplicados e, portanto, conexões duplicadas. Na falta de uso desse método, o próprio aplicativo deve impedir a criação de conexões duplicadas.


3
Como isso adiciona algo novo às respostas já publicadas nesta antiga pergunta?
Chris S
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.