欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识
原文出处: bang

一般开拓一个 APP,会直接挪用系统提供的网络请求接口去处事端请求数据,再针对返回的数据举办一些处理惩罚,可能利用AFNetworking/OKHttp这样的网络库,打点好请求线程和行列,再自动做一些数据理会,就竣事了。

但对付一些大型 APP,还会想针对网络的一些问题举办进一步优化,包罗:

  1. 速度:网络请求的速度奈何能进一步晋升?
  2. 弱网:移动端网络情况随时变革,常常呈现网络毗连很不不变可用性差的环境,奈何在这种环境下最大限度最快地乐成请求?
  3. 安详:奈何防备被第三方窃听/改动或假充,防备运营商挟制,同时又不影响机能?

对基于欣赏器的前端开拓来说,网络这块能做的工作很少,但对付客户端 APP 来说,整个网络请求进程是自由节制的,可以做许多工作,许多大型 APP 都针对这三个问题做了许多网络层的优化,一些新的网络层协议像 HTTP2 / QUIC 也是在这些方面举办了不少优化,在这里边进修边整理,大抵罗列一下常见的做法。

速度

正常一条网络请求需要颠末的流程是这样:

  1. DNS 理会,请求DNS处事器,获取域名对应的 IP 地点。
  2. 与处事端成立毗连,包罗 tcp 三次握手,安详协议同步流程。
  3. 毗连成立完成,发送和吸收数据,解码数据。

这里有明明的三个优化点:

  1. 直接利用 IP 地点,去除 DNS 理会步调。
  2. 不要每次请求都从头成立毗连,复用毗连或一直利用同一条毗连(长毗连)。
  3. 压缩数据,减小传输的数据巨细。

逐条来看能做什么。

1.DNS

DNS 完整的理会流程很长,会先从当地系统缓存取,若没有就到最近的 DNS 处事器取,若没有再到主域名处事器取,每一层都有缓存,但为了域名理会的及时性,每一层缓存都有逾期时间,这种 DNS 理会机制有几个缺点:

  1. 缓存时间配置得长,域名更新不实时,配置得短,大量 DNS 理会请求影响请求速度。
  2. 域名挟制,容易被中间人进攻,或被运营商挟制,把域名理会到第三方 IP 地点,据统计挟制率会到达7%。
  3. DNS 理会进程不受节制,无法担保理会到最快的IP
  4. 一次请求只能理会一个域名。

为了办理这些问题,就有了 HTTPDNS,道理很简朴,就是本身做域名理会的事情,通过 HTTP 请求靠山去拿到域名对应的 IP 地点,直接办理上述所有问题:

  1. 域名理会与请求疏散,所有请求都直接用IP地点,无需 DNS 理会,APP 按时请求 HTTPDNS 处事器更新IP地点即可。
  2. 通过签名等方法,担保 HTTPDNS 请求的安详,制止被挟制。
  3. DNS 理会由本身节制,可以确保按照用户地址地返回就近的 IP 地点,或按照客户端测速功效利用速度最快的 IP。
  4. 一次请求可以理会多个域名。

其余细节就不多说了,HTTPDNS 利益这么多,险些成为中大型 APP 的标配。至此办理了第一个问题 — DNS 理会耗时的问题,顺便把一部门安详问题 — DNS 挟制也办理了。

2.毗连

第二个问题,毗连成立耗时的问题,这里主要的优化思路是复用毗连,不消每次请求都从头成立毗连,如何更有效率地复用毗连,可以说是网络请求速度优化里最主要的点了,而且这里的优化仍在演进进程中,值得相识下。

keep-alive

HTTP 协议里有个 keep-alive,HTTP1.1默认开启,必然水平上缓解了每次请求都要举办TCP三次握手成立毗连的耗时。道理是请求完成后不当即释放毗连,而是放入毗连池中,若这时有另一个请求要发出,请求的域名和端口是一样的,就直接拿出毗连池中的毗连举办发送和吸收数据,少了成立毗连的耗时。

实际上此刻无论是客户端照旧欣赏器都默认开启了keep-alive,对同个域名不会再有每发一个请求就举办一次建连的环境,纯短毗连已经不存在了。但有个问题,就是这个 keep-alive 的毗连一次只能发送吸收一个请求,在上一个请求处理惩罚完成之前,劳务派遣管理系统,无法接管新的请求。若同时提倡多个请求,就有两种环境:

  1. 若串行发送请求,可以一直复用一个毗连,但速度很慢,每个请求都要期待上个请求完成再举办发送。
  2. 若并行发送这些请求,那么首次每个请求都要举办tcp三次握手成立新的毗连,固然第二次可以复用毗连池里这堆毗连,但若毗连池里保持的毗连过多,对处事端资源发生较大挥霍,若限制了保持的毗连数,并行请求里超出的毗连仍每次要建连。

对这个问题,新一代协议 HTTP2 提出了多路复用去办理。

多路复用