下载没看上去这么简单
下载没看上去这么简单 动机 如今,我们实际上并不关心网络下载的内部结构或细节。大多数情况下,我们单击浏览器上的链接并等待进度条完成。 如果我们觉得下载时间太长,通常是以太网速度受到指责。但是,我们从未想过该进度条下方使用的协议。即使对于实际需要实现某种下载代码的程序员,每种语言也总是有高级库。需要HTTPS吗?在您的 URL 前添加 https://,想要多个连接?轻触那个开关,库会为你做所有肮脏的工作。 好吧,直到最近,我也是这些人中的一员。在工作中,我们需要为一个大项目下载数百个依赖项。由于开发速度很快,每个人每天至少需要更新一次。由于依赖项的数量庞大且每个项的发布频率很高,同事抱怨公司聊天室的更新时间过长并不是一个不寻常的景象。我应该调查为什么它需要这么长时间并尝试优化。 现在我们不想更换基础设施,所以如果有的话,所有的优化都会发生在软件方面。使用的下载模式为HTTPS+并行下载。所以通常情况下,我对下载模型性能的不同组合进行了一些测试,我将在下面尝试重新创建。 TCP/IP 模型有四层:链路层、互联网层、传输层和应用层。但是由于我们不希望对基础架构进行任何更改,因此三个低级别层不在考虑范围中。对于应用层,我们可以控制 SSL 和并行/串行下载。 测试环境搭建 对于服务器,我使用我的一台笔记本电脑和 Apache 网络服务器。 首先,我们需要为我们的服务器启用 https。 通常情况下,ssl 证书的价格为数百美元。 但是为了测试,我们将使用自定义的 openssl。 笔记本电脑安装的ArchLinux自带了 openssl。 要生成证书,请运行 openssl req -new -x509 -nodes -out /srv/http/ssl.crt -keyout /srv/http/ssl.key -days 365 是的,我们将密钥和证书都存储在服务器根目录中,但这不是生产环境,只是为了测试。 之后我们将会删除这个目录。 在/etc/httpd/conf/httpd.conf里取消注释这些行之后: LoadModule ssl_module modules/mod_ssl.so LoadModule socache_shmcb_module modules/mod_socache_shmcb.so Include conf/extra/httpd-ssl.conf 在/etc/httpd/conf/extra/httpd-ssl.conf里增加 SSLCertificateFile和SSLCertificateKeyFile的配置, 服务器就已经准备好相应HTTPS和HTTP的请求了。 对于相关的测试文件,我们将使用一些生成的文件。 为了生成这些文件,我编写了这个方便的脚本: #!/bin/bash for ((i=0; i<=$3; i++)) do dd if=/dev/zero of=$1$i.img bs=1024 count=0 seek=$2 done ./dd_create.sh large 10000 100 将会生成100个大小为10000KB的文件,命名为: large1.img, large2.img … 在我运行 ./dd_create.sh small 1 100 和 ./dd_create.sh large 10000 100 后我就有了100个1KB和100个9.8MB的文件,我们可以开始测试了! ...