Рейтинг:1

Исчерпание клиентского порта, несмотря на использование разных портов назначения

флаг gb

Читая об исчерпании портов, я часто вижу, что он учитывает четверку tcp-соединения (src ip, src port, dst ip, dst port). Таким образом, может показаться, что с диапазоном портов 20000 (от 40000 до 60000) и таргетингом на порты назначения 8088 и 8087 с двумя клиентами на одном компьютере, используя один и тот же адрес src и адрес dst, я должен быть в состоянии открыть 40000 соединений. Однако в моем тесте это не так. Даже в этой конфигурации я могу открыть только 20000 подключений. Я сбросил вывод ss -s и отсортировал его по исходному порту. Вот выдержка:

ЗАКРЫТЬ-ОЖИДАНИЕ 26378 0 172.24.131.110 40001 172.24.131.97 9088    
ЗАКРЫТЬ-ОЖИДАНИЕ 25029 0 172.24.131.110 40002 172.24.131.97 9087    
ЗАКРЫТЬ-ОЖИДАНИЕ 23840 0 172.24.131.110 40003 172.24.131.97 9087    
ЗАКРЫТЬ-ОЖИДАНИЕ 25207 0 172.24.131.110 40004 172.24.131.97 9087    
ЗАКРЫТЬ-ОЖИДАНИЕ 25572 0 172.24.131.110 40005 172.24.131.97 9088    
ЗАКРЫТЬ-ОЖИДАНИЕ 26334 0 172.24.131.110 40006 172.24.131.97 9087    
ЗАКРЫТЬ-ОЖИДАНИЕ 27089 0 172.24.131.110 40007 172.24.131.97 9087    
ЗАКРЫТЬ-ОЖИДАНИЕ 23860 0 172.24.131.110 40008 172.24.131.97 9088    
ЗАКРЫТЬ-ОЖИДАНИЕ 25463 0 172.24.131.110 40009 172.24.131.97 9087    
ЗАКРЫТЬ-ОЖИДАНИЕ 26603 0 172.24.131.110 40010 172.24.131.97 9088    
ЗАКРЫТЬ-ОЖИДАНИЕ 25436 0 172.24.131.110 40011 172.24.131.97 9087    
ЭСТАБ 0 0 172.24.131.110 40012 172.24.131.97 9087    
ЗАКРЫТЬ-ОЖИДАНИЕ 25042 0 172.24.131.110 40013 172.24.131.97 9087    
ЗАКРЫТЬ-ОЖИДАНИЕ 25738 0 172.24.131.110 40014 172.24.131.97 9087    
ЗАКРЫТЬ-ОЖИДАНИЕ 27363 0 172.24.131.110 40015 172.24.131.97 9088    
ЗАКРЫТЬ-ОЖИДАНИЕ 25860 0 172.24.131.110 40016 172.24.131.97 9088    

Это продолжается до тех пор, пока не будет достигнуто значение 60000. Исходный порт никогда не используется дважды, как будто пул значений на самом деле является общим. Так ли это, или я где-то пропустил флаг конфигурации?

Версия ядра 4.15.0-144-универсальная. Здесь действительно контролируется диапазон портов: если я изменю диапазон портов на 40000-50000, у меня будет только 10000 возможных подключений. Клиентом и сервером для тестов являются инструменты веб-полиграфа.

Рейтинг:1
флаг gb

Хорошо, на самом деле я думаю, что у меня есть ответ, клиент, который я использую, создает свои соединения с помощью bind + connect, а не просто подключается. Вот дамп strace:

bind(1490, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("172.24.131.110")}, 16) = 0
getsockname(1490, {sa_family=AF_INET, sin_port=htons(50929), sin_addr=inet_addr("172.24.131.110")}, [16]) = 0
connect(1490, {sa_family=AF_INET, sin_port=htons(9088), sin_addr=inet_addr("172.24.131.97")}, 16) = -1 EINPROGRESS (сейчас выполняется операция)

Насколько я понимаю, в этом случае вы возвращаетесь к уникальному пулу для разных клиентов, так как в момент привязки у вас нет никакой информации на удаленной стороне.

Полезная ссылка на эту тему: https://idea.popcount.org/2014-04-03-bind-before-connect/

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

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