尽管在网络世界中,每个领域的专业人士都有其独特的职责,但是网络这一块是“大家”的。所以,各个职业的小伙伴们来看看这篇文章总归不会有害处。在此篇文章中,我们不再讨论如何在代码层面进行性能优化,而是转向关注另一个至关重要的领域——网络传输层的优化。这也是我们性能三部曲的最后一篇文章:Web前端性能优化:html、css、js篇;Web前端性能优化:JavaScript细节篇。

首先,我们需要了解HTTP请求的完整过程。DNS解析是其中的一个重要环节。首先,浏览器会搜索自身的DNS缓存。这个缓存的时间相对较短,大约只有1分钟,且只能容纳1条缓存。如果浏览器自身的缓存中没有找到所需信息,那么它就会去检索系统自身的DNS缓存。若依旧无果,浏览器则会尝试从hosts文件中查找。如果在前面三个步骤都没有获取到结果,最终会递归地访问域名服务器来查询。

当建立TCP连接之后,我们得到了所对应域名的IP地址。接下来,浏览器会使一个随机端口(介于14和6555之间)向服务器发送链接请求。这一请求(原始的http请求经过TCP/IP4层模型的层层封装)到达服务器端后,会被各种路由设备处理,进入网络接口卡(网卡),再由内核中的TCP/IP协议栈识别连接请求、解封包和逐层的剥离。在这个过程中,还可能需要通过Netfilter防火墙(属于内核模块)的过滤,最终达到WEB程序的连接。

接下来是TCP连接的三次握手/四次握手过程。HTTPS协议中还涉及SSL握手过程(SYN > SYN-CK > CK)。当需要进行HTTP重定向时,握手过程需从头开始。Web浏览器发送HTTP请求报文,由请求行、请求头和请求正文三部分组成。同样地,Web服务器在回应时也会发送HTTP响应报文,由状态码、响应头和实体内容三部分组成。

当Web服务器关闭TCP连接后,我们来看看网络传输层的性能分析。在一个典型的宽带环境下,如果有本地缓存,相对较快的DNS解析(5ms),TCP握手,SSL协商较快的服务器响应时间(1ms),一次延迟(8ms)等条件满足时,网络传输层的时间为:

  • DNS解析:5ms
  • TCP握手:8ms (one RTT)
  • SSL协商:16ms (two RTTs)
  • 请求发送到服务器:4ms
  • 服务器处理:1ms
  • 服务器回传响应数据:4ms

总时间为47ms。需要注意的是,这个时间是非常乐观的,因为现在的DNS预解析和优化已经减少了部分时间。

针对这些性能问题,我们可以提出一些优化方案:

  1. 优化DNS解析:使用DNS缓存来加快DNS解析速度。
  2. 使用DNS负载均衡:为同一个主机名配置多个IP地址,在应答DNS查询时,DNS服务器按照顺序返回不同的解析结果,将客户端的访问引导到不同的服务器上,以达到负载均衡的目的。

接下来,我们来谈谈缓存性能优化。这个优化包括强缓存和协商缓存两个概念:

  1. 强缓存:当浏览器在加载资源时,会根据http头部信息判断该资源是否命中强缓存。如果命中,则浏览器直接从自己的缓存中读取资源,不会向服务器发送请求。
  2. 协商缓存:当强缓存没有命中时,浏览器一定会发送一个请求到服务器。服务器端会依据资源的另外一些http头部信息验证这个资源是否命中协商缓存。

共同点是,无论是强缓存还是协商缓存,如果命中,都是从客户端缓存中加载资源,而不是从服务器加载数据。区别在于:强缓存不发请求到服务器,而协商缓存会向服务器发送请求。

缓存的实现主要有两种方式:本地磁盘和内存。在无痕浏览模式下,主要使用内存模式,以清空关闭窗口时的磁盘缓存。具体来说,内存模式实现了它自己的一套数据结构,它们被存储在一个单独的缓存目录里。其中,有索引文件(在浏览器启动时加载到内存中)和数据文件(存储实际数据和HTTP头信息以及其他信息)。实现方式包括:Expires、ETag、Last-Modified、Keepalive和Cache-Control等。

ServiceWorker是谷歌开发的一种后台线程,无论打开多少个页面,都会有一个Worker线程来管理资源缓存和拦截页面请求。结合Web Manifest,可以实现离线使用和在断网时返回网站内容的效果。此外,我们可以将网站添加到桌面图标中,提高用户体验。

为了优化传输资源,我们可以采用以下方式:使用console.log、console.table、console.dir等命令来调试和打印数据结构;检查无用的CSS/JS代码。

以上就是网络传输层性能优化的详细分析。希望这篇文章能对各位小伙伴有所帮助。当然,在实际应用过程中,还需要结合具体的业务场景和需求进行调整和优化。