「Linux」- 如何突破网络下载限速?

  CREATED BY JENKINSBOT

问题描述

公司的网络限速了,峰值在600KB/s左右。所以啊,下载个900M的系统镜像……emmmmm……

本文将讨论几种方法来”突破“这种限制,更准确的说法是“绕过”。

方法一、多网卡 + HTTP的断点续传

#1 准备3张无线网卡,连接Wi-Fi,配置默认路由

准备三张无线网卡,连接无线,分配IP地址,配置默认路由。

大概要执行如下这些命令。这里简单描述,不探讨太多的细节,根据你的环境可能会有所差异:

#!/bin/sh

systemctl start wpa_supplicant@wlx00e62d0333fc.service wpa_supplicant@wlx00e62d033399.service wpa_supplicant@wlx00e02d0400a6.service

dhclient -v wlx00e62d0333fc
dhclient -v wlx00e62d033399
dhclient -v wlx00e02d0400a6

route add default gw 192.168.1.1 dev wlx00e62d0333fc
route add default gw 192.168.1.1 dev wlx00e62d033399
route add default gw 192.168.1.1 dev wlx00e02d0400a6

到此,硬件已经准备好了,第一步已经完成了。

#2 发送HEAD请求,获取文件大小

发送HTTP中的HEAD方法来获取文件的大小,执行如下命令:

#!/bin/sh

curl -s --head http://mirror.bit.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso \
    | $(which grep) -i -E 'Content-Length:' \
    | awk '{print $2}'

上述命令输出“950009856”,该值是要下载的文件的大小。

我们将文件拆成三部分:“0-316669952”、“316669953-633339904”、“633339905-950009856”。拆成三部分是为了后面的断点续传。

至此,第二步已经完成了。接下来,可以“并行”断点续传了。

#3 执行并行的断点续传

执行如下的三个命令进行断点续传:

	**# curl --interface wlx00e02d0400a6 -o /tmp/p1 --header "Range: bytes=0-316669952" http://mirror.bit.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso**
	**# curl --interface wlx00e62d033399 -o /tmp/p2 --header "Range: bytes=316669953-633339904" http://mirror.bit.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso**
	**# curl --interface wlx00e62d0333fc -o /tmp/p3 --header "Range: bytes=633339905-950009856" http://mirror.bit.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1804.iso**

注意,这三个命令要同时执行(使用“&”后台运行,或者开三个终端,随你便),否则就失去“并行”的意义了,和普通下载没有什么区别了。

#4 合并文件

执行如下命令将三个文件合并在一起:

	**# cat /tmp/p{1..3} > CentOS-7-x86_64-Whatever.iso**

至此,任务就完成了。但通常我们会对文件进行校验,以检测损坏。通过检查文件的sha1sum值是否与官网给出的sha1sum值相同。如果sha1sum值不同,则表示存在问题。

#5 更进一步

这里的“更进一步”指的是脚本封装。这里就不再展开了。

三张无线网卡可以连接不同的无线;也可以是有线和无线混用;并且,既然是断点续传,下载连接可以是不同的源;

如果使用了虚拟机的桥接网络,你可以为虚拟机添加任意多张网卡。emmmmm…,KVM桥接网络了解一下?这个我没有测试过,原理上是行的通的。

# 注意事项

存在局限性
(1)服务端的HTTP服务器必须支持HEAD方法。
(2)准备多张网卡。
(3)如果网络的IP分配是由严格限制的,就表示你的网卡无法随意的加入网络,那么这种方法是无效的。

方法二、网络叠加 + 迅雷

网络叠加,可以将一个40M的宽带和50M的宽带进行叠加,得到一个90M的宽带。关于网络叠加的内容可以参考:

	* [[http://bbs.51cto.com/thread-1479284-1-1.html|有个关于宽带的带宽叠加的问题]]
	* [[https://jingyan.baidu.com/article/1974b289a238d6f4b1f7743c.html|双路由器实现宽带叠加]]
	* [[https://jingyan.baidu.com/article/d45ad148a38dba69552b8088.html|win10 双网 叠加 速度 翻倍]]
	* [[https://blog.csdn.net/ieayoio/article/details/79442899|有线与无线网络叠加提升网速]]

这里就不展开详细介绍了。之所以不进行详细介绍是因为网络叠加的局限性,看如下的一段话:

	It’s just not possible to do that, because routing the packets of one connection to more than one link would break the tcp connection. The receiver would see IP packets with different source IP addresses, and it would drop the packets.

引自「Load balancing using iptables with connmark」。回到我们的问题,使用HTTP协议进行下载时,依旧是TCP/IP网络。如果使用了多链路来路由,只能导致对端丢弃数据包,更本达不到目的。

所以要配合迅雷,迅雷在内部有其自己的协议或和其他方式,或者定位资源后使用其他协议来传输数据(当然这些都是猜测),以此来使用多链路。但它肯定不能违背网络原理。

所以具体的情况还要看网络协议,因此「网络叠加 + 迅雷」并不是一个好的办法。

多说依据:我不知道网络叠加的具体原理,但是很可能是iptables的数据包标记功能实现的负载均衡。

方法三、下载加速器

确实有这种东西,比如axel(1)。但是没有体会到它的效果。我也不是很明白这其中的原理。网络参数自动调优?

12/19/2018 体会到这东西的用处了。在下载FoxitReader的时候,速度只有50KB/s,显然没有达到带宽。使用这东西,创建10个下载连接,最后他会合并下载文件,估计用的也是断点续传吧……

待办事项

# 创建虚拟网卡

-「Make some virtual MAC address

#!/bin/sh

ip link add link eth0 address 00:11:11:11:11:11 eth0.1 type macvlan
ifconfig eth0.1 up
dhclient -v eth0.1

参考文献

HTTP文件断点续传的原理
Load balancing using iptables with connmark
【经验】带宽叠加的5种方法,原理优缺点PK