Реальные преимущества tcp TIME-WAIT и их влияние на производственную среду

Реальные преимущества tcp TIME-WAIT и их влияние на производственную среду

НЕМНОГО ТЕОРИИ

Я немного почитал о 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, все из которых я бы считал нормальными, исходя из сервера и трафика, который он получает.

Связанный контент