TIME_WAIT в интерфейсе с обратной связью - PullRequest
1 голос
/ 21 ноября 2008

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

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

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

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

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

Почему расхождение?

1 Ответ

3 голосов
/ 21 ноября 2008

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

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

...