Рейтинг:3

Только один сокет TCP (через nc) может отправлять данные на один и тот же хост/порт одновременно

флаг in

Простая реплика - в одном окне смотрим процессы сверху, в другом запускаем: nc -lkp 10000 > /dev/null & (head -50000000 /dev/urandom | nc -N 127.0.0.1 10000) & (head -50000000 /dev/urandom | nc -N 127.0.0.1 10000)

Обратите внимание, что только один главный и нк процесс активно использует ЦП.

Прикрепите strace к главный который не активен - см., что он остановился при записи, например:

strace: процесс 589084 прикреплен
write(1, "\264\347\270\26\27\24'BRb^\353\302\36@\216\17V\210*n\252`\353\330\351\276\2\250 \330\350\217"..., 4096^Cstrace: процесс 589084 отсоединен
 <отдельно...>

Настройте двух прослушивателей на разных портах - например. 10000 и 10001, и оба идут на полной скорости.

Это простой пример, но я могу воспроизвести его с другими входами и выходами, например. zcating большие файлы и отправка их в производственные службы по сети. Это не связано с вводом и не связано с прослушивающим сокетом.

Итак, почему я могу иметь только одно TCP-соединение с любым хостом/портом, активно отправляющим данные?

Есть независимый источник данных (не стесняйтесь экспериментировать, если не верите мне) и независимый процесс, открывающий собственное tcp-соединение (нетстат покажет их обоих открытыми) - единственное, что их объединяет, это место назначения (которое не обязательно должно быть нк слушаю вот - бывает с чем угодно).

Учитывая, что пункт назначения может определенно иметь несколько входящих сокетов, получающих данные одновременно, а источник может определенно отправлять данные по нескольким сетевым сокетам одновременно, я изо всех сил пытаюсь понять, откуда исходит конфликт, в результате чего активен только один канал. однажды.

Ron Maupin avatar
флаг us
Порт может быть запрошен только одним процессом. Вам нужно разрешить приложению использовать эфемерные порты для источника (порт `0`), где исходные порты выбираются «случайно» для каждого процесса. TCP-соединение идентифицируется по исходному и целевому адресам, а также по исходному и целевому портам. Если вы используете одинаковые значения для всех четырех, то это по определению одно и то же соединение, и попытка запустить новый процесс в том же соединении вызовет ошибку.
garethhumphriesgkc avatar
флаг in
Для каждого соединения используются разные исходные порты. Так работает nc по умолчанию, второй экземпляр не откроется, если исходный порт уже используется, и вы можете видеть в выводе netstat, что они разные. Уверяю вас, это два разных TCP-соединения — я рекомендую вам попробовать это самим и убедиться в этом.
Рейтинг:8
флаг cl
A.B

Отказ от ответственности: их много нк варианты. Предполагая из что это вариант OpenBSD. Каждый нк Вариант имеет свои преимущества.

нк неправильный инструмент для этой работы: нк-лкп 10000 будет управлять одним соединением одновременно, потому что оно не разветвляется, и, несмотря на использование опрос(2) никогда не использует принять(2) на втором входящем соединении до завершения обработки первого: это гарантия того, что второе соединение останется необработанным. Если их будет еще несколько, они начнут оставаться в SYN-SENT государство, потому что нк-лкп 10000 использует 1 как слушать(2) отставание: это не случайный выбор. Это можно проверить с помощью стрейс в бегах нк-лкп 10000 процесс.

документация о option говорит то же самое:

Когда соединение завершено, послушайте еще один. Требует .
[...]

то, как написано, не предполагает, что два соединения будут приниматься одновременно: только одно отстает от предыдущего.


Замените прослушивание сетевая кошка с сокат (-д -д для дополнительной информации):

socat -d -d tcp4-listen:10000,reuseaddr,fork/dev/null

вилка Опция обеспечивает простую параллельную обработку: один процесс на соединение.

garethhumphriesgkc avatar
флаг in
Спасибо за подсказку - socat ведет себя так, как ожидалось. Теперь мне нужно понять, почему java этого не делает - хотя это звучит как сообщение о стеке.
A.B avatar
флаг cl
A.B
Попробуйте больше. первые «автоподключаются» ОС. Обычно это зависит от отставания, но может быть и больше. Здесь 4-й (т.е. 3-й необработанный) получает первый SYN-SENT (с `ss -tn dst == 127.0.0.1:10000`)
garethhumphriesgkc avatar
флаг in
Извините, AB - я удалил свой комментарий после того, как увидел, что вы изменили свой ответ, чтобы решить его, но до того, как увидел ваш ответ. Для тех, кто придет позже, я только что упомянул, что последующие соединения были полностью установлены, а не в SYN_SENT.
A.B avatar
флаг cl
A.B
Я говорю об ожидающих подключениях: тех, которые ожидают обработки. Запустите по крайней мере 4 клиента nc одновременно (до того, как 1-й из этих 4 завершится), чтобы увидеть это. Точное поведение может зависеть от версии ядра и его настроек, просто попробуйте больше. В вашем примере в OP работает только два клиента, поэтому такое поведение не будет видно.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.