Я узнал, что 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
Ответы:
Это не требование TCP. Что касается TCP, то уникальным должно быть только сочетание исходного IP-адреса, исходного порта, IP-адреса назначения и порта назначения. Однако на практике большинство TCP API не предоставляют никакого способа создания более одного соединения с одним и тем же портом источника, если у них нет разных IP-адресов источника.
источник
Это максимум на практике, он обычно ниже. Например, Linux использует
net.ipv4.ip_local_port
параметр ядра для определения портов, которые используются для исходящих соединений. Это обычно что-то вродеВы можете увеличить число доступных с sysctl, например
или вы можете отредактировать /etc/sysctl.conf с той же информацией
Все примеры, которые я нашел, также показывают минимальное значение 1024.
источник
В дополнение к ответу Iain (см. Выше), что ядру может быть разрешено только 10 000 портов для исходящих соединений, теоретически вы, по крайней мере, ограничены одним набором XX, XXX портов на IP-адрес адаптера. Поскольку 127.1 недоступно для внешнего мира, находящегося в локальной сети, для каждого IP-адреса ( внешнего ) у вас есть набор исходящих портов в пределах диапазона портов 65К.
Таким образом, исходящий лимит действительно:
Чтобы это сработало, вам нужно прочитать ответ в этой теме .
источник
Да. Это правда.
Порты должны связывать и приложения с сетью.
Вы не можете иметь более 65553 приложений, подключенных по TCP, и 65535, подключенных по UDP, на одном хосте. Операционные системы обычно динамически управляли портами, назначенными для каждого приложения, которое подключается к сети.
Если у вас есть два приложения, подключенные к одному и тому же порту при поступлении сетевого пакета, компьютер не может знать, какое приложение собирается доставить данные. Например, если у вас есть Messenger и Skype, подключенные к одному и тому же порту, ваше сообщение будет отображаться в Skype и наоборот :)
источник
Хотя система может иметь ограничение на количество открытых соединений TCP, обычно она не имеет ограничений в отношении используемых номеров портов. Хорошая реализация TCP, однако, не должна использовать одну и ту же пару сокетов дважды. (сокет = IP-адрес + порт). Однако порт назначается процессу для предотвращения кражи соединений, и обычным способом является запрос свободного порта для порта прослушивания или для исходящего. Это предотвращает дублирование исходящих сокетов и, следовательно, дублирование соединений. Если этот метод не используется, само приложение должно предотвращать создание дублированных соединений.
источник