13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

从输入url开始能做哪些优化

此文主要讲的事情是如何让用户快点看到首屏页面,其主要影响因素是延迟和解析渲染耗时。有关安全部分其实也是优化的一部分。我们着重说下网络部分。

我们提供的服务有:网站设计制作、网站设计、微信公众号开发、网站优化、网站认证、汾西ssl等。为成百上千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的汾西网站制作公司

大致过程:DNS域名解析、建立TCP连接、下载资源、解析页面。文章描述的优化会尽量限制在当时的分析的过程下。

参考

1.DNS域名解析

一般来讲,我们输入的url是域名,而为了识别一个实体,TCP/IP使用IP地址来唯一确定一台主机到因特网的连接,DNS会帮助我们完成域名到IP地址映射的工作。以 www.aaa.com为例,解析过程大致如下:

过程

浏览器

浏览器查询浏览器缓存,没有。

本机层

浏览器客户端向系统询问服务器IP地址,调用本机内的DNS解析程序,检查自己本地的hosts文件是否有这个域名映射关系,没有。

查找本机的DNS解析器缓存,没有。

路由器缓存

可能还存在路由器缓存这一层

本地DNS服务器

本机的DNS解析程序向本地的DNS服务器发起请求,一般为TCP/IP参数中设置的***DNS服务器,是知道IP地址的,一般会UDP协议。

本地DNS服务器查询是否在本地区域文件中,没有。

本地DNS服务器查询DNS缓存中是否存在,没有。

本地DNS服务器会根据是否设置转发器判断是向上一级DNS服务器(其解析规则同理)还是直接向根DNS服务器(知道根DNS服务器的IP地址)发送请求。

与DNS服务器

收到请求后,根DNS服务器并不直接解析地址,但是知道每个***域中的一台服务器的地址(如 com域名服务器)。如果为迭代查询方式,此***域DNS服务器的ip被返回给本地DNS服务器。

本地DNS服务器提取到***域DNS服务器信息后,会再向其发出请求。***域DNS服务器收到请求后,会先查询自己的缓存,没有,则将负责的二级域名服务器(如 aaa.com域名服务器)返回给本地DNS服务器,以此类推直到查到目标域名的映射信息或查询失败。

查到映射信息后返回到本机,中间各层会进行缓存。

查询方式

一般默认的方式从本机到本地DNS服务器是递归,DNS服务器之间是迭代查询。

优化

当然针对DNS的优化就是减少DNS解析的时间,由于浏览器缓存机制的存在,我们只需要对***访问进行优化(虽然我们现在只是请求了一个html文件,但是html文件里还会有我们后续要请求的css/js/img等),即适当减少要解析的域名个数,考虑到其他优化机制可以将页面及页面内资源发布到2-4个域名上。

2.建立连接

TCP连接

好了,浏览器终于拿到服务器IP了,客户端想要与服务器间通信并传递消息需要开启TCP(一种传输层协议)连接。

过程:

简单来讲:

 
 
 
  1. // client:  
  2. send ({ SYN :   1 ,  seq :  x ,   ... others })                  
  3. |                      
  4. ↓ 
  5. //server:  send ({ SYN :   1 ,  ACK :   1 ,  ack :  x  +   1 ,  seq :  y ,   ... others })                      
  6. |                      
  7. ↓ 
  8. //client:  ack  ===  x  +   1 ?  send ({ ACK :   1 ,  SYN : 0 ,  ack :  y  + 1 , ... others })  : 'hehe' 
  9.                      
  10. |                      
  11. ↓ 
  12. //server:  ack  ===  y  +   1   &&  ACK  === 1 ? new Socket () : '' 

 

SSL/TLS

如果启用了HTTPS进行加密,在使用TLS前还需要协商建立加密信道。

过程:

客户端

TCP连接建立之后,再以纯文本形式发送一些规格说明,随机数 Random1,TLS协议版本,支持的加密套件列表,支持或希望使用的其他TLS选项。

服务器

  1. 取得TLS协议版本以备将来通信使用,从客户端提供的加密套件列表中选择一个,生成随机数 Random2发送给客户端;
  2. 附上自己的证书,将响应发送给客户端;
  3. 同时,也可发送一个请求,要求客户端提供证书以及其他TLS扩展参数。

客户端

  1. 同上,可能会向服务器发送自己的证书。
  2. 客户端收到服务器的证书后,通过证书链关系从根CA(证书的签发机构)验证证书的合法性,验证通过后取出证书中的服务器公钥,生成随机数Random3,再用服务器公钥加密 Random3(pre master key),发送给服务器;
  3. 告诉服务器可以开始加密透明信了;
  4. 客户端用 三个随机数和 约定的加密方法生成 对话密钥。将前面的握手信息生成完成摘要,使用 对话密钥加密,发送告诉服务器我已完成握手。

除了服务器公钥加密的新对称密钥外,所有的数据都是明文形式发送。

服务器

用私钥解密出客户端发来的随机数,通过验证消息的MAC检测消息完整性,用相同的方式生成 对话密钥。

