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