移动 APP 网络优化概述
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz/QbziaGpwWGoaVEx8JZTD5r7JtXsQUZ1ZalSyibxgo9RfTwZoZicFSj4kKooADsLRuHw0ibXM0Or5hibAhwrtjP8QF8Q/640?wx_fmt=gif&tp=webp&wxfrom=5&wx_lazy=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">通常</span><span style="color: black;">研发</span>一个 APP,会直接调用系统<span style="color: black;">供给</span>的网络请求接口去服务端请求数据,再针对返回的数据进行<span style="color: black;">有些</span>处理,<span style="color: black;">或</span><span style="color: black;">运用</span>AFNetworking/OKHttp<span style="color: black;">这般</span>的网络库,管理好请求线程和队列,再自动做<span style="color: black;">有些</span>数据解析,就结束了。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">但<span style="color: black;">针对</span><span style="color: black;">有些</span>大型 APP,还会想针对网络的<span style="color: black;">有些</span>问题进行进一步优化,<span style="color: black;">包含</span>:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">速度:</strong>网络请求的速度<span style="color: black;">怎么样</span>能进一步<span style="color: black;">提高</span>?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">弱网:</strong>移动端网络环境随时变化,经常<span style="color: black;">显现</span>网络连接很不稳定可用性差的<span style="color: black;">状况</span>,<span style="color: black;">怎么样</span>在这种<span style="color: black;">状况</span>下最大限度最快地成功请求?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">安全:</strong><span style="color: black;">怎么样</span>防止被第三方窃听/篡改或冒充,防止运营商劫持,<span style="color: black;">同期</span>又不影响性能?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">对基于浏览器的前端<span style="color: black;">研发</span><span style="color: black;">来讲</span>,网络这块能做的事情很少,但<span style="color: black;">针对</span>客户端 APP <span style="color: black;">来讲</span>,<span style="color: black;">全部</span>网络请求过程是自由<span style="color: black;">掌控</span>的,<span style="color: black;">能够</span>做<span style="color: black;">非常多</span>事情,<span style="color: black;">非常多</span>大型 APP 都针对这三个问题做了<span style="color: black;">非常多</span>网络层的优化,<span style="color: black;">有些</span>新的网络层协议像 HTTP2 / QUIC <span style="color: black;">亦</span>是在这些方面进行了不少优化,在<span style="color: black;">这儿</span>边学习边整理,大致列举一下<span style="color: black;">平常</span>的做法。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">速度</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">正常一条网络请求需要经过的流程是<span style="color: black;">这般</span>:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">DNS 解析,请求DNS服务器,获取域名对应的 IP <span style="color: black;">位置</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">与服务端<span style="color: black;">创立</span>连接,<span style="color: black;">包含</span> tcp 三次握手,安全协议同步流程。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">连接<span style="color: black;">创立</span>完成,发送和接收数据,解码数据。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">这儿</span>有<span style="color: black;">显著</span>的三个优化点:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">直接<span style="color: black;">运用</span> IP <span style="color: black;">位置</span>,去除 DNS 解析<span style="color: black;">过程</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">不要每次请求都重新<span style="color: black;">创立</span>连接,复用连接或<span style="color: black;">始终</span><span style="color: black;">运用</span>同一条连接(长连接)。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">压缩数据,减小传输的数据<span style="color: black;">体积</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">逐条来看能做什么。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">1.DNS</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">DNS 完整的解析流程很长,会先从本地系统缓存取,若<span style="color: black;">无</span>就到<span style="color: black;">近期</span>的 DNS 服务器取,若<span style="color: black;">无</span>再到主域名服务器取,每一层都有缓存,但为了域名解析的实时性,每一层缓存都有过期时间,这种 DNS 解析机制有几个缺点:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">缓存时间设置得长,域名更新不<span style="color: black;">即时</span>,设置得短,<span style="color: black;">海量</span> DNS 解析请求影响请求速度。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">域名劫持,容易被中间人攻击,或被运营商劫持,把域名解析到第三方 IP <span style="color: black;">位置</span>,据统计劫持率会达到7%。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">DNS 解析过程不受<span style="color: black;">掌控</span>,<span style="color: black;">没法</span><span style="color: black;">保准</span>解析到最快的IP</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">一次请求只能解析一个域名。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">为<span style="color: black;">认识</span>决这些问题,就有了 HTTPDNS,原理很简单,<span style="color: black;">便是</span>自己做域名解析的工作,<span style="color: black;">经过</span> HTTP 请求后台去拿到域名对应的 IP <span style="color: black;">位置</span>,直接<span style="color: black;">处理</span><span style="color: black;">以上</span>所有问题:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">域名解析与请求分离,所有请求都直接用IP<span style="color: black;">位置</span>,无需 DNS 解析,APP <span style="color: black;">按时</span>请求 HTTPDNS 服务器更新IP<span style="color: black;">位置</span><span style="color: black;">就可</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">经过</span>签名等方式,<span style="color: black;">保准</span> HTTPDNS 请求的安全,避免被劫持。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">DNS 解析由自己<span style="color: black;">掌控</span>,<span style="color: black;">能够</span><span style="color: black;">保证</span><span style="color: black;">按照</span>用户所在地返回就近的 IP <span style="color: black;">位置</span>,或<span style="color: black;">按照</span>客户端测速结果<span style="color: black;">运用</span>速度最快的 IP。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">一次请求<span style="color: black;">能够</span>解析多个域名。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">其余细节就不多说了,HTTPDNS 优点这么多,几乎<span style="color: black;">作为</span>中大型 APP 的标配。至此<span style="color: black;">处理</span>了<span style="color: black;">第1</span>个问题 — DNS 解析耗时的问题,顺便把一部分安全问题 — DNS 劫持<span style="color: black;">亦</span><span style="color: black;">处理</span>了。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">2.连接</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">第二个问题,连接<span style="color: black;">创立</span>耗时的问题,<span style="color: black;">这儿</span><span style="color: black;">重点</span>的优化思路是复用连接,<span style="color: black;">不消</span>每次请求都重新<span style="color: black;">创立</span>连接,<span style="color: black;">怎样</span>更有效率地复用连接,<span style="color: black;">能够</span>说是网络请求速度优化里最<span style="color: black;">重点</span>的点了,并且<span style="color: black;">这儿</span>的优化仍在演进过程中,值得<span style="color: black;">认识</span>下。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">keep-alive</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">HTTP 协议里有个 keep-alive,HTTP1.1默认开启,<span style="color: black;">必定</span>程度上缓解了每次请求都要进行TCP三次握手<span style="color: black;">创立</span>连接的耗时。原理是请求完成后不立即释放连接,而是放入连接池中,若<span style="color: black;">此时</span>有另一个请求要发出,请求的域名和端口是<span style="color: black;">同样</span>的,就直接拿出连接池中的连接进行发送和接收数据,少了<span style="color: black;">创立</span>连接的耗时。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">实质</span>上<span style="color: black;">此刻</span>无论是客户端还是浏览器都默认开启了keep-alive,对同个域名不会再有每发一个请求就进行一次建连的<span style="color: black;">状况</span>,纯短连接<span style="color: black;">已然</span>不存在了。但有个问题,<span style="color: black;">便是</span>这个 keep-alive 的连接一次只能发送接收一个请求,在上一个请求处理完成之前,<span style="color: black;">没法</span>接受新的请求。若<span style="color: black;">同期</span>发起多个请求,就有两种<span style="color: black;">状况</span>:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">若串行发送请求,<span style="color: black;">能够</span><span style="color: black;">始终</span>复用一个连接,但速度很慢,<span style="color: black;">每一个</span>请求都要等待上个请求完成再进行发送。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">若并行发送这些请求,<span style="color: black;">那样</span>首次<span style="color: black;">每一个</span>请求都要进行tcp三次握手<span style="color: black;">创立</span>新的连接,虽然第二次<span style="color: black;">能够</span>复用连接池里这堆连接,但若连接池里保持的连接<span style="color: black;">太多</span>,对服务端资源产生<span style="color: black;">很强</span>浪费,若限制了保持的连接数,并行请求里超出的连接仍每次要建连。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">对这个问题,新一代协议 HTTP2 提出了多路复用去<span style="color: black;">处理</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">多路复用</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">HTTP2 的多路复用机制<span style="color: black;">同样</span>是复用连接,但它复用的这条连接支持<span style="color: black;">同期</span>处理多条请求,所有请求都<span style="color: black;">能够</span>并发在这条连接上进行,<span style="color: black;">亦</span>就<span style="color: black;">处理</span>了上面说的并发请求需要<span style="color: black;">创立</span>多条连接带来的问题,网络上有张图<span style="color: black;">能够</span>较形象地表现这个过程:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/QbziaGpwWGobPNZKnww4afjToTicc64ymZfg7Zp7DicibbEjXZdia22fBAx2A2IqzzycMDRfyC7bbLIibbVwbU6faAVw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">HTTP1.1的协议里,在一个连接里传送数据都是串行<span style="color: black;">次序</span>传送的,必须等上一个请求<span style="color: black;">所有</span>处理完后,下一个请求<span style="color: black;">才可</span>进行处理,<span style="color: black;">引起</span>这些请求<span style="color: black;">时期</span>这条连接并不是满带宽传输的,即使是HTTP1.1的pipelining<span style="color: black;">能够</span><span style="color: black;">同期</span>发送多个request,但response仍是按请求的<span style="color: black;">次序</span>串行返回,只要其中一个请求的response稍微大一点或<span style="color: black;">出现</span>错误,就会阻塞住后面的请求。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">HTTP2 <span style="color: black;">这儿</span>的多路复用协议<span style="color: black;">处理</span>了这些问题,它把在连接里传输的数据都封装成一个个stream,<span style="color: black;">每一个</span>stream都有标识,stream的发送和接收<span style="color: black;">能够</span>是乱序的,不依赖<span style="color: black;">次序</span>,<span style="color: black;">亦</span>就不会有阻塞的问题,接收端<span style="color: black;">能够</span><span style="color: black;">按照</span>stream的标识去区分属于哪个请求,再进行数据拼接,得到<span style="color: black;">最后</span>数据。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">解释下多路复用这个词,多路<span style="color: black;">能够</span>认为是多个连接,多个操作,复用<span style="color: black;">便是</span>字面上的意思,复用一条连接或一个线程。HTTP2<span style="color: black;">这儿</span>是连接的多路复用,网络<span style="color: black;">关联</span>的还有一个I/O的多路复用(select/epoll),指<span style="color: black;">经过</span>事件驱动的方式让多个网络请求返回的数据在同一条线程里完成读写。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">客户端<span style="color: black;">来讲</span>,iOS9 以上 NSURLSession 原生支持 HTTP2,只要服务端<span style="color: black;">亦</span>支持就<span style="color: black;">能够</span>直接<span style="color: black;">运用</span>,Android 的 okhttp3 以上<span style="color: black;">亦</span>支持了 HTTP2,国内<span style="color: black;">有些</span>大型 APP 会自建网络层,支持 HTTP2 的多路复用,避免系统的限制以及<span style="color: black;">按照</span><span style="color: black;">自己</span>业务需要<span style="color: black;">增多</span><span style="color: black;">有些</span>特性,例如<span style="color: black;">微X</span>的开源网络库 mars(https://github.com/Tencent/mars/wiki),做到一条长连接处理<span style="color: black;">微X</span>上的大部分请求,多路复用的特性上基本跟 HTTP2 一致。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">TCP队头阻塞</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">HTTP2 的多路复用看起来是完美的<span style="color: black;">处理</span><span style="color: black;">方法</span>,但还有个问题,<span style="color: black;">便是</span>队头阻塞,这是受限于 TCP 协议,TCP 协议为了<span style="color: black;">保准</span>数据的<span style="color: black;">靠谱</span>性,若传输过程中一个 TCP 包丢失,会等待这个包重传后,才会处理后续的包。HTTP2的多路复用让所有请求都在同一条连接进行,中间有一个包丢失,就会阻塞等待重传,所有请求<span style="color: black;">亦</span>就被阻塞了。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">针对</span>这个问题不改变 TCP 协议就<span style="color: black;">没法</span>优化,但 TCP 协议依赖操作系统实现以及部分硬件的定制,改进缓慢,于是 GOOGLE 提出 QUIC 协议,相当于在 UDP 协议之上再定义一套<span style="color: black;">靠谱</span>传输协议,<span style="color: black;">处理</span> TCP 的<span style="color: black;">有些</span>缺陷,<span style="color: black;">包含</span>队头阻塞。<span style="color: black;">详细</span><span style="color: black;">处理</span>原理网上资料较多,<span style="color: black;">能够</span><span style="color: black;">瞧瞧</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">QUIC <span style="color: black;">处在</span>起步<span style="color: black;">周期</span>,少有客户端接入,QUIC 协议相<span style="color: black;">针对</span> HTTP2 最大的<span style="color: black;">优良</span>是对TCP队头阻塞的<span style="color: black;">处理</span>,其他的像安全握手 0RTT / 证书压缩等优化 TLS1.3 已跟进,<span style="color: black;">能够</span>用于 HTTP2,并不是独有特性。TCP 队头阻塞在 HTTP2 上对性能的影响有多大,在速度上 QUIC 能带来多大<span style="color: black;">提高</span>待<span style="color: black;">科研</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">3.数据</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">第三个问题,传输数据<span style="color: black;">体积</span>的问题。数据对请求速度的影响分两方面,一是压缩率,二是解压序列化反序列化的速度。<span style="color: black;">日前</span>最流行的两种数据格式是 json 和 protobuf,json 是字符串,protobuf 是二进制,即<span style="color: black;">运用</span><span style="color: black;">各样</span>压缩算法压缩后,protobuf 仍会比 json 小,数据量上 protobuf 有<span style="color: black;">优良</span>,序列化速度 protobuf <span style="color: black;">亦</span>有<span style="color: black;">有些</span><span style="color: black;">优良</span>,这两者的对比就不细说了。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">压缩算法多种多样,<span style="color: black;">亦</span>在<span style="color: black;">持续</span>演进,最新出的 Brotli 和Z-standard实现了更高的压缩率,Z-standard <span style="color: black;">能够</span><span style="color: black;">按照</span>业务数据样本训练出适合的字典,进一步<span style="color: black;">加强</span>压缩率,<span style="color: black;">日前</span>压缩率表现最好的算法。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">除了传输的 body 数据,<span style="color: black;">每一个</span>请求 HTTP 协议头的数据<span style="color: black;">亦</span>是不可<span style="color: black;">忽略</span>,HTTP2 里对 HTTP 协议头<span style="color: black;">亦</span>进行了压缩,HTTP 头大<span style="color: black;">大都是</span>重复数据,固定的字段如 method <span style="color: black;">能够</span>用静态字典,不固定但多个请求重复的字段例如 cookie 用动态字典,<span style="color: black;">能够</span>达到非常高的压缩率,<span style="color: black;">这儿</span>有<span style="color: black;">仔细</span>介绍。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">经过</span> HTTPDNS,连接多路复用,更好的数据压缩算法,<span style="color: black;">能够</span>把网络请求的速度优化到较不错的程度了,接下来再<span style="color: black;">瞧瞧</span>弱网和安全上<span style="color: black;">能够</span>做的事情。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">弱网</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">手机无线网络环境不稳定,针对弱网的优化,<span style="color: black;">微X</span>有较多实践和分享,<span style="color: black;">包含</span>:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">1.<span style="color: black;">提高</span>连接成功率</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">复合连接,<span style="color: black;">创立</span>连接时,阶梯式并发连接,其中一条连通后其他连接都关闭。这个<span style="color: black;">方法</span>结合串行和并发的<span style="color: black;">优良</span>,<span style="color: black;">加强</span>弱网下的连接成功率,<span style="color: black;">同期</span>又不会<span style="color: black;">增多</span>服务器资源消耗:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><img src="https://mmbiz.qpic.cn/mmbiz_png/QbziaGpwWGobPNZKnww4afjToTicc64ymZlpFMUn9hURLe6UbpFGFF7BQmjfPpfBZopE7n54N5iafEic43DUnEfqQQ/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">2.制定最合适的超时时间</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">对总读写超时(从请求到响应的超时)、首包超时、包包超时(两个数据段之间的超时)时间制定<span style="color: black;">区别</span>的计算<span style="color: black;">方法</span>,加快对超时的判断,减少等待时间,尽早重试。<span style="color: black;">这儿</span>的超时时间还<span style="color: black;">能够</span><span style="color: black;">按照</span>网络状态动态设定。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">3.调优TCP参数,<span style="color: black;">运用</span>TCP优化算法。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">对服务端的TCP协议参数进行调优,以及开启<span style="color: black;">各样</span>优化算法,使得适合业务特性和移动端网络环境,<span style="color: black;">包含</span>RTO初始值,混合慢<span style="color: black;">起步</span>,TLP,F-RTO等。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">针对弱网的这些细致优化未<span style="color: black;">作为</span>标准,系统网络库<span style="color: black;">无</span>内置,<span style="color: black;">不外</span>前两个客户端优化<span style="color: black;">微X</span>的开源网络库 mars 有实现,若有需要<span style="color: black;">能够</span><span style="color: black;">运用</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">安全</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">标准协议 TLS <span style="color: black;">保准</span>了网络传输的安全,前身是 SSL,<span style="color: black;">持续</span>在演进,<span style="color: black;">日前</span>最新是 TLS1.3。<span style="color: black;">平常</span>的 HTTPS <span style="color: black;">便是</span> HTTP 协议加上 TLS 安全协议。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">安全协议概括性地说<span style="color: black;">处理</span>两个问题:1.<span style="color: black;">保准</span>安全 2. 降低加密成本</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在<span style="color: black;">保准</span>安全上:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">运用</span>加密算法组合对传输数据加密,避免被窃听和篡改。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">认证对方身份,避免被第三方冒充。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">加密算法保持灵活可更新,防止定死算法被破解后<span style="color: black;">没法</span>更换,禁用已被破解的算法。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">降低加密成本上:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">用对<span style="color: black;">叫作</span>加密算法加密传输数据,<span style="color: black;">处理</span>非对<span style="color: black;">叫作</span>加密算法的性能低以及长度限制问题。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">缓存安全协议握手后的密钥等数据,加快第二次建连的速度。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">加快握手过程:2RTT-> 0RTT。加快握手的思路,<span style="color: black;">便是</span>原本客户端和服务端需要协商<span style="color: black;">运用</span>什么算法后<span style="color: black;">才可</span>加密发送数据,变成<span style="color: black;">经过</span>内置的公钥和默认的算法,在握手的<span style="color: black;">同期</span>就把数据发出去,<span style="color: black;">亦</span><span style="color: black;">便是</span>不需要等待握手就<span style="color: black;">起始</span>发送数据,达到0RTT。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">这些点<span style="color: black;">触及</span>的细节非常多,对 TLS 的介绍有一篇雄文,说得很<span style="color: black;">仔细</span>,<span style="color: black;">这里</span><span style="color: black;">举荐</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">日前</span>基本主流都支持 TLS1.2,iOS 网络库默认<span style="color: black;">运用</span> TLS1.2,Android4.4 以上支持 1.2。TLS1.3 iOS 还<span style="color: black;">处在</span>测试<span style="color: black;">周期</span>,Android 未查到<span style="color: black;">信息</span>。<span style="color: black;">针对</span>普通 APP,只要正确配置证书,TLS1.2 <span style="color: black;">已然</span>能<span style="color: black;">保准</span>传输安全,只是在建连速度上会有所损耗,有<span style="color: black;">有些</span>大型 APP 像<span style="color: black;">微X</span>就<span style="color: black;">自动</span>实现了 TLS1.3 的部分协议,早一步全平台支持。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">最后</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">网络优化这个<span style="color: black;">专题</span>非常庞大,本文只是在学习过程中从优化思路上列举了<span style="color: black;">日前</span>业界<span style="color: black;">平常</span>的优化点,还有<span style="color: black;">非常多</span>细节<span style="color: black;">非常多</span>更深入的优化没<span style="color: black;">触及</span>到,网络层实践<span style="color: black;">研发</span>经验不足,若有错误欢迎指出。</p><img src="https://mmbiz.qpic.cn/mmbiz_jpg/QbziaGpwWGobehr9c19J6J66fKlmw0TChFBPVsrYq22GibM3qdibh0SlCbkYEFvJa8nYvLYhAjnVAW1h6Y8eYbicLA/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1" style="width: 50%; margin-bottom: 20px;">iOS猿吧<span style="color: black;">关注最新技术</span><span style="color: black;"><a style="color: black;">关注</a></span>
感谢你的精彩评论,带给我新的思考角度。 论坛的成果是显著的,但我们不能因为成绩而沾沾自喜。 楼主发的这篇帖子,我觉得非常有道理。
页:
[1]