Я учу студентов разрабатывать сетевые приложения, как клиентов, так и серверов. На данный момент мы еще не коснулись существующих протоколов, таких как HTTP, SMTP и т. Д. Учащиеся пишут очень простые программы поверх простого API сокета. В настоящее время я проверяю работу студентов вручную, но хочу автоматизировать эту задачу и создать автоматизированный испытательный стенд для сетевых приложений. Наиболее интересные темы для тестирования:
- Разбиение сегментов TCP на мелкие части и доставка с заметной задержкой. Причина, по которой мне нужен такой тест, состоит в том, что студенты обычно просто набирают
read/recv
звонок и обрабатывают полученные данные, не проверяя, что все необходимые данные были получены. TCP не гарантирует границы сообщений, поэтому при определенных обстоятельствах необходимо совершить несколько read/recv
вызовов. Проблема заключается в том, что в большинстве простых сетевых приложений (например, в приложении чата) сообщения имеют небольшой размер и помещаются в один сегмент TCP, поэтому проблема не возникает. Моя идея состоит в том, чтобы искусственно разбить сообщения на несколько небольших TCP-сегментов (то есть несколько байтов данных), чтобы появилась проблема.
- Приостановка передачи данных на некоторое время для имитации нескольких медленных клиентов и проверки правильности реализации многопоточных / асинхронных сокетов на серверах учащихся.
- Сброс соединения в случайные моменты времени.
Я нашел несколько систем, которые имитируют плохую сеть (dummynet, неуклюжий, netem). Однако все они работают на уровне IP стека, поэтому ОС и ее реализация TCP компенсируют потерю данных. Такие системы способны решать задачу № 2, но не способны решать задачи 1 и 3. Поэтому я думаю, что мне нужно разработать собственное решение, которое будет действовать как TCP-прокси. Мои вопросы:
- Может быть, есть какие-нибудь библиотеки или приложения, которые могут (хотя бы частично) решить поставленные задачи, поэтому я смогу использовать их в качестве основы для своего собственного решения?
- Если нет подходящих существующих программных проектов, может быть, есть какие-нибудь идеи и подходы о том, как сделать это правильно?