HTTP/1 to HTTP/2 to HTTP/3
发展过程:
HTTP/1:1996年
HTTP/1.1:1997年
HTTP/2:2015年
What is HTTP/2?
2015年,一个名为HTTP/2的新版本被创建。 HTTP/2解决了HTTP/1.1的创造者们没有预料到的几个问题。 特别是,HTTP/2比HTTP/1.1更快、更有效。 HTTP/2更快的方式之一是它在加载过程中如何优先处理内容。
什么是优先顺序?
在 Web 性能的背景中,优先顺序是指加载内容的顺序。假设用户访问新闻网站并导航到一篇文章。应该先加载文章顶部的照片?应该先加载文章的文本?应该先加载横幅广告?
优先顺序会影响网页的加载时间。例如,某些资源(例如大型 JavaScript 文件)如果必须先加载,则可能会妨碍页面其余部分的加载。如果最后加载这些妨碍渲染的资源,则可以一次加载页面的更多部分。
另外,这些页面资源的加载顺序会影响用户对页面加载时间的感知。如果仅首先加载幕后内容(如 CSS 文件)或用户无法立即看到的内容(如页面底部的横幅广告),则用户会认为该页面根本没有加载。如果首先加载对用户最重要的内容(例如页面顶部的图像),则用户会觉得页面加载速度更快。
HTTP/2 中的优先顺序如何影响性能?
在 HTTP/2 中,开发人员可以动手进行细致的优先顺序控制。这样,他们可以将页面加载的感知速度和实际速度最大化到 HTTP/1.1 无法企及的水平。
HTTP/2 提供了一个称为加权优先顺序的功能。开发人员可以决定每次首先加载哪些页面资源。在 HTTP/2 中,当客户端请求网页时,服务器会一次性将多个数据流发送到客户端,而不是逐个依次发送。这种数据传输方法称为多路复用。开发人员可以为这些数据流分别分配一个不同的加权值,该值告诉客户端首先要呈现哪个数据流。
想象一下,爱丽丝想要阅读她的朋友鲍勃写的小说,但是爱丽丝和鲍勃都只通过普通邮件沟通。爱丽丝给鲍勃写信,要求鲍勃将小说寄给她。鲍勃决定以 HTTP/1.1 方式发送小说:一次寄出一个章节,并且仅在收到爱丽丝确认她已收到上一章的回信后才寄出下一章。使用这种内容交付方法,爱丽丝需要数周时间才能读完鲍勃的小说。
现在,假设鲍勃决定以 HTTP/2 方式将小说发送给爱丽丝:这时,他分开发送小说的各个章节(以保持在邮局的大小限制内),但一次性发送了所有章节。他还为每一章编号:第 1 章、第 2 章,等等。现在,爱丽丝同时收到整部小说,并可以按自己的时间以正确的顺序进行编排。如果缺少某一章,她可以发送快速答复以索取这一特定章节;如果不缺,则过程完毕,爱丽丝可以在短短几天内读完小说。
在 HTTP/2 中,数据是一次性发送的,就像鲍勃一次性向爱丽丝发送多个章节一样。而且与鲍勃一样,开发人员也可以在 HTTP/2 中为各章编号。他们可以决定是否首先加载网页文本、CSS 文件、JavaScript 或对用户体验最重要的内容。
HTTP/2 和 HTTP/1.1 之间还有哪些影响性能的区别?
多路复用:HTTP/1.1 依次加载各个资源,因此,如果无法加载某一资源,它将阻碍其后的所有其他资源。相比之下,HTTP/2 可以使用单个 TCP 连接来一次发送多个数据流,使得任何资源都不会会阻碍其他资源。为此,HTTP/2 将数据拆分为二进制代码消息并为这些消息编号,以便客户端知道每个二进制消息所属的流。
服务器推送:通常,服务器仅在客户端要求时才向客户端设备提供内容。但是,这种方法并不总是适用于现代网页,因为现代网页通常涉及客户端必须请求的数十个独立资源。HTTP/2 通过允许服务器在客户端请求之前向客户端“推送”内容来解决此问题。服务器还发送一条消息,让客户知道预期推送的内容是什么,就像 Bob 在发送整本书之前向 Alice 发送小说目录一样。
标头压缩:小文件的加载速度比大文件快。为了提高 Web 性能,HTTP/1.1 和 HTTP/2 都会压缩 HTTP 消息以使其更小。但是,HTTP/2 使用一种称为 HPACK 的更高级压缩方法,可以消除 HTTP 标头数据包中的多余信息。这样可以从每个 HTTP 数据包中消除几个字节。考虑到即使只加载一个网页时所涉及的 HTTP 数据包的数量,这些字节会迅速累加,从而加快了加载速度。
Is SSL required for HTTP2?
While HTTP/2 did not explicitly change the security requirements for HTTP, almost all browsers that use HTTP/2 require SSL/TLS to be enabled at the website, which makes it mandatory for all intents and purposes.
虽然 HTTP/2 没有明确改变 HTTP 的安全要求,但几乎所有使用 HTTP/2 的浏览器都要求在网站上启用 SSL/TLS,这使得它对于所有意图和目的都是强制性的。
Nginx开启HTTP/2示例:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name _;
root /usr/share/nginx/html;
# ssl_certificate "/etc/nginx/ssl/vultr.vben.xyz.crt";
ssl_certificate "/etc/nginx/ssl/vben.xyz.pem";
# ssl_certificate_key "/etc/nginx/ssl/vultr.vben.xyz.key";
ssl_certificate_key "/etc/nginx/ssl/vben.xyz.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
}
HTTP/3:draft 2020,publish 2022
Stateless HTTP means that the server treats each client request as an independent, isolated transaction, without retaining any prior information or context about that client from previous requests. While this original design enhances scalability by reducing server complexity, modern web applications use techniques like HTTP cookies to add a "stateful" layer, enabling user sessions and personalization by storing user-specific information on the client-side to be sent with each request.
What "Stateless HTTP" Means
- Each HTTP request is treated as a completely new event, regardless of other requests from the same or different clients.
- The server does not store any memory or session data about the client between requests.
- The client must include all the necessary information for a request within the request itself.
Why HTTP is Stateless
- Servers don't need to maintain complex session data, making it easier to add or remove servers to handle varying traffic demands.
- The protocol is simpler to implement because servers don't have to track the state of every client.
- Any server can handle a request, as it doesn't rely on a specific previous interaction with a particular server.
How State is Added to HTTP (Making it Stateful)
To create a stateful experience, applications use mechanisms to pass state information back and forth:
- HTTP Cookies: Cookies are pieces of data stored on the client's browser.
- Server-Side Sessions: The server can store session data and identify the user across requests using a cookie that references the session.
- Tokens: For modern web applications and APIs, tokens can be used to maintain session state.
评论
发表评论