Имитировать медленную скорость для сокетов TCP в Windows

Я создаю приложение, которое использует сокеты TCP для связи. Я хочу проверить, как он ведет себя в условиях низкой скорости.

На сайте есть похожие вопросы, но я так понимаю, они касаются HTTP-трафика, либо касаются линукса. У меня трафик не HTTP, а обычные сокеты TCP, а ОС Windows.

Я попытался использовать настройку fiddler для скорости модема, но это не сработало, похоже, оно работает только для HTTP-соединений.


person sashoalm    schedule 14.11.2013    source источник
comment
Вы ищете формирователя трафика. Fiddler действует как HTTP-прокси, поэтому он не работает повсеместно. Быстрый гугл показывает NetLimiter, никогда им не пользовался, ничего не могу сказать о его возможностях. На самом деле это не вопрос программирования (вероятно, лучше всего для суперпользователя).   -  person Petesh    schedule 14.11.2013
comment
Спасибо, но просто для того, чтобы предотвратить любое голосование за закрытие не по теме, StackOverflow позволяет задавать вопросы об инструментах, специально используемых программистами, таких как IDE и тому подобное, я думаю, что это написано в Часто задаваемые вопросы где-то.   -  person sashoalm    schedule 14.11.2013
comment
Вы не можете легко смоделировать это. Что вы можете сделать, так это настроить QoS на основе политик, чтобы ограничить сетевой трафик, и что вы можете сделать, так это отбросить пакеты на уровне драйвера и объявить небольшое окно. Это может имитировать реальное ограничение скорости, например, в центре обработки данных, где у вас есть так называемая 100-мегабитная ссылка, которая на самом деле является 1-гигабитной ссылкой, идущей к коммутатору, настроенному соответствующим образом, и может имитировать потерю пакетов. Но пакеты, которые приходят, по-прежнему приходят с нормальной скоростью. В лучшем случае вы получаете среднюю медленную скорость.   -  person Damon    schedule 14.11.2013
comment
Использование редактора групповой политики в разделе «Конфигурация компьютера» — «QoS на основе политики» — «сеть» — «расширенные свойства QoS», вероятно, является самым простым способом сделать это. Это позволяет настраивать скорость от 64 кБ/с (0) до 16 МБ/с (3). Но это не на самом деле медленное соединение, оно просто позволяет приходить меньшему количеству пакетов...   -  person Damon    schedule 14.11.2013
comment
@Damon Спасибо за понимание. Как перейти к QoS на основе политик? Это где-то в панели управления? Я хочу имитировать более длительные интервалы времени для одной и той же передачи данных, поэтому меньшее количество пакетов будет в порядке.   -  person sashoalm    schedule 14.11.2013
comment
Ввод группы в поле запуска должен вызвать редактор групповой политики, слева есть панель, где вы можете выбрать конфигурацию компьютера --> настройки Windows. Под этим вы также найдете QoS. По крайней мере так выглядит под моей Win7 профессиональной, может быть по другому если домашняя или что-то другое. Точные имена также могут немного отличаться. MS все переводит, а у меня версия немецкая. Так что это всегда немного догадок, как вещи называются на английском языке (намек на то, что является правильным термином, практически нет).   -  person Damon    schedule 14.11.2013
comment
@Damon Спасибо, я нашел это и установил политику 5 КБ / с, но, похоже, она все еще не соблюдается. Я тестирую его на машине VirtualBox с драйвером виртуальной сети VirtualBox. Может из-за этого не работает? Кроме того, влияют ли эти политики на соединения с локальным хостом?   -  person sashoalm    schedule 15.11.2013
comment
Я бы предположил, что он может специально относиться к локальному хосту, поскольку на самом деле никакие пакеты не входят и не выходят, но я не знаю - извините.   -  person Damon    schedule 15.11.2013


Ответы (3)


Хотя вы, вероятно, захотите инвестировать в обширный набор модульных тестов, вы можете смоделировать различные сетевые условия, используя Рабочая станция VMWare:

Экран сетевых настроек

Вам нужно будет установить виртуальную машину для тестирования, настроить мостовую сеть (чтобы виртуальная машина могла получить доступ к вашей реальной сети) и загрузить свой код в виртуальную машину.

После этого вы можете начать изменять настройки и посмотреть, как работает ваше приложение.

