2015-11-22 15 views
20

Próbuję przesłać duże pliki (50 MB - 32 GB) do Google.Drive. Używam google-api-dotnet, która zapewnia logikę przesyłania i obsługę szyfrowania. Głównym problemem jest powolna prędkość przesyłania.C# HttpClient wolna prędkość przesyłania

Przejrzałem api source code. Każdy plik jest przesyłany przez porcje (ustawiłem rozmiar porcji na 4 MB) Każdy fragment jest przesyłany za pośrednictwem nowej instancji HttpRequestMessage. HttpClient jest tworzony po uruchomieniu usługi APi i ponownym użyciu dla wszystkich żądań.

Prędkość wysyłania wynosi 600 kilobajtów/si stabilna, podczas gdy moje łącze wysyłające jest 10 razy szybsze.

Przechwyciłem ruch z Wireshark: slow-uploading-screenshot Każda porcja jest podzielona na setki lub tysiące małych pakietów TLS. Dla każdego małego pakietu TLS spodziewane jest potwierdzenie. Tak więc uzyskana prędkość jest bardzo niska.

Ale kiedy zaczynam proxy Fiddlera, prędkość staje się tak szybka, jak może to zrobić moje łącze wysyłające. TLS pakiety które bardzo szybko się równolegle, zaś zatwierdzenia są odbierane później: tls-packets-first-screenshot tcp-ack-later

Próbowałem mój kod na 5 komputerach PC z Win7 i wszystkie wykazały podobną małą prędkość wysyłania. Ale kiedy próbowałem na Win10 PC - szybkość była bardzo dobra. Próbowałem również aplikacji klienta Google.Drive i miał takie same problemy z prędkością. Próbowałem przeszukać to zachowanie, ale niczego nie znalazłem.

  1. Dlaczego 4 MB porcji jest podzielone na 4 KB TLS? Czy mogę zwiększyć rozmiar pakietów TLS?
  2. Jak mogę ustawić wysyłanie pakietów TLS równolegle, tak jak robi to Skrzypek?
  3. A może istnieją inne metody zwiększania szybkości wysyłania?
+0

Zastanawiam się, czy jest to wariant problemu opisanego na stronie https://ask.wireshark.org/questions/38768/slow-upload-speed-from-windows-stations-to-ssl-hosts, które niektóre programy (Fiddler) działa, ale nie używasz HttpClient. –

+0

Chciałbym spróbować https://github.com/Redth/HttpTwo –

+0

Mam do czynienia z tym samym problemem. Czy znalazłeś jakieś obejście tego problemu? – Mayuresh

Odpowiedz

0

Maksymalny rozmiar rekordu to 16kB dla SSLv3/TLSv1, więc być może uzgadnisz ze starszą wersją. Myślę, że Google jest zoptymalizowany pod kątem protokołu użytkownika SPDY/HTTP2, który może wysyłać równolegle w tym samym połączeniu. Może twój klient nie ...

How to make the .net HttpClient use http 2.0?

1

Jest bardzo możliwe, że problem jest link google, a nie cokolwiek innego. Zostałem załadowany do google drive z chrome, a poza tym mój link do przesyłania jest gigantyczny (50mbps), Google wydaje się ograniczony.