Http/Https请求慢的解决办法

程序员小迷 2024-08-25 11:30:15

一 、域名优化

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等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

1 阅读:13

程序员小迷

简介:致力于Android、iOS、C、Java等编程技术的技巧经验分享