解密客户端发送的完成报文,验证 对话密钥是否正确。

  1. 告诉客户端,要开始加密了;
  2. 同样再返回给客户端一个加密的完成消息。

客户端用它之前生成的 对话密钥解密这条消息,确定 对话密钥是否正确,正确则建立信道并且开始发送应用数据。

其中:

优化

我们要对TCP和SSL/TLS握手耗时进行优化。有以下几个因素:

原因:

  1. TCP慢启动:由于TCP慢启动(为避免拥塞,TCP连接初始只能发送较少的分组,然后等待客户端确认,然后翻倍,经过几次往返直至到达阈值)和TLS/SSL握手数据发送一般位于TCP连接慢启动阶段的关系,证书数据过多会超过TCP连接的初始值,会造成数据往返次数的成倍增加。
  2. 证书链验证过长:由于客户端浏览器在验证证书可靠性时,会递归验证链条中的每个节点至根证书,也会增加握手时间。

方法:

  1. 减少中间证书颁发机构的数量,优化至只有站点证书和一个中间证书颁发机构。
  2. 不要添加根证书信息,浏览器内置信任名单中有根证书。

握手次数:前两点优化都是针对的握手时间的优化,握手次数也是影响延迟的重要因素。我们在后面谈到大量请求的时候再说这一点。

初始拥塞窗口:适当增大初始拥塞窗口大小,即增大TCP连接初始可发送的分组大小。

3.获得页面响应

重定向响应

如果服务器返回了跳转重定向(非缓存重定向),那么浏览器端就会向新的URL地址重新走一遍DNS解析和建立连接。

所以应该避免不必要的重定向。

页面资源响应

在获得了html响应之后,浏览器开始解析页面,进入准备渲染的阶段。下载优化同样放在后面谈到大量请求的时候再说这一点。

4.解析渲染页面

我们需要将这个过程先分为两个部分来看,页面资源加载和渲染。

页面资源加载

浏览器在解析页面的过程中会去请求页面中诸如js、css、img等外联资源。

建立连接

同样这些资源的加载也是需要建立TCP连接的,直接使用也需要进行DNS解析和握手。

优化

此处的请求次数与频率相对于***次请求页面资源时要高很多,所以这里着重阐述下成批量的请求的优化。

浏览器目前使用的HTTP协议版本大多是1.1和2,二者有些不同,但是底层都是使用TCP进行数据传输。由于TCP握手耗时,和SSL/TLS更加耗时,我们需要减少整个加载过程中需要建立的连接的次数和耗时。

复用:针对HTTP1.1的***方法是启用长连接:HTTP 1.1提供了默认开启长连接功能,相对于短连接(每请求一个资源建立然后断开一次TCP连接),同一客户端socket(浏览器可能会开多个端口并行请求)针对同一socket(域名+端口)后续请求都会复用一个TCP连接进行传输,直到关闭这个TCP连接。

加速:针对SSL/TLS握手有会话恢复机制,验证通过后,可以直接使用之前的对话密钥,减少握手往返。

加载之前

在服务器返回响应时,又存在几种情况,如:服务器负载大,服务器宕机,无法及时或较快响应请求,服务器地理位置过远或跨运营商导致延迟很高。

优化

这里跟建立连接部分的优化其实是公用的,但是单纯的正常建立连接消耗资源较少,所以我们在这个再较完成的阐述一下。

开始加载

好了,服务器终于可以愉快的返回数据了。

HTTP 1.1

过程:

优化:

HTTP 2

由于HTTP 2提供了多路复用的功能,基于二进制数据帧和流的传输,使通过一个TCP连接进行数据分散、乱序、并行传输成为现实,即我们所有的资源都可以通过一个TCP连接不阻塞的并行传输。

所以我们针对HTTP 1.1的减少请求数量所做的合并优化、增加资源分布域名都成为了无效优化,可以丢掉。同时由于文件不用合并,进行文件更新时我们也不用再修改单个开发模块更新所有(合并文件)模块了。

加载中

总的来说是很简单的过程,客户端接收服务器传输返回的响应。

优化

传输的数据大小越小,那么传输就越快,延迟就越小。

更小:

缓存:小到最小的情况当然是不接受数据传输,使用本地缓存。一般使用服务器前一次返回的响应头部字段进行控制。

强缓存:强缓存不会向服务器发送请求。

协商缓存:

关闭TCP

在资源下载完毕之后,需要关闭TCP连接。这段没有什么可以优化的。

过程:

总结

HTTP2 真好用。合理使用缓存。

页面解析渲染

上述的资源加载是发生在页面解析过程中的。那么浏览器的页面解析渲染是怎么样的一个过程呢?

过程

简要来讲就是:

问题

资源下载:

重绘重排导致重新进行渲染树的生成:

优化

dom

js

css

文件数量

5.其他优化措施

我们还可以采取一些和延迟、渲染无关的优化措施:


当前标题:从输入url开始能做哪些优化
网站路径:http://cdbrznjsb.com/article/cdjgccp.html

其他资讯

让你的专属顾问为你服务