Вывод Netstat (netstat -an
) содержит несколько подключений с одним и тем же внешним (клиентским) ip и портом, например:
TCP server_ip:49421 client_ip:4000 TIME_WAIT
TCP server_ip:52772 client_ip:4000 TIME_WAIT
TCP server_ip:56807 client_ip:4000 TIME_WAIT
TCP server_ip:61969 client_ip:4000 TIME_WAIT
И эта ситуация повторяется после уменьшения TcpTimedWaitDelay
параметр в реестре. Означает ли это, что сервер или клиент закрывают сокеты неправильно или это нормальная ситуация?
TL; DR: TIME_WAIT
- ожидаемое нормальное состояние сокета, которое появляется, когда локальная сторона установленного TCP-соединения сначала просит закрыть соединение. Если бы удаленная сторона сначала спросила об этом, тогда не было бы локальных TIME_WAIT
но удаленная сторона сохранит TIME_WAIT
вместо. Нет ничего плохого в большом количестве TIME_WAIT
по сути, это просто означает большое количество недавно закрытых подключений. Вам решать, нормально это для вашего приложения и рабочего процесса или нет.
В TIME_WAIT
цель - предотвратить немедленное повторное использование одного и того же соединения localip:localport - remoteip:remoteport
, перед Максимальное время жизни сегмента: блуждающие / повторяющиеся пакеты из предыдущего соединения в Интернете могут прибыть поздно и считаться частью нового соединения, если они имеют совпадающий порядковый номер. Сегодня, скорее всего, есть дополнительные вещи, которые могли бы предотвратить это, чего не было в 1981 году, когда были опубликованы спецификации TCP.
ссылка: RFC 793: протокол управления передачей с 1981 г., см. 3.5. Закрытие соединения Рисунок 13.
Также цитата из 3.3. Порядковые номера:
Знать, когда нужно сохранять тишину
Чтобы быть уверенным, что TCP не создает сегмент, несущий
порядковый номер, который может дублироваться старым сегментом, остающимся в сети, TCP должен сохранять молчание в течение максимального срока службы сегмента
(MSL) перед присвоением любых порядковых номеров при запуске или
восстановление после сбоя, при котором была потеряна память используемых порядковых номеров. Для этой спецификации предполагается, что MSL составляет 2 минуты. Это инженерный выбор, и его можно изменить, если опыт покажет
желательно так сделать. Обратите внимание, что если TCP повторно инициализируется в некотором смысле, но все же сохраняет свою память используемых порядковых номеров, то ему вообще не нужно ждать; необходимо использовать только порядковые номера большего размера
чем те, которые использовались недавно.
Я так понимаю, что в этой цитате "TCP" означает localip:localport - remoteip:remoteport
и молчание обеспечивается TIME_WAIT
.