![Реальные преимущества tcp TIME-WAIT и их влияние на производственную среду](https://rvso.com/image/568262/%D0%A0%D0%B5%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%20%D0%BF%D1%80%D0%B5%D0%B8%D0%BC%D1%83%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B0%20tcp%20TIME-WAIT%20%D0%B8%20%D0%B8%D1%85%20%D0%B2%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B0%20%D0%BF%D1%80%D0%BE%D0%B8%D0%B7%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%83%D1%8E%20%D1%81%D1%80%D0%B5%D0%B4%D1%83.png)
НЕМНОГО ТЕОРИИ
Я немного почитал о TCP TIME-WAIT
(здесьитам) и я прочитал, что это значение установлено равным 2 x MSL
(максимальный срок службы сегмента), которое удерживает соединение в «таблице соединений» в течение некоторого времени, чтобы гарантировать, что,«прежде чем вам будет разрешено создать соединение с тем же кортежем, все пакеты, принадлежащие предыдущим воплощениям этого кортежа, будут мертвы».
Поскольку сегменты, полученные (за исключением SYN при определенных обстоятельствах) во время существования соединения TIME-WAIT
или его отсутствия, будут отброшены, почему бы не закрыть соединение сразу?
В1: Это связано с тем, что при работе с сегментами старых соединений требуется меньше обработки, а при создании нового соединения в том же кортеже требуется меньше обработки TIME-WAIT
(т.е. есть ли выигрыш в производительности)?
Если приведенное выше объяснение не работает, то единственной причиной, по которой я вижу TIME-WAIT
полезность, может быть ситуация, когда клиент отправляет SYN
для соединения до того, как он отправит оставшиеся сегменты для старого соединения в том же кортеже. В этом случае получатель повторно откроет соединение, но затем получит плохие сегменты и будет вынужден его разорвать.
В2: Корректен ли этот анализ?
В3: Есть ли другие преимущества использования TIME-WAIT?
НЕМНОГО ПРАКТИКИ
Я просматривал графики munin на производственном сервере, который я администрирую. Вот один из них:
Как вы можете видеть, в зарегистрировано больше соединений, TIME-WAIT
чем в ESTABLISHED
, в большинстве случаев примерно в два раза больше, а в некоторых случаях в четыре раза больше.
В4: Влияет ли это на производительность?
В5: Если да, то разумно ли/рекомендуется ли уменьшать TIME-WAIT
значение (и какое)?
В6: Нормально ли это соотношение TIME-WAIT
/ ESTABLISHED
подключений? Может ли это быть связано с попытками вредоносного подключения?
решение1
Короче говоря, не беспокойтесь о TIME_WAIT
. Накладные расходы практически отсутствуют и обычно не создают никаких проблем.
На загруженном сервере возможно исчерпание портов, и в этом случае есть опция sysctl net.ipv4.tcp_tw_reuse = 1
, которая позволяет ядру повторно использовать старые порты, которые все еще используются, TIME_WAIT
по мере необходимости.
TIME_WAIT является частью спецификации TCP и предназначена для перехвата пакетов, которые все еще могут находиться в пути (помните, не все соединения надежны, и именно это TCP стремится решить). Значение тайм-аута может быть очень высоким для большинства современных применений, но обычно оно не мешает ничему, кроме вывода netstat.
Если вы сами управляете сокетом и уверены, что не ждете данных (например, вы конечный отправитель или вам не важен ответ), вы можете закрыть сокет после установки параметра SO_NOLINGER
, что приведет к завершению соединения с помощью RST
, и немедленному удалению сокета.
Итак, ваши вопросы:
Q1,Q2,Q3: Он нужен для сбора поздних пакетов, "на всякий случай", потому что соединения могут быть ненадежными. Это часть спецификации, она предотвращает потерю пакетов, и ее настройка не дает никакой реальной выгоды.
В4: Нет
В5: Не беспокойтесь об этом, у вас есть возможность принудительно повторно использовать эти розетки, если это необходимо.
Q5: TIME_WAIT
и ESTABLISHED
не коррелируют, за исключением того, что чем более кратковременные у вас соединения, тем больше будет это соотношение. Это может быть вызвано чем-то вредоносным, но это не более показатель, чем «чрезмерная сетевая активность».
решение2
Некоторые ответы из моего ограниченного опыта использования TIME_WAIT:
1/2/3) Смотрите этоТАКОЙ вопросиэта страницадля хорошего объяснения TIME_WAIT. Это не столько вопрос производительности, сколько вопрос качества обслуживания, чтобы гарантировать, что все TCP-пакеты в соединении будут правильно получены.
4/5) Одна из проблем производительности, связанная с TIME_WAIT, заключается в том, что на очень загруженном сервере вы можете в конечном итоге исчерпать доступные соединения, если у вас слишком много соединений в состоянии TIME_WAIT. Если вы столкнулись с этой проблемой, вы можете попробовать уменьшить значение TIME_WAIT, но это может попасть в категорию настроек «Я знаю, что делаю». Смотритеэтот ТАК вопросдля более подробной информации.
6) Значение TIME_WAIT по умолчанию "должно" быть около 240 с (или вдвое больше MSL пакета 120 с). Таким образом, соотношение установленных/ожидающих соединений будет зависеть от скорости входящих соединений и того, как долго они остаются открытыми. Например, я проверил несколько своих загруженных серверов, и соотношение варьировалось от 1,3 до 400, все из которых я бы считал нормальными, исходя из сервера и трафика, который он получает.