NetLimiter также можно использовать, но у него меньше возможностей (в вашем случае потеря пакетов очень интересна для тестирования и недоступна в netlimiter).

person Ohad    schedule 15.11.2013
comment
Спасибо, я не знал, что VMware может это сделать. Вы знаете, поддерживает ли VirtualBox его? - person sashoalm; 15.11.2013
comment
VirtualBox, кажется, поддерживает некоторые из этих функций. Ознакомьтесь с virtualbox.org/manual/ch06.html#network_bandwidth_limit. - person Ohad; 15.11.2013

Есть отличная утилита для Windows, умеющая делать троттлинг и многое другое:

https://jagt.github.io/clumsy/

person Goran Sliskovic    schedule 21.04.2020

Я думаю, что вы принимаете неправильный подход здесь.

Вы можете достичь всего, что вам нужно, с помощью хорошо разработанных модульных тестов. Все, что вызывает медленное сетевое соединение, можно смоделировать в среде модульного тестирования в контролируемых условиях.

Вещи, которые ваш код ДОЛЖЕН обрабатывать для работы с «медленными» ссылками, — это просто вещи, с которыми вы должны иметь дело в любом случае, включая:

  • Правильная обработка фрагментированных сообщений. Весь ваш сетевой код чтения должен правильно предполагать, что каждое чтение будет возвращать от 1 байта до размера вашего буфера чтения. Вы никогда не должны предполагать, что получите полные «сообщения», поскольку TCP ничего не знает о вашей концепции сообщений.
  • Управление потоком TCP приводит либо к сбою ваших синхронных отправок с некоторой формой ошибки «попробуйте позже», либо к успешным асинхронным отправкам и потенциальному использованию неконтролируемого количества ресурсов (см. здесь для более подробной информации). Обратите внимание, что это может произойти даже на «быстрых» каналах, если вы отправляете быстрее, чем потребляет получатель.
  • Тайм-ауты — опять же, это не ограничивается «медленными» ссылками. Весь ваш код обработки тайм-аута должен быть надежным и протестированным. Возможно, вы захотите убедиться, что любой тайм-аут чтения основан на любом завершении чтения, а не на чтении полного сообщения за время x. Вы можете получать свои данные медленно, но пока вы все еще получаете данные, связь жива.
  • Ошибка подключения - опять же не что-то конкретное для "медленных" ссылок. Вам нужно знать, как вы справляетесь с сбросом соединений в любое время.

Таким образом, ничего, чего вы можете добиться, запустив клиент и сервер в моделируемой медленной сети, не может быть достигнуто с помощью приличного набора модульных тестов, и все, что вы хотели бы протестировать на такой ссылке, может повлиять на любое из ваших соединений на любом скорость ссылки.

person Len Holgate    schedule 15.11.2013
comment
Хотя я ценю модульные тесты, я также хочу проводить тестирование в реальных условиях. Например, я обнаружил, что используемая мной библиотека не заметит разрыва соединения, если я отключу кабель Ethernet. Я освобождаю память и ресурсы при получении уведомления об отключении сокета. Тестирование моего собственного кода не предупредило бы меня об ошибках в библиотеках, которые я использую. - person sashoalm; 15.11.2013
comment
На самом деле отключение кабеля не должно приводить к разрыву TCP-соединения, если только вы не попытаетесь отправить его, а кабель останется отключенным на время повторных попыток TCP. Это неудивительно, так задумано и является «особенностью» TCP. - person Len Holgate; 15.11.2013
comment
@LenHolgate Независимо от того, используете ли вы модульные тесты, в какой-то момент вам нужно выполнить проверку поведения в реальном мире, чтобы убедиться, что ваш код точно представляет это поведение. Если вы реализуете свой код и/или модульные тесты исключительно на основе ваших предположений о поведении, вы проверяете только то, что ваши предположения/знания точны. Если вы считаете, что правильно справляетесь с пограничным случаем, вам необходимо проверить свои предположения с помощью интеграционного теста (т. е. в реальном мире). После того, как вы выполнили этот тест, вы можете приступить к написанию/настройке своих модульных тестов и полагаться на них в будущем. - person AaronLS; 03.01.2015
comment
AaronLS, да, конечно требуется интеграционное тестирование на реальном железе. - person Len Holgate; 04.01.2015