MSL — это английское сокращение от Maximum Segment Lifetime, которое можно перевести на китайский как «максимальное время выживания пакета».
Рекомендация, данная 2MSL в протоколе RFC 793, составляет две минуты, но в Linux это обычно 30 секунд, что означает, что 2MSL составляет 60 секунд.
CLOSE_WAITПассивное закрытие соединения сформировано?,Согласно конечному автомату TCP,Сервер получает FIN, отправленный клиентом.,Стек протоколов TCP автоматически отправит ACK.,Подключитесь, чтобы войтиCLOSE_WAITсостояние。Но если сервер не выполняетSOCKETизCLOSE()действовать,состояние Это не может быть вызваноCLOSE_WAITМигрировать вLAST_ACK,тогда их будет много в системеCLOSE_WAITсостояниеизсоединять.
Следовательно, если конец пассивного завершения работы не закрывает SOCKET вовремя, например: поток ввода-вывода неожиданно блокируется или доля определяемых пользователем задач, выполняемых потоком ввода-вывода, слишком высока, что приводит к Если операции не обрабатываются вовремя, ссылка не может быть освобождена вовремя.
в целом,CLOSE_WAIT Статус сохраняется на сервере непродолжительное время, поэтому если вы обнаружите большое количество CLOSE_WAIT статус, то это означает, что пассивно закрытая сторона не рассылала FIN Пакеты обычно имеют следующие возможности:
(1) Процедурные вопросы:Если вы забыли на уровне кода CLOSE Соответственно socket соединение, то естественно оно не будет отправлено FIN пакет, в результате чего CLOSE_WAIT Накопление или код не является строгим и возникают такие проблемы, как бесконечные циклы, даже если он написан позже; CLOSE Это никогда не сможет быть реализовано.
(2) Реакция слишком медленная или установленное время ожидания слишком мало.:Если обе стороны связи не гармоничны,Одна сторона нетерпелива и прямолинейна. тайм-аут, но другая сторона все еще занята трудоемкой логикой, это приведет к close было отложено. Медленная реакция является основной проблемой, но, если посмотреть на нее под другим углом, она также может быть timeout Настройка слишком мала.
Проще говоря, причина, по которой timewait ожидает 2MSL, заключается в следующем:,Это делается для того, чтобы избежать ненадежной передачи TCP, вызванной потерей сетевых пакетов или задержкой в сети.,И этоTIME_WAITсостояниетогда вы сможете максимизироватьиз Улучшите передачу данных по сетиизнадежность。
в то же времяTCPЭто вообще запрещено ВTIME_WAITизсоединять Восстановить новый наизTCPсоединять, В основном это делается для того, чтобы избежать объединения старых и новых пакетов данных. Итак, подводя итог, Роль TIME_WAIT выглядит следующим образом:
Просмотр TCP-соединений со статусом TIME_WAIT.
$ netstat -tan |grep TIME_WAIT
Подсчитайте количество соединений в различных состояниях TCP.
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(i in S) print i, S[i]}'
net.ipv4.tcp_tw_reuse = 1 Указывает, что повторное использование включено. Разрешить TIME-WAIT Сокеты повторно используются для новых TCP-соединений. Значение по умолчанию — 0, что означает закрытие;
net.ipv4.tcp_tw_recycle = 1 Указывает, что TIME-WAIT включен в TCP-соединении. socketsиз Быстрое восстановление,По умолчанию – 0.,значит закрыто.
Или уменьшите значение MSL. Значение MSL в Linux по умолчанию равно 60 с. Мы можем уменьшить значение MSL, чтобы сократить время, необходимое для перехода одного конца активно закрытого соединения из состояния TIME_WAIT в закрытое состояние.
Однако это приведет к тому, что задержанные сообщения не смогут быть очищены, а завершение активно закрытого соединения не сможет принимать повторно переданные запросы FIN. Это также повлияет на повторное использование соединения и настройку многих приложений на основе TCP.
Поэтому в реальных производственных средах нужно действовать с осторожностью.
$ cat /proc/sys/net/ipv4/tcp_fin_timeout
$echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
Или $ vim /etc/sysctl.con
fnet.ipv4.tcp_fin_timeout = 30
После оптимизации параметров ядра,Может быть выполненоsysctl -p
Заказ,чтобы активировать вышеуказанные настройки, чтобы они вступили в силу навсегда
Разница между тем, как работают короткие и длинные соединения:
короткое соединение соединять->передавать данные->закрытиесоединять HTTP не сохраняет состояние. Каждый раз, когда браузер и сервер выполняют операцию HTTP, соединение устанавливается, но соединение разрывается после завершения задачи. Вы также можете сказать: короткое Соединение означает, что соединение SOCKET отправляется, данные принимаются и соединение немедленно разрывается. долгое соединение соединять->передавать данные->Держатьсоединять -> передавать данные-> 。。。->закрытиесоединять。 Длинное соединение означает, что после установления соединения SOCKET соединение будет поддерживаться независимо от того, используется оно или нет, но безопасность низкая.
Это видно по разнице,Коэффициент длинных соединений короткое соединение существенно снижает количество закрытых соединений.,уменьшенныйTIME_WAITсостояниеиз Количество производства>количество,В высококонкурентной системе,Изменения таким образом очень эффективны.,Можно существенно сократить количество системных TIME_WAIT.
Мы можем установить значение соединения в заголовке HTTP-запроса на клиенте: Keep-Alive. Замените короткое соединение на длинную ссылку.
Коэффициент длинных соединений короткое соединение фундаментально уменьшает количество раз, когда сервер активно закрывает соединение, и уменьшает генерацию соединений в состоянии TIME_WAIT.
При использовании nginx в качестве обратного прокси-сервера, если вы хотите настроить длинное соединение, вам необходимо установить его как:
1. Соединение клиента с nginx — долгое.
2. Соединение nginx с сервером — долгое.