TIME_WAIT в интерфейсе с обратной связью
-
08-07-2019 - |
Вопрос
Почему 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.