Эффективное программирование TCP-IP




Совет 23. Сервер должен устанавливать опцию SO_REUSEADDR - часть 2


Проверив, что сервер работает, останавливаете клиента, переходя в режим команд telnet и вводя команду завершения. Обратите внимание, что если немедленно повторить весь эксперимент, то будет тот же результат. Таким образом, adserver перезапускается без проблем.

А теперь проделайте все еще раз, но только остановите сервер. При попытке перезапустить сервер вы получите сообщение «Address already in use» (сообщение Разбито на две строчки). Разница в том, что во втором эксперименте вы остановили сервер, а не клиент рис. 3.10.

bsd $ badserver

badserver: Клиент отсоединился

bsd $ : badserver

badserver : Клиент отсоединился

bsd $

bsd $ telnet localhost 9000

hello

hello

^]

telnet> quit Клиент завершил сеанс.

Connection closed.

Сервер перезапущен.

bsd $ telnet localhost 9000

world

world

^]

telnet> quit Клиент завершил сеанс.

Connection closed

bsd $

Рис. 3.9. Завершение работы клиента

bsd $ badeerver

^C Сервер остановлен

bsd $ badserver

badserver: He могу привязать сокет:

Address already in use (48)

bsd $

bsd $ telnet localhost 9000

hello again

hello again

Connection closed by

foreign host

bsd $

Рис. 3.10. Завершение работы сервера

Чтобы разобраться, что происходит, нужно помнить о двух вещах:

  • состоянии TIME-WAIT протокола TCP;
  • TCP-соединение полностью определено четырьмя факторами (локальный адрес, локальный порт, удаленный адрес, удаленный порт).
  • Как было сказано в совете 22, сторона соединения, которая выполняет актив­ное закрытие (посылает первый FIN), переходит в состояние TIME-WAIT и остается в нем в течение 2MSL. Это первый ключ к пониманию того, что вы наблюдали в двух предыдущих примерах: если активное закрытие выполняет клиент, то можно перезапустить обе стороны соединения. Если же активное закрытие выполняет сервер, то его рестартовать нельзя. TCP не позволяет это сделать, так как предыдущее соединение все еще находится в состоянии TIME-WAIT.

    Если бы сервер перезапустился и с ним соединился клиент, то возникло новое соединение, возможно, даже с другим удаленным хостом. Как было сказано, TCP-соединение полностью определяется локальными и удаленными адресами и номерами портов, так что даже если с вами соединился клиент с того же у ленного хоста, проблемы не возникнет при другом номере удаленного порта.




    Содержание  Назад  Вперед