Подтвердить что ты не робот

Низкоприоритетная загрузка HTTP в .net

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

Загрузка состоит из многих файлов большого размера, которые передаются индивидуально, соединение должно быть стандартным HTTP POST (у меня нет контроля над сервером), и мне нужно управлять заголовками HTTP (сервер использует их для аутентификации и метаданные)

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

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

Я нашел BITS, но я думаю, что это не касается меня, так как мне нужно, чтобы он был стандартным HTTP POST.

Я использую .net 3.5, программа написана на С#, и я в настоящее время использую HttpWebRequest для загрузки.

Уточнение:. Я пишу потребительское программное обеспечение, которое будет работать на домашнем компьютере клиентов. Мои бета-тестеры жалуются, что интернет работает медленно, когда они запускают мою программу (понятно, поскольку я использую всю их пропускную способность), поэтому я хочу уделять более высокий приоритет другим программам, поэтому их интернет перестает быть медленным.

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

4b9b3361

Ответ 1

Одновременно отслеживайте количество байтов, отправляемых вашим приложением, и общее количество байтов, отправленных в сети, используя System.Net.NetworkInformation.IPv4InterfaceStatistics class 'bytesSent Property в заданный интервал. Вычтите общие байты, которые ваше приложение отправило в этом интервале из общего количества байтов, отправленных в сети (в течение того же интервала). Если разница достаточно высока для того, чтобы вам нужно было активировать загрузку, сделайте это. Как только разница станет достаточно малой, выверните загрузку.

Ответ 2

Я надеюсь, что у вас есть дроссельный конец проблемы, поэтому вам нужно знать только две вещи:

  • КОГДА уменьшить скорость загрузки

и

  • КАК МНОГО уменьшить его

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

Теперь - проблема с загрузками с большинством интернет-подключений (скажем, ADSL) заключается в том, что они потребляют драгоценный UPLOAD, который крайне ограничен, скажем, 256-512 тыс. Пользователь, вероятно, сообщает о проблемах, потому что ваша загрузка убивает запросы, которые они отправляют, поэтому они не могут вернуть данные.

Я предлагаю вам сделать две вещи: решить проблему WHEN, сделайте следующее:

  • создать простой запрос GET для вашего веб-сервера.
  • измерять время, необходимое для полного процесса обработки и реагирования сервера, путем чтения ответа на конец
  • используйте одно значение отсечки для "занятого" и "бесплатного" соединения, или измерьте время для каждого клиента и вычислите их значение отсечки.
  • Если время больше, вы заняты, делаете дросселирование, иначе, переходите на полную скорость.
  • вы можете повторить это как можно больше - например, каждую минуту

Для решения проблемы HOW MUCH это еще один вопрос. Во-первых, вы должны измерить, сколько вы можете загрузить, когда никто не использует соединение - ваша базовая скорость загрузки на клиента. Затем, используя технику WHEN, вы можете отключить загрузку, пока не получите "свободный" результат, который будет работать для их соединения.

Надеюсь, что я дал понять, спросите, нужно ли что-то уточнить.

EDIT:

Мало того, что нужно учитывать:

  • отправка двоичных данных через POST является расточительным, поскольку все кодируется в BASE64. Вы должны проверить некоторые другие способы загрузки.
  • дросселирование на веб-сервере может быть проблемой, потому что, если вы загружаете большой кусок данных медленно, возможно, сервер будет тайм-аут
  • Если вы объедините 1 + 2, вы можете разработать план, который может объединить данные в куски, скажем 1 КБ или более, и отправить их по одному. Только это может решить вашу проблему дросселирования, если вы сделаете это с помощью сериализованной моды.

Ответ 3

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

По моему опыту, даже сетевые устройства с низким уровнем потребления (персональные брандмауэры, шлюзы, кабельные модемы, модемы DSL, даже ОС Windows и т.д.) поддерживают формирование трафика. Используйте эту возможность и настройте трафик, который вы генерируете, на низкий приоритет, и все остальные пакеты по умолчанию будут присвоены среднему приоритету, если их приоритет явно не задан. Средние пакеты будут выделять основную часть доступной полосы пропускания, когда они существуют, и ваш triffic будет вытеснен. Когда пакеты с приоритетом в среде не существуют в сети, вашим пакетам будет разрешено использовать доступную пропускную способность.

Ответ 4

Так как я сам этого не пробовал, я могу только указать указатели.

Для обнаружения сетевой активности вы можете попробовать использовать NMAPI или Packet Monitor

WinPCap также имеет портированную библиотеку .Net, но не уверен, что он захватывает трафик http.

Кроме этого, в .Net AFAIK нет библиотек QoS.

Если вы хотите вникать в С++, QoS API может помочь.

Ничто из этого не является излишним и смотрит на ваши комментарии, я не уверен, что это возможно на вашей временной шкале, но это то, что есть. Извините!

Ответ 5

Мышление вне рамки:

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

Ответ 6

Я не уверен, как внедрить его в .NET, но не мог бы вы, например, сделать небольшой тест с обратным временем (RTT) на сервер, и если вам нравится результат, вы вернетесь, вы увеличите загрузку пакета. Если у вас есть "перегрузка" на вашем клиенте, тогда вам, возможно, потребуется немного больше RTT, а затем снизить нагрузку?

Ответ 7

Я бы выбрал решение, в котором вы получаете максимальную скорость загрузки для машины и "опрос" каждые 5 секунд, если приложение не загружается, если есть какой-либо сетевой трафик.

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

Ответ 8

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