Похоже, что у вас заканчиваются эфемерные порты . Чтобы проверить, используйте команду netstat
и найдите несколько тысяч портов в состоянии TIME_WAIT
.
В Mac OS X используется эфемер по умолчанию диапазон портов составляет от 49152 до 65535, в общей сложности 16384 порта. Вы можете проверить это с помощью команды sysctl
:
$ sysctl net.inet.ip.portrange.first net.inet.ip.portrange.last net.inet.ip.portrange.first: 49152 net.inet.ip.portrange.last: 65535
Как только вы закончите эфемерные порты, вам, как правило, нужно подождать, пока истечет срок действия TIME_WAIT
( 2 * максимальное время жизни сегмента), пока вы не сможете повторно использовать определенный номер порта. Вы можете удвоить количество портов, изменив диапазон, чтобы начать с 32768, что по умолчанию используется для Linux и Solaris. (Максимальный номер порта - 65535, поэтому вы не можете увеличить высокий уровень.)
$ sudo sysctl -w net.inet.ip.portrange.first=32768 net.inet.ip.portrange.first: 49152 -> 32768
Обратите внимание, что официальный диапазон , обозначенный IANA , составляет 49152 - 65535, а некоторые брандмауэры могут предположим, что динамически назначенные порты попадают в этот диапазон. Возможно, вам понадобится перенастроить ваш брандмауэр, чтобы использовать больший диапазон вне вашей локальной сети.
Также можно сократить максимальное время жизни сегмента (sysctl net.inet.tcp.msl
в Mac OS X), что контролирует продолжительность состояния TIME_WAIT
, но это опасно, так как это может привести к смешению старых соединений с более новыми, которые используют один и тот же номер порта. Существуют также некоторые трюки, связанные с привязкой к конкретным портам с опцией SO_REUSEADDR
или закрытием с помощью опции SO_LINGER
, но также могут быть смешаны старые и новые соединения, поэтому обычно считаются плохими идеями.