Должен ли исходный порт TCP быть уникальным для каждого хоста?


10

Я узнал, что 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 

«Если вы спрашиваете о верхних границах хорошо спроектированных систем, вы почти наверняка делаете Doing It Wrong ™ »
Крис С

Ответы:


16

Это не требование TCP. Что касается TCP, то уникальным должно быть только сочетание исходного IP-адреса, исходного порта, IP-адреса назначения и порта назначения. Однако на практике большинство TCP API не предоставляют никакого способа создания более одного соединения с одним и тем же портом источника, если у них нет разных IP-адресов источника.


2
Спасибо, это полностью отвечает теоретической части моего вопроса! Думаю, мне нужно будет попробовать каждую реализацию TCP.
LXGR

5

Это максимум на практике, он обычно ниже. Например, Linux использует net.ipv4.ip_local_portпараметр ядра для определения портов, которые используются для исходящих соединений. Это обычно что-то вроде

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Вы можете увеличить число доступных с sysctl, например

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

или вы можете отредактировать /etc/sysctl.conf с той же информацией

net.ipv4.ip_local_port_range = 10000 65535

Все примеры, которые я нашел, также показывают минимальное значение 1024.


1

В дополнение к ответу Iain (см. Выше), что ядру может быть разрешено только 10 000 портов для исходящих соединений, теоретически вы, по крайней мере, ограничены одним набором XX, XXX портов на IP-адрес адаптера. Поскольку 127.1 недоступно для внешнего мира, находящегося в локальной сети, для каждого IP-адреса ( внешнего ) у вас есть набор исходящих портов в пределах диапазона портов 65К.

Таким образом, исходящий лимит действительно:

  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.

Чтобы это сработало, вам нужно прочитать ответ в этой теме .


0

Да. Это правда.

Порты должны связывать и приложения с сетью.

Вы не можете иметь более 65553 приложений, подключенных по TCP, и 65535, подключенных по UDP, на одном хосте. Операционные системы обычно динамически управляли портами, назначенными для каждого приложения, которое подключается к сети.

Если у вас есть два приложения, подключенные к одному и тому же порту при поступлении сетевого пакета, компьютер не может знать, какое приложение собирается доставить данные. Например, если у вас есть Messenger и Skype, подключенные к одному и тому же порту, ваше сообщение будет отображаться в Skype и наоборот :)


Я думаю, что вопрос был не в верхнем пределе количества прослушивающих приложений, которое, как вы указываете, ограничено количеством уникальных номеров портов, а в количестве сокетов, работающих одновременно. Веб-серверы часто имеют десятки сокетов, все из которых адресованы их одному порту 80 или 443. Если многие серверы на хосте сделали это, то нет причин, по которым количество открытых сокетов не могло превышать 2 ^ 32.
Брэндон Родс

0

Хотя система может иметь ограничение на количество открытых соединений TCP, обычно она не имеет ограничений в отношении используемых номеров портов. Хорошая реализация TCP, однако, не должна использовать одну и ту же пару сокетов дважды. (сокет = IP-адрес + порт). Однако порт назначается процессу для предотвращения кражи соединений, и обычным способом является запрос свободного порта для порта прослушивания или для исходящего. Это предотвращает дублирование исходящих сокетов и, следовательно, дублирование соединений. Если этот метод не используется, само приложение должно предотвращать создание дублированных соединений.


3
Как это может добавить что-нибудь новое, ответы, уже опубликованные на этот старый вопрос?
Крис С
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.