Использование SO_REUSEADDR - Что происходит с ранее открытым сокетом?

В сетевом программировании в Unix я всегда устанавливал опцию SO_REUSEADDR для сокета, используемого сервером для прослушивания соединений. Это в основном говорит о том, что другой сокет может быть открыт на том же порту на машине. Это полезно при восстановлении после сбоя, когда сокет не был правильно закрыт - приложение можно перезапустить, и оно просто откроет другой сокет на том же порту и продолжит прослушивание.

У меня вопрос, что происходит со старым сокетом? Без сомнения, все данные / соединения все равно будут получены на старом сокете. ОС закрывается автоматически?

2 ответа

Решение

Да, ОС автоматически закрывает предыдущий сокет, когда старый процесс завершается. Причина, по которой вы не можете прослушивать один и тот же порт сразу же, заключается в том, что сокет, хотя и закрыт, остается в состоянии 2MSL в течение некоторого времени (обычно несколько минут). ОС автоматически переводит старый сокет из этого состояния по истечении времени ожидания.

Сокет считается закрытым, когда программа, использующая его, умирает. Это многое обрабатывается ОС, и ОС откажется принимать любое дальнейшее сообщение от мертвого разговора. Однако, если сокет был неожиданно закрыт, компьютер на другом конце может не знать, что разговор окончен, и все еще может пытаться установить связь.

Вот почему, в соответствии со спецификацией TCP, существует период ожидания до повторного использования того же номера порта. Поскольку теоретически, однако маловероятно, возможно, что пакет из старого диалога может прийти с соответствующим IP-адресом, номерами портов и порядковыми номерами, так что принимающий сервер по ошибке ошибочно вставит его в неправильный поток TCP.

SO_REUSEADDR опция отменяет это поведение, позволяя вам немедленно повторно использовать порт. По сути, вы говорите: "Я понимаю риски и хотел бы использовать порт в любом случае".

Другие вопросы по тегам