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