За замовчуванням, коли обидва 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пакет буде мовчки відкинутий, а з'єднання не встановиться (ви побачите помилку, подібну до "timeout time"). Якщо ви хочете зануритися в код ядра, визначення tcp_timewait_state_process може стати хорошою відправною точкою.
Тепер часові позначки ніколи не повинні повертатися у часі; якщо:
- хост перезавантажується (але тоді, до моменту його повернення,
TIME_WAITсокет, ймовірно, закінчився, тому це не буде проблемою);
- IP-адресу швидко використовуватимуть щось інше (
TIME_WAITз’єднання залишаться трохи, але, ймовірно, будуть вражені інші з'єднання, TCP RSTщо звільнить простір);
- трансляція мережевої адреси (або брандмауер смарт-штанів) бере участь у середині з'єднання.
В останньому випадку ви можете мати кілька хостів за однією і тією ж IP-адресою, отже, різні послідовності часових міток (або, згадані часові позначки рандомізовані при кожному з'єднанні між брандмауером). У такому випадку деякі хости випадково не зможуть підключитися, оскільки вони відображаються до порту, для якого TIME_WAITвідро сервера має новішу часову позначку. Ось чому документи говорять вам, що "NAT пристрої або балансири завантаження можуть запускати кадри через налаштування".
Деякі люди рекомендують залишити в tcp_tw_recycleспокої, але включити tcp_tw_reuseта опуститиtcp_timewait_len . Я погоджуюсь :-)