한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Анатомия игровых лагов › Первопричины повторных передач TCP

Удаление опций TCP промежуточным оборудованием Middlebox strips TCP options

ID причины rt-sack-stripped · Основной ответственный Команда инфраструктуры · Сетевая инфраструктура · Совместно Команда инфраструктуры · Серверная инфраструктура

Открыть карточку в основной версии с иллюстрациями и экспериментами →

Если некоторые файрволы или ускорители удаляют или меняют опции TCP, то при потере нескольких пакетов они восстанавливаются по одному за RTT или окно (сколько можно отправить за раз) становится маленьким, и передача замедляется.

Почему «Нормализация TCP» на файрволе или старый ускоритель удаляют опции SACK, временных меток и масштабирования окна → Следствие Если потеряно несколько пакетов, они восстанавливаются по одному за RTT, окно ограничено 64 KB → На экране Каждая потеря даёт намного более долгий фриз (без SACK нельзя использовать и RACK-TLP), после которого перемотка. Большие передачи вроде патчей тоже идут медленно

Симптомы
Фриз, Перемотка
Факторы
Остановка, Задержка
У кого
Один регион или провайдер, Весь сервер
Когда
Всегда
Ответственные
Основной ответственный Команда инфраструктуры · Сетевая инфраструктура · Совместно Команда инфраструктуры · Серверная инфраструктура
Команда инфраструктуры: задачи
Сеть: отключить нормализацию TCP на этом оборудовании, проверить и рандомизацию номеров последовательности на файрволе, сравнить опции SYN по захватам пакетов на обоих концах. Серверы и ОС: проверить в ss -ti, не сосредоточены ли соединения без sack и wscale на определённом маршруте (ПК с Windows в зависимости от настроек не используют ts, поэтому отсутствие только ts может быть нормой), проверить, что net.ipv4.tcp_sack на сервере равен 1.
На графике
Высоко с самого начала · число восстановлений, начатых без SACK (TcpExtTCPRenoRecovery)
Где смотреть
Проверить в ss -ti, есть ли у каждого соединения отметки sack и wscale, и посмотреть в nstat соотношение TcpExtTCPRenoRecovery (восстановления без SACK) и TcpExtTCPSackRecovery, а также TcpExtTCPSACKDiscard (число SACK-блоков, выброшенных как несогласованные). На подозрительном маршруте захватить SYN на обоих концах и сравнить опции (tcp.options.sack_perm в Wireshark и др.)
Подтверждает
sack и wscale отсутствуют только у соединений через определённый маршрут или оборудование, и доля TcpExtTCPRenoRecovery высокая. Опция разрешения SACK, которая была в SYN на стороне отправителя, отсутствует в SYN на стороне получателя. Если причина в рандомизации номеров последовательности, опции на месте, но растёт TcpExtTCPSACKDiscard
Опровергает
Если sack нет у всех соединений, сначала проверить значение net.ipv4.tcp_sack на сервере. Если опции целы и TcpExtTCPSACKDiscard не меняется, медленное восстановление объясняется чем-то другим («Медленное восстановление потерь в thin stream»)
Чем проверить
Инструменты инфраструктуры (игровой код не нужен)
Подробнее
SACK может сломаться, даже если опции сохранились. Если рандомизация номеров последовательности на файрволе (sequence randomization) меняет номера только в заголовке и оставляет прежними номера внутри SACK, отправитель выбрасывает несогласованные SACK. Тот же результат, если в 2019 году из-за уязвимости SACK на сервере его отключили через tcp_sack=0 и забыли.

Источники

  1. RFC 2018: TCP Selective Acknowledgment Options IETF
    Без SACK, только по кумулятивным ACK, за один RTT можно узнать только об одном потерянном пакете
  2. RFC 7323: TCP Extensions for High Performance IETF
    Без опции масштабирования окна окно не больше 2^16 = 64 KiB
  3. RFC 8985: The RACK-TLP Loss Detection Algorithm for TCP IETF
    Для RACK-TLP обязательно использование SACK
  4. net/ipv4/tcp_output.c Linux kernel
    TLP в Linux планируется только для соединений с SACK
  5. IP Sysctl Linux kernel
    tcp_sack по умолчанию 1 (включено)
  6. misc/ss.c iproute2
    ss -ti в зависимости от опций, используемых соединением, выводит ts, sack и wscale:отправка,приём
  7. tcp: limit payload size of sacked skbs Linux kernel
    Коммит с исправлением уязвимости обработки SACK 2019 года (CVE-2019-11477)
  8. Linux and FreeBSD Kernel: Multiple TCP-based remote denial of service vulnerabilities (NFLX-2019-001) Netflix
    Тогда в качестве временной меры рекомендовали tcp_sack=0 (отключить обработку SACK)
  9. SNMP counter Linux kernel
    TcpExtTCPRenoRecovery (восстановление начато без SACK), TcpExtTCPSackRecovery (восстановление начато с SACK), TcpExtTCPSACKDiscard (число недействительных SACK-блоков)
  10. Display Filter Reference: Transmission Control Protocol Wireshark
    Фильтр отображения tcp.options.sack_perm (опция разрешения SACK в SYN)

Смотрите также

Тот же слой: Первопричины повторных передач TCP

Причины с тем же симптомом (Фриз) на других слоях

Карточка в основной версии с иллюстрациями и экспериментами