Как я могу автоматически протестировать сетевое (TCP / IP) приложение? - PullRequest
0 голосов
/ 07 ноября 2018

Я учу студентов разрабатывать сетевые приложения, как клиентов, так и серверов. На данный момент мы еще не коснулись существующих протоколов, таких как HTTP, SMTP и т. Д. Учащиеся пишут очень простые программы поверх простого API сокета. В настоящее время я проверяю работу студентов вручную, но хочу автоматизировать эту задачу и создать автоматизированный испытательный стенд для сетевых приложений. Наиболее интересные темы для тестирования:

  1. Разбиение сегментов TCP на мелкие части и доставка с заметной задержкой. Причина, по которой мне нужен такой тест, состоит в том, что студенты обычно просто набирают read/recv звонок и обрабатывают полученные данные, не проверяя, что все необходимые данные были получены. TCP не гарантирует границы сообщений, поэтому при определенных обстоятельствах необходимо совершить несколько read/recv вызовов. Проблема заключается в том, что в большинстве простых сетевых приложений (например, в приложении чата) сообщения имеют небольшой размер и помещаются в один сегмент TCP, поэтому проблема не возникает. Моя идея состоит в том, чтобы искусственно разбить сообщения на несколько небольших TCP-сегментов (то есть несколько байтов данных), чтобы появилась проблема.
  2. Приостановка передачи данных на некоторое время для имитации нескольких медленных клиентов и проверки правильности реализации многопоточных / асинхронных сокетов на серверах учащихся.
  3. Сброс соединения в случайные моменты времени.

Я нашел несколько систем, которые имитируют плохую сеть (dummynet, неуклюжий, netem). Однако все они работают на уровне IP стека, поэтому ОС и ее реализация TCP компенсируют потерю данных. Такие системы способны решать задачу № 2, но не способны решать задачи 1 и 3. Поэтому я думаю, что мне нужно разработать собственное решение, которое будет действовать как TCP-прокси. Мои вопросы:

  1. Может быть, есть какие-нибудь библиотеки или приложения, которые могут (хотя бы частично) решить поставленные задачи, поэтому я смогу использовать их в качестве основы для своего собственного решения?
  2. Если нет подходящих существующих программных проектов, может быть, есть какие-нибудь идеи и подходы о том, как сделать это правильно?

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Если вы напишите свой собственный код сокета, вы можете решить все 3 задачи.

  1. включите опцию сокета TCP_NODELAY (отключите алгоритм Nagle для отправки коалесцирующих) через setsockopt(), тогда вы можете send() небольших фрагментов данных по своему желанию, опционально с задержкой между (см. # 2).

  2. просто установите задержку между вашими send() вызовами.

  3. используйте setsockopt() для настройки параметров сокета SO_LINGER и SO_DONTLINGER, чтобы контролировать, будет ли закрытие сокета выполнять неудачное или изящное закрытие, затем просто закройте сокет через некоторый случайный интервал после установления соединения.

0 голосов
/ 07 ноября 2018

Из Список рассылки WireShark - Создание и изменение пакетов :

... На Wiki Wireshark есть страница "Инструменты":

с разделом «Генераторы трафика»:

, в котором перечислены некоторые инструменты, которые могут быть полезны ...

В главе «Генераторы трафика» также упоминается еще одна коллекция генераторов трафика

...