A porta de origem TCP deve ser única por host?

10

Eu aprendi que uma conexão TCP é identificada pela tupla (IP de origem, porta de origem, ip de destino, porta de destino). Teoricamente, deveria ser possível ter um cliente de host1: port1 conectado a server1: port1 e ao mesmo tempo outro cliente (rodando em host1) de host1: port1 para server2: port1.

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

No entanto, tenho lido várias vezes que a porta de origem deve ser exclusiva para o endereço do host, o que basicamente significa que há um limite máximo 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 netstat -t mostra claramente duas conexões ativas de saída da porta 9990 (uma para 9997, uma para 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 
    
por lxgr 01.11.2011 / 22:19

5 respostas

15

Não é um requisito do 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 exclusiva. 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 elas tenham endereços IP de origem diferentes.

    
por 01.11.2011 / 22:43
5

Esse é o máximo na prática geralmente menor. Por exemplo, o Linux usa o parâmetro net.ipv4.ip_local_port kernel para definir as portas 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 /etc/sysctl.conf com as mesmas informações

net.ipv4.ip_local_port_range = 10000 65535

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

    
por 01.11.2011 / 22:39
1

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

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 que isso funcione, você precisa ler a resposta para este tópico .

    
por 02.11.2011 / 01:16
0

Sim. Isso é verdade.

As portas devem ligar e os aplicativos com a rede.

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

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

    
por 02.11.2011 / 00:42
0

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

    
por 12.03.2013 / 22:35

Tags