2008-11-21 5 views
1

Почему TCP-соединения с интерфейсом loopback заканчиваются на TIME_WAIT (гнездо закрыто с набором SO_DONTLINGER), но идентичные соединения с другим хостом не заканчиваются на TIME_WAIT (они сразу же восстанавливаются/уничтожаются) ?TIME_WAIT на интерфейсе Loopback

Вот сценарии для иллюстрации:

(A) Два приложения, клиент и сервер, оба работают на той же машине Windows. Клиент подключается к серверу через интерфейс loopback сервера (127.0.0.1, порт xxxx), отправляет данные, получает данные и закрывает сокет (устанавливается SO_DONTLINGER).

Предположим, что соединения очень недолговечны, поэтому клиентское приложение устанавливает и уничтожает большое количество подключений каждую секунду. Конечным результатом является то, что сокеты заканчиваются на TIME_WAIT, а клиент в конечном итоге исчерпывает максимальное количество сокетов (по умолчанию это составляет ~ 3900, и мы предполагаем, что это значение не будет изменено в реестре).

(B) Те же два приложения, что и сценарий (A), но сервер находится на другом хосте (клиент все еще работает в Windows). Соединения идентичны во всех отношениях, за исключением того, что они не предназначены для 127.0.0.1, но вместо этого используется другой IP-адрес. Здесь соединения на клиентской машине НЕ идут в TIME_WAIT, и клиентское приложение может продолжать устанавливать соединения на неопределенный срок.

Почему разница?

ответ

3

Состояние TIME_WAIT происходит только на одном конце соединения - конец, который закрывается первым. Для интерфейса loopback оба конца находятся на одной машине, поэтому вы всегда увидите TIME_WAIT.

В другом случае попробуйте взглянуть на другую машину. Я думаю, вы увидите там гнезда TIME_WAIT.

Смежные вопросы