2

Я начал использовать сокеты в программировании на Java (у меня есть опыт работы с Python), и во время тестирования сервера, который я написал с помощью команды telnet , я заметил, что утилита немедленно реагирует на уничтожение сервера. Когда я пишу клиент с помощью Java (или Python), программе требуется как минимум несколько секунд, чтобы показать, что она была отключена. Насколько я знаю, нет способа проверить, подключен ли сокет, если не считать сообщения пульса, которые мой сервер не был записан для приема или получения.

Мой вопрос: как люди из GNU знают, когда мой сокет был отключен? Есть ли какая-то часть TCP, которую я не смог найти в своем поиске, которая позволила бы это? Благодарю.

1 ответ1

0

Есть два способа закрыть сеанс TCP, правильный путь для установленного сеанса - это трехсторонний разбор, который включает:

 Closing party -> Other end: FIN
 Other end -> Closing party: FIN ACK
 Closing party -> Other end: ACK

Таким образом, эта последовательность позволяет обоим концам знать, что другой конец понимает, что сеанс должен быть закрыт.

Другой метод - это RST или пакет сброса, который обычно отправляется в случае возникновения проблемы. Он отправляется немедленно, когда принимающая сторона не прослушивает порт TCP, к которому он подключен, а также может быть отправлена в случае ошибки в приложении.

В вашем случае последовательность FIN ACK будет соответствовать тому, как соединение должно быть разорвано, и это должно инициироваться любой библиотекой, которую вы используете при закрытии сокета.

Если бы я был тобой, я бы установил wireshark или подобное и посмотрел бы точно, что происходит во время разрушения.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .