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