WedX - журнал о программировании и компьютерных науках

Сбрасывание соединений с tcp_tw_recycle

краткое изложение проблемы

у нас есть установка, в которой много (от 800 до 2400 в секунду) входящих подключений к Linux-боксу, и у нас есть устройство NAT между клиентом и сервером, поэтому в системе осталось так много сокетов TIME_WAIT. Чтобы преодолеть это, мы установил tcp_tw_recycle на 1, но это привело к падению входящих подключений.Посмотрев в сети, мы нашли ссылки на то, почему происходит отбрасывание фреймов с tcp_tw_recycle и устройством NAT.

разрешение попробовал

Затем мы попытались установить для tcp_tw_reuse значение 1, и все работало нормально без каких-либо проблем с той же настройкой и конфигурацией.

Но в документации говорится, что tcp_tw_recycle и tcp_tw_reuse не следует использовать, когда соединения, проходящие через узлы с поддержкой состояния TCP, такие как брандмауэры, устройства NAT или балансировщики нагрузки, могут видеть пропущенные кадры. Чем больше подключений, тем больше вероятность того, что вы увидите эту проблему.

Запросы

1) можно ли использовать tcp_tw_reuse в таких сценариях? 2) если нет, то какая часть кода Linux препятствует использованию tcp_tw_reuse для такого сценария? 3) вообще какая разница между tcp_tw_recycle и tcp_tw_reuse?

17.01.2012

Ответы:


1

По умолчанию, когда и tcp_tw_reuse, и tcp_tw_recycle отключены, ядро ​​будет следить за тем, чтобы сокеты в состоянии TIME_WAIT оставались в этом состоянии достаточно долго -- достаточно долго, чтобы быть уверенным, что пакеты, принадлежащие будущим соединениям, не будут ошибочно приняты за поздние пакеты старая связь.

Когда вы включаете tcp_tw_reuse, сокеты в состоянии TIME_WAIT можно использовать до истечения срока их действия, и ядро ​​попытается убедиться, что нет конфликтов относительно порядковых номеров TCP. Если вы включите tcp_timestamps (он же PAWS, для защиты от упакованных порядковых номеров), это гарантирует, что эти коллизии не могут произойти. Однако вам нужно включить временные метки TCP на обоих концах (по крайней мере, я так понимаю). Подробнее см. в определении tcp_twsk_unique.

Когда вы включаете tcp_tw_recycle, ядро ​​становится гораздо более агрессивным и будет делать предположения относительно временных меток, используемых удаленными хостами. Он будет отслеживать последнюю отметку времени, используемую каждым удаленным хостом, имеющим соединение в состоянии TIME_WAIT, и позволит повторно использовать сокет, если отметка времени правильно увеличилась. Однако, если отметка времени, используемая хостом, изменится (т. е. вернется назад во времени), пакет SYN будет молча удален, и соединение не будет установлено (вы увидите ошибку, похожую на «время ожидания соединения»). Если вы хотите погрузиться в код ядра, вам может подойти определение tcp_timewait_state_process. отправная точка.

Теперь временные метки никогда не должны возвращаться во времени; пока не:

  • хост перезагружается (но затем, к тому времени, когда он вернется, срок действия сокета TIME_WAIT, вероятно, истечет, так что это не будет проблемой);
  • IP-адрес быстро повторно используется чем-то другим (соединения TIME_WAIT немного останутся, но другие соединения, вероятно, будут сброшены TCP RST, и это освободит место);
  • преобразование сетевых адресов (или умный брандмауэр) задействовано в середине соединения.

В последнем случае у вас может быть несколько хостов за одним и тем же IP-адресом и, следовательно, разные последовательности временных меток (или указанные временные метки рандомизируются брандмауэром при каждом соединении). В этом случае некоторые хосты случайно не смогут подключиться, потому что они сопоставлены с портом, для которого сегмент TIME_WAIT сервера имеет более новую отметку времени. Вот почему в документах говорится, что «устройства NAT или балансировщики нагрузки могут запускать пропуск кадров из-за настройки».

Некоторые рекомендуют оставить tcp_tw_recycle в покое, но включить tcp_tw_reuse и понизить tcp_fin_timeout. Я согласен :-)

04.10.2012
  • ссылка внизу битая 04.03.2014
  • Большое спасибо. Я столкнулся именно с этим случаем - хосты за NAT случайно не смогут подключиться, и отключение net.ipv4.timestamps просто привело к тому, что все стало нормально (tcp_tw_recycle и tcp_tw_reuse включены на обеих машинах). 10.12.2014
  • Я считаю, что это должно быть tcp_fin_timeout, а не tcp_timewait_len. Но, возможно, это изменилось в версиях ядра? 13.07.2017
  • tcp_tw_recycle удален из Linux 4.12. Это связано с тем, что Linux теперь рандомизирует временные метки для каждого соединения, и они не увеличиваются монотонно. Если вы используете Linux 4.12 с машинами, использующими tcp_tw_recycle, и временные метки TCP включены, вы увидите обрыв соединений. Вы, конечно, можете отключить его вот так echo 0 > /proc/sys/net/ipv4/tcp_timestamps (временно используйте sysctl.conf для постоянных изменений). Подробности об удалении tcp_tw_recycle в версии 4.12: git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/ 12.10.2017
  • Новые материалы

    Как создать диаграмму градиентной кисти с помощью D3.js
    Резюме: Из этого туториала Вы узнаете, как добавить градиентную кисть к диаграмме с областями в D3.js. Мы добавим градиент к значениям SVG и применим градиент в качестве заливки к диаграмме с..

    Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что это выглядит сложно…
    Просто начните и учитесь самостоятельно Я хотел выучить язык программирования MVC4, но не мог выучить его раньше, потому что он кажется мне сложным, и я бросил его. Это в основном инструмент..

    Лицензии с открытым исходным кодом: руководство для разработчиков и создателей
    В динамичном мире разработки программного обеспечения открытый исходный код стал мощной парадигмой, способствующей сотрудничеству, инновациям и прогрессу, движимому сообществом. В основе..

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..


    Для любых предложений по сайту: [email protected]