Простой способ моделировать медленную сеть в Python

При помощи _MSC_VER макрос.

7
задан Orjanp 2 December 2009 в 15:18
поделиться

3 ответа

Помимо использования внешнего инструмента для моделирования интересующей вас сети, один хороший подход - использовать альтернативную реализацию сокета.

Это включает в себя создание конструкции сокета как параметр вашей функции, вместо того, чтобы импортировать модуль сокета и использовать его напрямую. Для нормальной работы вы передадите реальный тип сокета, но если вы хотите протестировать различные неблагоприятные сетевые условия, вы можете передать реализацию, которая имитирует эти условия. Например, вы можете создать тип сокета, который параметризует задержку и пропускную способность (непроверенный код, будьте осторожны):

import time, socket

class ControllableSocket:
    def __init__(self, latency, bandwidth):
        self._latency = latency
        self._bandwidth = bandwidth
        self._bytesSent = 0
        self._timeCreated = time.time()
        self._socket = socket.socket()

    def send(self, bytes):
        now = time.time()
        connectionDuration = now - self._timeCreated
        self._bytesSent += len(bytes)
        # How long should it have taken to send how many bytes we've sent with our
        # given bandwidth limitation?
        requiredDuration = self._bytesSent / self._bandwidth
        time.sleep(max(requiredDuration - connectionDuration, self._latency))
        return self._socket.send(bytes)

Если вы реализуете другие методы сокета, connect, recv и т. Д., Вы можете заменить экземпляр этого класса на экземпляр настоящий тип розетки. Это оставляет всю остальную часть вашей программы полностью свободной от каких-либо знаний о вашем моделировании, упрощая ее, а также позволяя вам опробовать множество различных сетевых конфигураций, просто реализуя новый тип сокета, который имитирует их.

Эта идея является одной из наиболее подходящих. Причины Twisted явно отделяют идею «протоколов» - объектов, которые умеют интерпретировать байты из сети и генерировать новые байты для отправки в сеть - от «транспортов» - объектов, которые умеют получать байты из сети и помещать байты в Это. Разделение упрощает тестирование и позволяет создавать новые конфигурации, подобные этой, в которых моделирование некоторых других сетевых условий (которые могут быть трудно воспроизвести в реальности) обеспечивается транспортом.

в то же время позволяя вам опробовать множество различных сетевых конфигураций, просто реализовав новый тип сокета, который имитирует их.

Эта идея является одной из причин, по которым Twisted явно отделяет идею «протоколов» - объектов, которые умеют интерпретировать байты от сеть и генерировать новые байты для отправки в сеть - из «транспортов» - объектов, которые знают, как получать байты из сети и помещать в нее байты. Разделение упрощает тестирование и позволяет создавать новые конфигурации, подобные этой, в которых моделирование некоторых других сетевых условий (которые могут быть трудно воспроизвести в реальности) обеспечивается транспортом.

в то же время позволяя вам опробовать множество различных сетевых конфигураций, просто реализовав новый тип сокета, который имитирует их.

Эта идея является одной из причин, по которой Twisted явно отделяет идею «протоколов» - объектов, которые умеют интерпретировать байты от сеть и генерировать новые байты для отправки в сеть - из «транспортов» - объектов, которые знают, как получать байты из сети и помещать в нее байты. Разделение упрощает тестирование и позволяет создавать новые конфигурации, подобные этой, в которых моделирование некоторых других сетевых условий (которые могут быть трудными для реального выполнения) обеспечивается транспортным средством.

- объекты, которые умеют интерпретировать байты из сети и генерировать новые байты для отправки в сеть - из «транспортов» - объектов, которые знают, как получать байты из сети и помещать в нее байты. Разделение упрощает тестирование и позволяет создавать новые конфигурации, подобные этой, в которых моделирование некоторых других сетевых условий (которые могут быть трудными для реального выполнения) обеспечивается транспортным средством.

- объекты, которые умеют интерпретировать байты из сети и генерировать новые байты для отправки в сеть - из «транспортов» - объектов, которые знают, как получать байты из сети и помещать байты в нее. Разделение упрощает тестирование и позволяет создавать новые конфигурации, подобные этой, в которых моделирование некоторых других сетевых условий (которые могут быть трудно воспроизвести в реальности) обеспечивается транспортом.

10
ответ дан 6 December 2019 в 12:52
поделиться

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

Netlimiter делает это для Windows. Я думаю, что BWMeter и Контроллер полосы пропускания тоже могут это сделать.

pyshaper - аналогичный инструмент для Linux. Открытый источник. Возможно, вы просто сможете импортировать его в свою программу Python.

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

4
ответ дан 6 December 2019 в 12:52
поделиться

Что ж, сетевое соединение «медленнее», чем другое, происходит из-за задержки и / или пропускной способности. Поэтому, если вы хотите получить реалистичное моделирование, вам необходимо определить пропускную способность вашего мобильного телефона, а также его задержку и смоделировать это в своей клиентской программе.

Но вы, кажется, имеете в виду, что отправляете очень мало данных, поэтому пропускная способность, вероятно, не повлияет на скорость вашего соединения. Таким образом, вы можете просто моделировать задержку, и это делает то, что вы делаете: засыпание (задержка) между каждым отправленным пакетом. Тем не менее, 5 секунд кажутся много.

Но если вы считаете, что полоса пропускания может иметь значение, ее на самом деле довольно просто смоделировать: пропускная способность - это максимальное количество байтов в секунду, которое вы можете отправить, а задержка - это время, которое потребуется добраться до места назначения.

Как это сделать: иметь глобальную метку времени «blockedUntil», представляющую время, пока ваше соединение снова не станет свободным для отправки данных. Установите значение 0 в начале вашей программы, поскольку мы предполагаем, что он еще не используется. Затем каждый раз, когда у вас есть пакет для отправки, если "_blockedUntil" меньше, чем now (), установите его в now (). Затем вычислите время, которое потребуется для записи в ваш фиктивный «провод», выполнив: packet.size () / bandwidth, что даст вам продолжительность времени, добавит задержку и прибавит ее к «blockedUntil».

Теперь вычислите dt = blockedUntil - now (), добавьте пакет в очередь и добавьте таймер, срабатывающий в «dt», который вытолкнет первый пакет в очереди и отправит его.

Вот и вы ' ve смоделировал пропускную способность и задержку.

Изменить: как кто-то там упомянул ' s также вопрос об отброшенных пакетах. Вы можете смоделировать это, имея вероятность отбрасывания пакетов. Примечание: Это возможно только при обработке пакетов из неподключенного протокола, такого как Ethernet или UDP. В случае TCP, например, это не сработает.

2
ответ дан 6 December 2019 в 12:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: