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

С# HttpClient медленная скорость загрузки

Я пытаюсь загрузить большие (50 МБ - 32 ГБ) файлы в Google.Drive. Я использую google-api-dotnet, который обеспечивает логику загрузки и поддержку шифрования. Основная проблема - медленная скорость загрузки.

Я просмотрел исходный код api . Каждый файл загружается кусками (я устанавливаю размер блока до 4 МБ). Каждый кусок загружается с помощью нового экземпляра HttpRequestMessage. HttpClient создается после запуска и повторного использования службы api для всех запросов.

Скорость загрузки 600 кбайт/с и стабильная, в то время как моя восходящая линия связи в 10 раз быстрее.

Я захватил трафик с Wireshark: slow-uploading-screenshot Каждый кусок разделен на сотни или тысячи небольших пакетов TLS. И для каждого небольшого пакета TLS ожидается подтверждение. Таким образом, результирующая скорость очень низкая.

Но когда я запускаю прокси Fiddler, скорость становится такой же быстрой, как моя uplink. Пакеты TLS идут очень быстро параллельно, и подтверждения принимаются позже: tls-packets-first-screenshottcp-ack-later

Я попробовал свой код на 5 ПК с Win7, и все показали такую ​​же низкую скорость загрузки. Но когда я попытался на ПК Win10, скорость была очень хорошей. Также я попробовал клиентское приложение Google.Drive, и у него были такие же проблемы со скоростью. Я попытался найти это поведение, но ничего не нашел.

  • Почему 4 МБ фрагментов разделены на 4 КБ TLS-пакетов? Могу ли я увеличить размер пакетов TLS?
  • Как я могу отправить пакеты TLS параллельно, как это делает Fiddler?
  • Или существуют другие способы увеличения скорости загрузки?
4b9b3361

Ответ 1

Вполне возможно, что проблема заключается в ссылке google, а не в другом. Я загрузил вещи на Google Drive с хром, и кроме того, моя ссылка для загрузки - гигантская (50 Мбит/с), Google кажется ограниченной.

Ответ 2

Максимальный размер записи составляет 16 КБ для SSLv3/TLSv1, поэтому, возможно, вы рукопожаете со старой версией. Я думаю, что google оптимизирован для пользователя SPDY/HTTP2 protocole, который может отправлять параллельно в том же соединении. Возможно, ваш клиент не...

Как сделать .net HttpClient использовать http 2.0?