Назад | Перейти на главную страницу

Можно ли повторно использовать порт TIME_WAIT для другого удаленного сервера?

На машине я обнаружил, что существует много подключений TIME_WAIT (к другому удаленному серверу), использующих тот же локальный порт, netstat:

tcp        0      0 10.32.198.120:10240         10.32.92.81:4000            TIME_WAIT
tcp        0      0 10.32.198.120:10240         10.66.32.192:80             TIME_WAIT
tcp        0      0 10.32.198.120:10242         10.32.92.81:4000            TIME_WAIT
tcp        0      0 10.32.198.120:10242         10.66.32.192:80             TIME_WAIT
tcp        0      0 10.32.198.120:10243         10.32.92.81:4000            TIME_WAIT
tcp        0      0 10.32.198.120:10243         10.66.32.192:80             TIME_WAIT
tcp        0      0 10.32.198.120:10244         10.32.92.81:4000            TIME_WAIT
tcp        0      0 10.32.198.120:10244         10.66.32.192:80             TIME_WAIT
tcp        0      0 10.32.198.120:10245         10.66.32.192:80             TIME_WAIT

Я знал, что TIME_WAIT предназначен для предотвращения приема старых пакетов из предыдущего соединения в новое соединение. Но поскольку новое соединение с другим удаленным сервером не будет ошибочно принято за старое, я думаю, что безопасно использовать порт TIME_WAIT для другого удаленного сервера.

Итак, является ли то, что я видел (одни и те же локальные порты в разных соединениях), свидетельством того, что порт TIME_WAIT используется повторно?

Я использую CentOS 6.5 (для tcp_tw_reuse установлено значение 0), и эти подключения создаются с помощью python2.7.6 / requests2.12.1.

Тот факт, что ваши сокеты находятся в TIME_WAIT, не действительно здесь важно, они могут быть в УСТАНОВЛЕННОМ состоянии, и ваш вопрос все равно останется в силе - почему я вижу один и тот же исходный порт для нескольких подключений?

TL; DR: Пока четыре кортежа TCP (IP-адрес источника, порт источника, IP-адрес назначения, порт назначения) не совпадают, разрешается использовать один и тот же исходный порт для нескольких подключений.

TIME-WAIT используется для предотвращения приема старых пакетов в новом соединении с использованием точно так же TCP 4-кортеж как старое соединение.


В большинстве случаев Linux автоматически назначает исходный порт из диапазона эфемерных портов, который по умолчанию составляет от 32768 до 61000:

# cat /proc/sys/net/ipv4/ip_local_port_range
32768   60999

При принятии решения о том, какой порт источника использовать, ядро ​​прежде всего проверяет, есть ли неиспользуемый порт источника из диапазона эфемерных портов. При ~ 28k возможных исходных портов ядро ​​обычно может найти доступный порт и остановиться на нем. Однако, если все порты 28k используются, он проверит, прошел ли какой-либо из портов check_established источник функция, которая позволит повторно использовать уже выделенный исходный порт, пока новое соединение предназначено для другого 4-кортежа TCP.

Кроме того, вместо того, чтобы позволять ядру автоматически назначать исходный порт, также можно программно указать ядру, какой именно исходный IP-адрес и порт вы хотите использовать для определенного соединения.