Вопрос

Почему 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 , и клиентское приложение может продолжать устанавливать соединения в течение неопределенного времени.

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

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top