Я работаю над стеком tcp пользовательского пространства (в основном просто для удовольствия), и у меня возникли проблемы с его тестированием на стеке tcp unix. В настоящее время единственная форма тестирования выполняется с помощью модульных тестов. Однако я хочу протестировать свой TCP-стек на реальном TCP-стеке ядра. Я без особого успеха попробовал следующие установки.
с использованием сырых сокетов: я написал простой tcp-сервер echo, который принимает соединение с использованием TCP-сокета ядра. Сервер TCP прослушивает порт 8080 на локальном хосте. Мой клиент tcp использует стек tcp пользовательского пространства. Однако ядро отправляет tcp rst всякий раз, когда клиент отправляет синхронизацию на сервер. Это вроде работы после того, как я изменил iptable, чтобы отбросить все пакеты tcp rst. Однако, даже если установлено трехстороннее рукопожатие syn, syn + ack, ack, сервер не может получить ни один пакет, который отправляет мой клиент. В конце концов я отказался от сырых сокетов.
с использованием tun / tap: аналогично эхо-сервер использует сокет tcp ядра и прослушивает порт localhost 8080. Клиент открывает устройство Tap. Устройство с краном имеет IP-адрес 10.0.0.1, а мой клиент предполагает IP-адрес 10.0.0.2. Я могу пинговать 10.0.0.2 со своего компьютера. Однако, когда мой клиент отправляет синхронизацию на tcp-сервер через устройство с перехватом, сервер не отвечает.
Примечание: я использую ubuntu 12.04.