как проверить стек tcp / ip пользовательского пространства?

Я работаю над стеком 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.


person nomnombunty    schedule 21.06.2014    source источник


Ответы (1)


Вы можете использовать инструмент conntrack, чтобы попытаться получить дополнительную информацию о том, почему он не работает с использованием сырых сокетов. Если по какой-то причине ядро ​​запутается в состоянии TCP-соединения, оно может решить его сбросить. Вы можете попробовать сказать ядру не отслеживать соединения, чтобы исключить это, установив правило notrack в необработанной таблице. Что-то типа

iptables -t raw -A PREROUTING -p tcp --port 8080 -j NOTRACK

Попробуйте использовать tcpdump на устройстве tun / tap, и iptables будет подсчитывать, чтобы увидеть, куда упал пакет. Я бы также попробовал устройства tun вместо этого, так что вам нужно беспокоиться только об уровне 3.

person Dan    schedule 11.12.2014