――Ich habe einen Vertrag für die optische Leitung meines Hauses mit 1 Gbit / s abgeschlossen, aber als ich versuchte, eine große Datei (ISO von Linux) usw. über HTTP herunterzuladen, kam die Geschwindigkeit nicht heraus
$cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 6291456
Von links [min, default, max]
Der maximale Durchsatz ist also
T_{max} = win / RTT
Wenn es sich also um eine einzelne TCP-Verbindung handelt, erfolgt die Kommunikation mit einem Server mit RTT = 30 ms im Standardzustand ~~ Ungefähr 87380 [Byte] * 8/30 [ms] ≒ 23,3 [Mbit / s] nur ~~ In der Tat, ** wenn es keine Überlastung gibt **, wird die Fenstergröße immer größer, so dass es schneller wird.
Natürlich verfügt TCP über eine Fensterskalierungsoption zur Unterstützung von Breitbandnetzwerken. Die Fenstergröße kann auf 1 GByte erweitert werden (es ist nicht bekannt, ob es tatsächlich verwendet wird).
Wenn es theoretisch mehrere Verbindungen gibt und N Leitungen gebündelt sind, ist das Band N-mal
Wget und Curl sind als Werkzeuge bekannt, die über die Befehlszeile verwendet werden können Es gibt aria2 usw., die mehrere Verbindungen verwenden können Verwenden Sie den explosiven Downloader aria2, der um ein Vielfaches schneller ist als curl and wget --Qiita Überlasten Sie den anderen Server nicht, wenn Sie mehrere Verbindungen herstellen
HTTP hat eine Bereichsanforderung RFC 7233 - HTTP / 1.1: Bereichsanforderungen Die Implementierung ist vorerst in populärem Python
In einigen Fällen akzeptiert der Server jedoch keine Bereichskopfzeilen.
Verwenden Sie diese Funktion, um verschiedene Teile einer Datei von mehreren TCP-Verbindungen gleichzeitig anzufordern
Python verfügt über ein Modul namens Selektoren, das ausgewählte Systemaufrufe auf einer höheren Ebene verarbeiten kann (in der Standardbibliothek!). 18.4. Selektoren - Hohe Stufe des E / A-Multiplexing - Python 3.6.1-Dokumentation Überwachen und multiplexen Sie mehrere Steckdosen mit diesem Typen Verwenden Sie so
#Stellen Sie sich eine Verbindung mit zwei TCP-Echoservern vor, A und B.
import selectors
import socket
#Unterlassung
sel = selectors.DefaultSelectors()
sock_A = socket.create_connection(address_A)
sock_B = socket.create_connection(address_B)
sel.resister(sock_A, selectors.EVENT_READ)
sel.resister(sock_B, selectors.EVENT_READ)
sock_B.sendall('Hello'.encode()) # send something to A
sock_B.sendall('Hello'.encode()) # send something to B
while True:
events = sel.select()
for key, mask in events:
message = key.fileobj.recv(512)
print(message.decode())
https://github.com/johejo/rangedl Es gibt immer noch einige Fehler
Umgebung Python 3.6.1
$ pip install git+http://github.com/johejo/rangedl.git
$ rangedl [URL] -n [NUM_OF_CONNECTION] -s [SPLIT_SIZE_MB]
―― Abhängig von der Stimmung der Leitung konnte ich mit etwa 200 Mbit / s herunterladen.
Recommended Posts