На машине я обнаружил, что существует много подключений 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-адрес и порт вы хотите использовать для определенного соединения.