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
Respostas:
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.
fonte
Esse é o máximo na prática, geralmente é menor. Por exemplo, o Linux usa o
net.ipv4.ip_local_port
parâmetro kernel para definir as portas que são usadas para conexões de saída. Isso geralmente é algo comoVocê pode aumentar o número disponível com o sysctl, por exemplo
ou você pode editar o arquivo /etc/sysctl.conf com as mesmas informações
Todos os exemplos que encontrei mostram o valor mínimo também para 1024.
fonte
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:
Para fazer isso funcionar, você precisaria ler a resposta para este tópico .
fonte
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 :)
fonte
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.
fonte