Открытие и немедленное закрытие ServerSocket на localhost приведет к TIME_WAIT?

#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.