Android HttpClient文件下载
临近上线,运维布置了测试、预发布、正式环境,几乎常见的下载方式都碰上了,踩过一个又一个坑,闲下来总结一下吧。这里用的是android-async-http
1. 基础概念
1.1 域名、DNS
域名即我们常说的网址前半部分,因为服务器IP地址难记而出的解决方案。我们发起一个请求时,首先就要把域名转换成对应的ip地址。这一步能做很多文章,因为这个对应关系是可被篡改的。比如
- 我们现有的所有操作系统,其找这个对应关系的优先级首先都是找本地hosts文件(windows路径是
C:\Windows\System32\drivers\etc\hosts
,其他基本为/etc/hosts
),基于此我们就可以简单的在文件里配置一些好记的域名映射到我们的内部服务器,比如package.xxx.top
build.client.com
download.client.com
- 如果在
hosts
里没找到映射关系,下一步就该去问我们配置的dns服务器了,手机wifi、电脑、路由器只要改成手动获取IP,基本都可以设置这个服务器地址。像我们内网有非技术时,搭建一个DNS服务器来做上面的自定义域名映射就很有必要 - 全世界这么多域名,买了一个或者修改了映射怎么告知其他所有人我这域名是对应哪个IP呢,这就有我们说的9个根服务器,我们去dns服务器找映射时,如果它在本地缓存没有,那就会去它上级dns找,上级也没有就继续往上,一直到根服务器。我们在阿里云或万网买了或修改了域名映射的IP后,基本都会上报更新到根服务器或某级DNS服务器,然后才能看到改变。
- 全球通网的多了之后,就会发现不同地区访问某台服务器会太卡了,这时域名商就想出了个法子,叫CDN(内容分发网络)。你们不都是要来问域名商这个域名是到哪个IP吗?它就看你是哪个地区的,返回给你个近点的IP,这个IP是域名商自己的服务器,它把你服务器的资源缓存起来了。别人来请求的时候,第一次它找不到,会去你自己的实际服务器(称之为源站)要(这过程称之为回源),第一次之后它就会缓存起来,下次再请求就直接给缓存了。所以开了CDN的第一次访问下载慢是正常的
1.2 HTTPS
HTTP是明文传输的,随着对安全性的需求越来越高,现在网站基本都开始使用起HTTPS了。HTTPS是在HTTP基础上,加了TLS/SSL协议进行加密传输。客户端从DNS服务器或hosts拿到服务器IP后,建立连接三次握手时,服务器会返回域名的证书给客户端,客户端能从中解析出证书链,看其根证书是否为内置的可信组织颁发且未过期,客户端校验后发送自己公钥给服务器,之后传输用非对称加密,即彼此以自己的私钥加密,对方用握手接受到的公钥进行解密。加解密算法也是在握手时协商随机确定。
目前微信小游戏和