问题描述
公司的网络限速了,峰值在600KB/s左右。所以啊,下载个900M的系统镜像……emmmmm……
本文将讨论几种方法来”突破“这种限制,更准确的说法是“绕过”。
方法一、多网卡 + HTTP的断点续传
#1 准备3张无线网卡,连接Wi-Fi,配置默认路由
准备三张无线网卡,连接无线,分配IP地址,配置默认路由。
大概要执行如下这些命令。这里简单描述,不探讨太多的细节,根据你的环境可能会有所差异:
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的宽带。关于网络叠加的内容可以参考:
1)有个关于宽带的带宽叠加的问题
2)双路由器实现宽带叠加
3)win10 双网 叠加 速度 翻倍
4)有线与无线网络叠加提升网速
这里就不展开详细介绍了。之所以不进行详细介绍是因为网络叠加的局限性,看如下的一段话:
引自「Load balancing using iptables with connmark」。回到我们的问题,使用HTTP协议进行下载时,依旧是TCP/IP网络。如果使用了多链路来路由,只能导致对端丢弃数据包,更本达不到目的。
所以要配合迅雷,迅雷在内部有其自己的协议或和其他方式,或者定位资源后使用其他协议来传输数据(当然这些都是猜测),以此来使用多链路。但它肯定不能违背网络原理。
所以具体的情况还要看网络协议,因此「网络叠加 + 迅雷」并不是一个好的办法。
多说依据:我不知道网络叠加的具体原理,但是很可能是iptables的数据包标记功能实现的负载均衡。
方法三、下载加速器
确实有这种东西,比如axel(1)。但是没有体会到它的效果。我也不是很明白这其中的原理。网络参数自动调优?
12/19/2018 体会到这东西的用处了。在下载FoxitReader的时候,速度只有50KB/s,显然没有达到带宽。使用这东西,创建10个下载连接,最后他会合并下载文件,估计用的也是断点续传吧……
待办事项
创建虚拟网卡
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