Когда приложение устанавливает исходящее TCP-соединение, порт выбирается автоматически. Это ephemeral port, временный исходный порт клиента.
Например:
10.0.0.10:49152 → 142.250.74.14:443
Если приложение создаёт тысячи соединений, диапазон таких портов может стать узким местом.
▪️Посмотреть доступный диапазон
В Linux его задаёт:
cat /proc/sys/net/ipv4/ip_local_port_range
Например:
32768 60999
Это около 28 тысяч портов для исходящих соединений с одного локального IP.
▪️Но количество соединений не всегда ограничено этим числом
TCP-соединение определяется не одним портом, а набором:
source IP
source port
destination IP
destination port
protocol
То есть:
10.0.0.10:50000 → 1.1.1.1:443
10.0.0.10:50001 → 1.1.1.1:443
это разные соединения.
Но тот же локальный порт теоретически может использоваться снова, если меняется destination tuple.
Поэтому несколько destination IP/портов значительно расширяют пространство комбинаций.
▪️Как увидеть исходящие соединения
ss -tan state established
А чтобы посмотреть локальные порты:
ss -tan | awk 'NR>1 {print $4}' | sort | uniq -c | sort -nr | headЕсли приложение создаёт огромное количество короткоживущих TCP-соединений, дополнительно стоит посмотреть
TIME-WAIT:ss -tan state time-wait | wc -l
▪️Почему
TIME_WAIT особенно неприятенПосле закрытия TCP-соединения локальный порт не всегда сразу можно использовать для нового соединения.
Это нужно для защиты TCP от старых сегментов предыдущего соединения.
При большом количестве коротких запросов можно получить ситуацию:
requests
↓
тысячи TCP connections
↓
close()
↓
TIME_WAIT
↓
исчерпание доступных комбинаций
В итоге новое
connect() начинает получать ошибки вроде:Cannot assign requested address
▪️Практический сценарий
Проблема часто появляется у прокси, API-клиентов, NAT-шлюзов и сервисов, которые вместо переиспользования соединений постоянно создают новые.
Поэтому сначала стоит проверить:
ss -s
cat /proc/sys/net/ipv4/ip_local_port_range
ss -tan state time-wait | wc -l
А уже потом решать проблему: расширять диапазон, использовать connection pooling или уменьшать количество коротких TCP-соединений.
Важно: увеличение
ip_local_port_range не создаёт новые IP-адреса и не отменяет остальные ограничения TCP.BashTex 📱 #bash #utils