Я узнал, что TCP-соединение идентифицируется кортежем (исходный IP-адрес, исходный порт, IP-адрес назначения, порт назначения). Теоретически, таким образом, должно быть возможно, чтобы клиент с host1: port1 подключался к server1: port1 и в то же время другой клиент (работающий на host1) с host1: port1 на server2: port1.
Я немного протестировал на Java, и пока это кажется возможным.
Однако я несколько раз читал, что порт источника должен быть уникальным для адреса хоста, что в основном означает, что существует жесткое ограничение не более 65536 одновременных исходящих TCP-соединений. Это правда?
Обновление: вот мой код Java. Кажется, это работает, и netstat -t четко показывает два активных исходящих соединения через порт 9990 (от одного до 9997, от одного до 9998). По крайней мере, на современном Linux это кажется возможным?
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);
И вывод netstat -t (усеченный):
tcp6 0 0 localhost:9990 localhost:9998 CONNECTED
tcp6 0 0 localhost:9990 localhost:9999 CONNECTED