- *? *programmingПусть у нас есть сервер^W компьютер с вендой, отдающий контент, и несколько машин, подключающихся к нему. Пропускная способность канала машины с вендой на отдачу ограничена, и пусть она равна u, скорость приема каждой из клиентских машин — v, всего n клиентских машин. Как поделится исходящий канал сервера, если клиенты подключаются последовательно, и:
• u < v?
• v < u < nv?from idead, 11 months ago
Replies (17)
- @0xd34df00d:@gelraen Мне просто надо просимулировать такое поведение, я пытаюсь построить годную модель.
- @gelraen:@0xd34df00d модель — по одной FIFO-очереди на вход и на выход. Хочеться разделять поровну — делай винде доступ в инет через шлюз с freebsd и разруливай там dummynet'ом
- @0xd34df00d:@gelraen Не понял, как это так модель?
- @gelraen:@0xd34df00d что именно не понял? есть сетевой интерфейс, внутри ядра есть очередь пакетов для отправки и есть очередь уже принятых, но ещё не переданых вверх по стеку. Соответственно, кто извне успеет набить пакетов в канал раньше всех — те первыми и придут. Изнутри точно так же — какие первые пошлёшь, те первыми и выйдут наружу.
- @0xd34df00d:@gelraen Окей, но я хреново представляю, как это промоделировать в хрени типа «на следующем шаге узел A получил еще 200 байт, узел B получил еще 300, узел C еще 5».
- @gelraen:@0xd34df00d о_О а теперь я ничего не понял
- @gelraen:@0xd34df00d ну и в формальном описании несколько некорректно описывать "кто-то где-то там что-то получил", потому как он может его получить только к завтрашнему утру после отправки, а может и вообще не получить. Можно только (относительно) полагаться на "кому-то было что-то отправлено". По крайней мере это справедливо в отношении ІР-сетейfrom imax, 11 months ago, in reply to /8
- @0xd34df00d:@gelraen Ну смотри, есть сеть из нод. У ноды есть U и V — скорость отправки и скорость приема. Мне надо просимулировать ситуацию, когда много нод запрашивают у какой-то одной набор данных. U, V известно, время запроса, вообще говоря, тоже. Чтоделац?from idead, 11 months ago, in reply to /10
- @gelraen:@0xd34df00d симулируй packet-switching network, разделяй поток на кучки (пакеты) определённого размера. Время пересылки пакета по каналу будет определяться скоростю. Если принять что каналы полнодуплексные — нода может принимать и передавать пакеты одновременно, но не больше одного пакета за раз в каждую сторону.
Двигаемся дальше: нода у себя в очереди накапливает входящие запросы и может либо одновременно выполнять только один запрос, либо в цикле обработки событий принимать новые и обрабатывать несколько запросов паралельно. Тогда по исходящему каналу будут лезть результаты нескольких запросов: в каком порядке и пропорциях — определяется самой нодой (банально порядком отправки, send(2)/write(2) т.е.).from imax, 11 months ago, in reply to /11 - @0xd34df00d:@gelraen Разумно. Я вот думаю, размер пакета в 16-64 кб будет ок или не ок? Просто такие пакеты подразумеваются самим протоколом, и делить их ручками в симуляции лень.from idead, 11 months ago, in reply to /12
- @gelraen:@0xd34df00d В реальных сетях используются размеры до 1.5к, ибо ethernet заполонил. Если у тебя оно поверх udp — будь готов к тормозам и потерям: фрагментированные пакеты никто не любит. Ну а tcp сам порежет на куски нужного размера, но там я уже не уверен как венда будет эти куски по 1.5 ставить в очередь при записи в сокет сразу большой пачки данных: или будет паралельно от нескольких процессов нарезать и раскладывать вперемешку, или же кто успел тому и повезёт быть первым. Скорее таки второе, паралелить — это не по части винды.from imax, 11 months ago, in reply to /13
- @0xd34df00d:@gelraen Дык это все равно из одного процесса будет в конечной реализации.from idead, 11 months ago, in reply to /14
- @gelraen:@0xd34df00d ну отдельные треды тоже могут рассматриваться как процессыfrom imax, 11 months ago, in reply to /15
- @0xd34df00d:@gelraen Асинхронные сокеты же. Правда, я не знаю, как оно в венде сделано. Вполне возможно (и даже разумно), что аналогично.from idead, 11 months ago, in reply to /16