一 、域名优化
1.不通过 DNS 解析,直接访问 IP。
2.在HTML中使用<link rel="dns-prefetch">进行域名预解析。
二、优化网络环境
1.确保网络连接稳定,检查带宽是否足够。
2.对于跨域请求,使用CDN(Content Delivery Network),将网站的静态资源缓存到离用户更近的服务器上,加速静态资源的传输。
3.对于需要跨越VPN和国际传输的请求,优化VPN配置,选择更快更稳定的传输路径。
三、优化服务器性能
1.确保服务器拥有足够的内存和CPU。
2.减少数据库处理数据的耗时,建立索引,使用数据库缓存。
3.使用Google PageSpeed Insights、Lighthouse、WebPageTest等工具来分析网站性能并进行处理。
4.使用Web性能API,如Resource Timing API来详细分析页面加载过程中的每个步骤,从而优化性能。
四、减少HTTP请求次数
1.将css文件、js文件等文件合并到一个文件,减少请求次数。
2.将大小较小的css或js等文件内联到html文件中,减少请求次数。
五、压缩和缓存
1.使用gzip、deflate、Brotli等算法对服务器返回的数据进行压缩。
2.使用现代的图片格式WebP等进行图片大小优化。
3.设置合适的HTTP缓存头,使客户端缓存静态资源,减少重复请求。
六、并发请求和域名分片
1.并发请求:利用客户端的并发请求限制,将资源分布在不同的域名下,以提高加载速度。
2.域名分片:将静态资源分布到不同的子域名上,客户端使用子域名来引用资源。
七、升级HTTP协议
1.使用HTTP/2或HTTP/3协议中提供的多路复用、头部压缩、二进制协议等新特性来进行更加有效率的网络访问。
八、减少重定向和阻塞
1.减少重定向:确保访问的URL没有过多的重定向。
2.减少阻塞:将JavaScript脚本放在页面底部或使用异步加载的方式,避免阻塞主页面的渲染。
九 、解决连接无法复用
1.Http/1.x 协议头里可以设置 Connection:Keep-Alive (复用连接)或者 Connection:Close (不复用连接)来选择是否允许在一定时间内复用连接(时间可由服务器控制)。但这对 客户端的成效不大,因为客户端的请求往往比较分散且时间跨度相对较大。
2.基于 tcp 的长连接
客户端建立一条自己的长连接通道,通道的实现是基于tcp 协议。信息的上报和推送变得更及时,请求量爆发的时间点还能减轻服务器的压力(避免频繁创建和销毁连接)。
3.http long-polling(长轮询)
客户端初始时发送一个 polling 请求到服务器,服务器并不会马上返回业务数据,而是等待有新的业务数据产生的时候再返回,所以连接会一直被保持。一旦超时或有业务数据到来时,进行处理,然后会结束当前连接,客户端马上又会发送一个新的 polling 请求,如此反复,保证一个连接被保持。
这存在的问题如下:
1)增加了服务器的压力 。
2)网络环境复杂场景下,需要考虑如何重建连接 。
3)polling 的方式稳定性不好 。
4)polling 的 response 可能被中间代理 cache 住。
4.http streaming
和 long-polling 不同的是,streaming 方式通过在 server response的头部增加"Transfer Encoding:chuncked"来告诉客户端后续还有新的数据会到来。
这存在的问题如下:
1)有些代理服务器会等待服务器的 response结束之后才会将结果推送给客户端。streaming 不会结束 response。
2)业务数据无法按照请求分割。
5.web socket
和传统的 tcp socket 相似,基于 tcp 协议,提供双向的数据通道。它的优势在于提供了 message (基于文本)的概念,比基于字节流的 tcp socket 使用更简单。
6.若使用HTTPS,确保使用高效的TLS配置,减少握手时间。
7.TCP优化技术
1)TCP快速打开(TFO,TCP Fast Open)旨在减少TCP连接的延迟,它允许在3次握手期间就开始传输数据。
2)BBR拥塞控制算法(Bottleneck Bandwidth and Round-trip propagation time)与传统的Cubic算法不一样,不采用丢包作为拥塞信号,而是基于模型主动探测技术来减少网络延迟。
十、解决队头阻塞问题( Head of Line blocking)
1.HTTP1.0 不支持请求管道化,即在一个连接上不能同时发送多个请求。
HTTP1.1 支持请求管道化,同一连接上可以同时发送多个请求。但服务器必须按照请求的顺序进行响应,因此可能会造成队头阻塞(Head of Line Blocking)问题。
2.HTTP2.0多路复用通过多个请求 共享一个 TCP 连接的方式,解决了HTTP request层面的 队头阻塞(HOL blocking ,即Head of Line blocking)的问题,即解决了HTTP 1.x中的队头阻塞问题,但TCP层面的队头阻塞问题(由于丢失或延迟的数据包导致重传阻塞)并未解决,基于QUIC(Quick UDP Internet Connections)的HTTP/3基本可以解决队头阻塞问题。
微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。
我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。
欢迎关注。助您在编程路上越走越好!