Подтвердить что ты не робот

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

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

Мой вопрос: что происходит со старым сокетом? Несомненно, все данные/соединения будут по-прежнему поступать на старый сокет. Он автоматически закрывается ОС?

4b9b3361

Ответ 1

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

Ответ 2

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

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

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