――J'ai fait un contrat pour la ligne optique de ma maison à 1 Gbps, mais quand j'ai essayé de télécharger un gros fichier (ISO de Linux) etc. par HTTP, la vitesse n'est pas sortie
--Il existe une limite au débit qui peut être généré avec une seule connexion TCP. --Comment vérifier ~~ Taille de la fenêtre de réception TCP ~~ pour Linux (pour être exact, la taille du tampon du noyau)
$cat /proc/sys/net/ipv4/tcp_rmem
4096 87380 6291456
À partir de la gauche [min, default, max]
Ainsi, le débit maximum est
T_{max} = win / RTT
Par conséquent, s'il s'agit d'une connexion TCP unique, la communication avec un serveur avec RTT = 30ms dans l'état par défaut ~~ Environ 87380 [octets] * 8/30 [ms] ≒ 23,3 [Mbps] uniquement ~~ En fait, ** s'il n'y a pas de congestion **, la taille de la fenêtre deviendra de plus en plus grande, donc elle sera plus rapide.
Bien sûr, TCP a une option à l'échelle de la fenêtre pour prendre en charge les réseaux à large bande. La taille de la fenêtre peut être étendue jusqu'à 1 Go (on ne sait pas si elle est réellement utilisée)
En théorie, s'il y a plusieurs connexions, la bande sera N fois plus grande que N faisceaux.
Wget et curl sont connus comme des outils qui peuvent être utilisés à partir de la ligne de commande Il y a aria2 etc. qui peuvent utiliser plusieurs connexions Utilisez le téléchargeur explosif aria2, qui est plusieurs fois plus rapide que curl et wget --Qiita Lors de l'établissement de plusieurs connexions, ne surchargez pas l'autre serveur
HTTP a une requête de plage RFC 7233 - HTTP / 1.1: Requêtes de plage La mise en œuvre est en Python populaire pour le moment
--Par exemple, supposons que vous demandiez un fichier de 1000 octets --Lors de l'envoi d'une requête GET avec 'Range: bytes = 0-499' dans l'en-tête, --Add'Content-Range: octets 0-499 / 1000 'à l'en-tête de réponse et ne renvoie que les 500 premiers octets du fichier dans le corps.
Cependant, dans certains cas, le serveur n'accepte pas les en-têtes Range.
Utilisez cette fonctionnalité pour demander différentes parties d'un fichier à partir de plusieurs connexions TCP en même temps
Python a un module appelé sélecteurs qui peut gérer certains appels système à un niveau supérieur (dans la bibliothèque standard!) 18.4. Sélecteurs - Haut niveau de multiplexage d'E / S - Documentation Python 3.6.1 Surveillez et multiplexez plusieurs prises avec ce gars Utilisez comme ça
#Imaginez une connexion avec deux serveurs d'écho TCP, A et B
import selectors
import socket
#Omission
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 Il y a encore quelques bugs
Environnement Python 3.6.1
$ pip install git+http://github.com/johejo/rangedl.git
$ rangedl [URL] -n [NUM_OF_CONNECTION] -s [SPLIT_SIZE_MB]
――Selon l'humeur de la ligne, j'ai pu télécharger à environ 200 Mbps. --Lorsque split_size est défini sur 1 Mo, l'utilisation de la mémoire est d'environ 30 à 80 Mo. Est-il inévitable que l'utilisation du processeur soit élevée ...
Recommended Posts