За замовчуванням, коли обидва 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
. Я погоджуюсь :-)