#sockets #tcp #serversocket #time-wait
#сокеты #tcp #serversocket #время ожидания
Вопрос:
Я вижу следующую логику в одной из библиотек Java для проверки открытия сокета на localhost:
ServerSocket socket = new ServerSocket(port);
socket.close();
Мой вопрос в том, приведет ли этот сокет к состоянию TIME_WAIT на localhost, когда пакеты данных не были отправлены, и сокет закрывается сразу после его открытия? В таком случае, если приложение пытается привязаться к тому же порту, может ли это вызвать ошибку «адрес уже используется», если выполняется в пределах значения 2MSL?
Я написал небольшую тестовую программу, подобную приведенной выше, но когда я netstat или ss на linux-компьютере, где я запустил эту программу, я вообще не вижу TIME_WAIT для этого порта. Разве конечный автомат не должен применяться даже в том случае, если сокет не использовался для отправки каких-либо пакетов данных?
Комментарии:
1. Если сокет никогда не перемещается из
CLOSED
состояния, ему не нужно ничего делать, чтобы вернуться вCLOSED
состояние.2. Привет @Damien_The_Unbeliever — Извините, я не понял. Будет ли сокет в приведенном выше случае проходить через TIME_WAIT?
3. Я не уверен, на какую конкретную диаграмму конечного автомата вы смотрите, но скажите это . Сокет запускается в
CLOSED
состоянии. Затем он должен пройти несколько определенных переходов, чтобы статьESTABLISHED
, а затем должен пройти по одному конкретному маршруту, чтобы в конечном итоге ожидать,TIME_WAIT
прежде чем вернутьсяCLOSED
. Вы ничего не сделали, чтобы вывести свой сокет изCLOSED
состояния, поэтому никаких переходов не требуется.4. Спасибо за ваш ответ. Если я добавлю режим ожидания между созданием serversocket и закрытием и попытаюсь отправить какие-либо данные на порт с помощью nc в этот интервал, то netstat теперь показывает соединение в состоянии FIN_WAIT2 для процесса nc, в то время как для программы находится в состоянии ПРОСЛУШИВАНИЯ. Опять же, я понимаю, что я не написал никакого кода для приема входящего соединения, но, согласно приведенной выше схеме, оно должно достичь TIME_WAIT из FIN_WAIT2 . Однако я не вижу, чтобы он достиг этого состояния, но он просто уходит. Или, скорее всего, он закрыт с помощью флага RST.
Ответ №1:
TIME_WAIT — это состояние в соединении. Вы не создали соединение, следовательно, вы никогда не достигнете TIME_WAIT.