
Инструмент для онлайн-репликации запросов и повторной передачи TCP-потоков, идеально подходящий для реального тестирования, тестирования производительности, стабильности, стресс-тестирования, нагрузочного тестирования, дымового тестирования и многого другого.
TCPCopy — это инструмент для воспроизведения TCP-потоков, предназначенный для реалистичного тестирования интернет-серверных приложений.
Примеры предварительного прогрева TCPCopy
Хотя реальный живой трафик крайне важен для тестирования интернет-серверных приложений, точная его симуляция затруднена из-за сложности онлайн-сред. Для более реалистичного тестирования был разработан TCPCopy — инструмент воспроизведения живого трафика, который генерирует тестовые нагрузки, максимально приближенные к производственным. TCPCopy широко используется компаниями в Китае.
TCPCopy минимально влияет на рабочую систему, потребляя лишь дополнительный процессор, память и пропускную способность. Воспроизведённая нагрузка отражает производственную среду по разнообразию запросов, задержкам в сети и использованию ресурсов.

Рисунок 1. Обзор архитектуры TCPCopy.
Как показано на рисунке 1, TCPCopy состоит из двух компонентов: tcpcopy и intercept. Компонент tcpcopy работает на онлайн-сервере, захватывая живые запросы, в то время как intercept работает на вспомогательном сервере, выполняя такие задачи, как передача информации об ответах обратно в tcpcopy. Само тестовое приложение работает на целевом сервере.
По умолчанию tcpcopy использует raw-сокеты для захвата пакетов на сетевом уровне (изображены оранжевыми стрелками на рисунке). Он обрабатывает такие процессы, как симуляция TCP-взаимодействия, управление задержками в сети и симуляция взаимодействия на верхних уровнях. Затем он отправляет пакеты на целевой сервер с помощью raw-сокетов (показаны светло-красными стрелками на рисунке).
Единственная необходимая задача на целевом сервере — настройка правил маршрутизации для направления ответных пакетов (показаны светло-зелёными стрелками на рисунке) на вспомогательный сервер.
Роль компонента intercept заключается в пересылке заголовка ответа (по умолчанию) обратно в tcpcopy. Он захватывает ответные пакеты, извлекает информацию заголовка ответа и отправляет эту информацию в tcpcopy через выделенный канал (обозначен голубыми стрелками на рисунке). Получив заголовок ответа, tcpcopy использует эту информацию для изменения атрибутов онлайн-пакетов и продолжает отправлять последующие пакеты.
Важно отметить, что ответы с целевого сервера направляются на вспомогательный сервер, который работает как чёрная дыра.
Для intercept у вас есть два варианта:
git clone git://github.com/session-replay-tools/intercept.git.Для tcpcopy у вас также есть два варианта:
git clone git://github.com/session-replay-tools/tcpcopy.git.intercept:cd intercept./configure makeintercept:make installintercept--single
Запустить intercept в нераспределённом режиме.
--with-pfring=PATH
Укажите путь к исходникам библиотеки PF_RING.
--with-debug
Скомпилировать intercept с поддержкой отладки, логи сохраняются в файл.
tcpcopy на онлайн-сервереtcpcopy: cd tcpcopy./configure maketcpcopy: make installtcpcopy--offline
Воспроизвести TCP-потоки из pcap-файла.
--pcap-capture
Захватывать пакеты на канальном уровне.
--pcap-send
Отправлять пакеты на канальном уровне вместо IP-уровня.
--with-pfring=PATH
Укажите путь к исходникам библиотеки PF_RING.
--set-protocol-module=PATH
Настроить tcpcopy на работу с внешним модулем протокола.
--single
Если и intercept, и tcpcopy сконфигурированы с опцией --single, только один экземпляр tcpcopy будет работать с intercept, что повышает производительность.
--with-tcmalloc
Использовать tcmalloc вместо malloc.
--with-debug
Скомпилировать tcpcopy с поддержкой отладки, логи сохраняются в файл.
Предположим, что и tcpcopy, и intercept сконфигурированы с помощью ./configure.
На целевом сервере, где работают серверные приложения:
Настройте правила маршрутизации, чтобы направлять ответные пакеты на вспомогательный сервер. Например, если 61.135.233.161 — это IP-адрес вспомогательного сервера, используйте следующую команду маршрутизации, чтобы направить все ответы от клиентов из диапазона 62.135.200.x на вспомогательный сервер:
route add -net 62.135.200.0 netmask 255.255.255.0 gw 61.135.233.161
На вспомогательном сервере, где запущен intercept (требуется root-права или возможность CAP_NET_RAW):
./intercept -F <filter> -i <device>
Обратите внимание, что формат фильтра такой же, как у pcap-фильтра. Например:
./intercept -i eth0 -F 'tcp and src port 8080' -d
В этом примере intercept будет захватывать ответные пакеты от TCP-приложения, слушающего порт 8080, используя сетевое устройство eth0.
Пожалуйста, учтите, что ip_forward не включён на вспомогательном сервере.
На исходном онлайн-сервере (требуется root-права или возможность CAP_NET_RAW):
./tcpcopy -x localServerPort-targetServerIP:targetServerPort -s <intercept server> [-c <ip range>]
Например (предположим, что 61.135.233.160 — это IP-адрес целевого сервера):
./tcpcopy -x 80-61.135.233.160:8080 -s 61.135.233.161 -c 62.135.200.x
В этом примере tcpcopy захватывает пакеты на порту 80 с текущего сервера, изменяет IP-адрес клиента на один из диапазона 62.135.200.x и отправляет эти пакеты на порт 8080 целевого сервера (61.135.233.160). Он также подключается к 61.135.233.161, чтобы запросить intercept пересылать ответные пакеты. Параметр -c необязателен, но здесь используется для упрощения правил маршрутизации.