Чому для очищення прослуховуваного порту TCP після вмирання програми потрібно до декількох хвилин?


27

Якщо я вбиваю програму, яка слухає на порту TCP, це займе до декількох хвилин, поки порт не буде відтворений системою і знову придатний для використання. Я бачив декілька питань, які згадують це явище, але без пояснень. Чому це відбувається, чому система не повертає порт відразу? Чи трапляється це і в інших системах, таких як Windows чи Mac?

Відповіді:


25

Ідея цього полягає в тому, щоб не отримувати пакети, орієнтовані на прослуховування попередньої програми на цьому порту. Цей TIME_WAITстан визначається в RFC793 як два рази максимальний термін експлуатації сегмента.

Я не знаю про інші операційні системи, але я припускаю, що всі вони мають подібну поведінку.

Вирішення цієї проблеми полягає у встановленні SO_REUSEADDRна сокет, який повинен ігнорувати TIME_WAITстан.


3
Перевіряючи свою надійну діаграму стану TCP, я бачу, що TIME_WAIT - це останній стан сокета і, як правило, зберігається для 2MSL - що вдвічі перевищує максимальний термін служби сегмента. Специфікація (RFC793) заявляє про це як 2 хвилини, даючи всього 4 хвилини. Це дає достатньо часу для оброблення будь-яких запитів і відповідей, які все ще знаходяться "в польоті", і приземлення за потрібною програмою - або відкидання, якщо сокет знаходиться в TIME_WAIT.
Faelkle

Я можу підтвердити, що це відбувається і в Windows.
Томас Братт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.