Iperf и TCP-тестирование: почему один поток показывает меньше реального канала

Калькулятор BDP и скорости TCP

Основная "проблема"

При использовании iperf в режиме TCP с одним потоком результаты часто существенно ниже реальной пропускной способности канала. Это связано с фундаментальными ограничениями протокола TCP, а не с проблемами сети.

1981-09 - RFC 793 - Transmission Control Protocol

1982-07 - RFC 813 - Window and Acknowledgement Strategy in TCP
1984-01 - RFC 896 - Congestion Control in IP/TCP Internetworks

1989-10 - RFC 1122 - Requirements for Internet Hosts - Communication Layers

1992-05 - RFC 1323 - TCP Extensions for High Performance

1996-10 - RFC 2018 - TCP Selective Acknowledgment Options

1998-09 - RFC 2414 - Increasing TCP’s Initial Window

1999-04 - RFC 2581 - TCP Congestion Control

2001-09 - RFC 3168 - The Addition of Explicit Congestion Notification (ECN) to IP

2002-10 - RFC 3390 - Increasing TCP’s Initial Window

2009-06 - RFC 5562 - Adding Explicit Congestion Notification (ECN) Capability to TCP’s SYN/ACK Packets

2009-09 - RFC 5681 - TCP Congestion Control

2012-08 - RFC 6675 - A Conservative Loss Recovery Algorithm Based on Selective Acknowledgment (SACK) for TCP

2013-04 - RFC 6928 - Increasing TCP’s Initial Window

2014-09 - RFC 7323 - TCP Extensions for High Performance

2022-08 - RFC 9293 - Transmission Control Protocol (TCP)

Bandwidth-Delay Product (BDP) и TCP Window

BDP — это простой способ понять, сколько данных может одновременно находиться “в пути” между отправителем и получателем в сети. Рассчитывается как произведение пропускной способности канала на задержку передачи:

BDP = Пропускная способность × RTT

Например, для канала 10 Gbps с задержкой 30 мс:

BDP = 10 Gbps × 0.030 сек / 8 = 37.5 МБ

TCP Window определяет максимальный объем данных, который можно передать до получения подтверждения. Теоретическая пропускная способность TCP ограничена формулой:

Максимальная пропускная способность = TCP Window Size / RTT
Если окно передачи (TCP window) меньше BDP, то сеть не будет использоваться эффективно — отправитель “ждёт”, пока придёт подтверждение, и не посылает больше данных. Если окно достаточно большое — данные передаются непрерывно, и канал используется максимально полно.
Важно: По умолчанию размер TCP-окна в Linux составляет около 64 КБ, что для канала с RTT 100 мс дает максимальную скорость только 5.2 Мбит/с, независимо от реальной пропускной способности канала.

Почему один поток TCP ограничен

  1. Консервативность TCP: Протокол разработан для надежности, а не максимальной скорости
  2. Ограничения буферов: Размеры буферов отправки и получения по умолчанию слишком малы
  3. Алгоритмы контроля перегрузок: CUBIC реагирует на потери пакетов агрессивным снижением скорости на 30%
  4. CPU bottleneck: При высокой нагрузке процессор может стать узким местом

Рекомендации по тюнингу TCP-стека (на примере Linux)

1. Включение TCP Window Scaling

Проверьте состояние:

sysctl net.ipv4.tcp_window_scaling

Включите если отключено:

sysctl -w net.ipv4.tcp_window_scaling=1
echo "net.ipv4.tcp_window_scaling=1" >> /etc/sysctl.conf

2. Настройка размеров буферов

Установите максимальные размеры буферов (рекомендация: BDP × 2):

# Максимальные размеры буферов
sysctl -w net.core.rmem_max=134217728    # 128 МБ
sysctl -w net.core.wmem_max=134217728    # 128 МБ

# TCP-специфичные буферы (min, default, max)
sysctl -w net.ipv4.tcp_rmem="4096 87380 134217728"
sysctl -w net.ipv4.tcp_wmem="4096 65536 134217728"

3. Включение автонастройки буферов

sysctl -w net.ipv4.tcp_moderate_rcvbuf=1

4. Смена алгоритма контроля перегрузок

Для высокоскоростных каналов рассмотрите BBR вместо CUBIC:

# Проверка доступных алгоритмов
cat /proc/sys/net/ipv4/tcp_available_congestion_control

# Установка BBR (если доступен)
sysctl -w net.ipv4.tcp_congestion_control=bbr
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
Примечание: BBR показывает на 70% лучшую производительность при наличии потерь пакетов по сравнению с CUBIC.

5. Применение настроек

sysctl -p

Интерпретация результатов iperf

Пример оптимального конфига для /etc/sysctl.conf

# TCP Window Scaling
net.ipv4.tcp_window_scaling=1

# Буферы для высокоскоростных соединений
net.core.rmem_max=134217728
net.core.wmem_max=134217728
net.ipv4.tcp_rmem=4096 87380 134217728
net.ipv4.tcp_wmem=4096 65536 134217728

# Автонастройка буферов
net.ipv4.tcp_moderate_rcvbuf=1

# BBR для WAN-соединений (если доступен)
net.ipv4.tcp_congestion_control=bbr
После настройки TCP-стека один поток iperf должен показывать результаты значительно ближе к реальной пропускной способности канала.

Рекомендации по тюнингу TCP стека в Windows для увеличения скорости передачи

Для повышения скорости передачи файлов по TCP в Windows можно выполнить оптимизацию сетевого стека и настроить параметры сетевого адаптера. Ниже приведены основные шаги и рекомендации.

1. Настройка глобальных параметров TCP

netsh int tcp set global autotuninglevel=normal
netsh int tcp set global rss=enabled
netsh int tcp set global netdma=enabled
netsh int tcp set global chimney=enabled
netsh interface tcp set heuristics disabled

2. Оптимизация параметров через реестр

В редакторе реестра Windows перейти в:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
и для каждого активного интерфейса создать или изменить DWORD параметры:

В разделе Parameters добавить:

После изменений требуется перезагрузка системы.

3. Использование утилиты TCP Optimizer

Для автоматической настройки TCP/IP параметров можно использовать бесплатную утилиту TCP Optimizer. Она позволяет подобрать оптимальные параметры под конкретную сеть и создать резервные копии текущих настроек.

4. Настройка сетевого адаптера

Важно: Перед внесением изменений создайте точку восстановления системы и резервную копию реестра. Соблюдайте совместимость настроек с сетевым оборудованием.