Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

关于HTTP #28

Open
vivipure opened this issue Aug 21, 2022 · 4 comments
Open

关于HTTP #28

vivipure opened this issue Aug 21, 2022 · 4 comments

Comments

@vivipure
Copy link
Owner

vivipure commented Aug 21, 2022

HTTP 版本

HTTP 1.0

无状态,无连接的应用层协议,每次请求都需要和服务器建立一个TCP连接

HTTP 1.1

1.0 的升级版,支持长连接,通过 Connection 字段设置 Keep-Alive 保持HTTP连接,避免每次连接都重复连接和断开TCP, 提高来连接效率

支持断点续传,请求头中新增 Range字段

支持 pipe 传输

支持长连接

HTTP 2

  1. 二进制分帧
  2. 基于流进行传输,多路复用
  3. 服务器推送(Server push)
  4. header压缩

HTTP 3

1.基于UDP的QUIC协议

@vivipure
Copy link
Owner Author

vivipure commented Aug 21, 2022

缓存

强缓存

浏览器从本地缓存中获取数据,不需要与服务器交互。状态码200

Header 中的 Expires 和 Cache-Control 控制强缓存

Cache-Control:

  1. no-cache 不使用本地缓存。需要使用协商缓存
  2. no-store 禁止浏览器缓存数据,每次都会重新请求
  3. public 允许所缓存,包括用户,cdn等中间服务器
  4. private: 只能被浏览器缓存,不允许中间服务器缓存。优先级大于Expires
  5. max-age=1200. 表示资源的有效期。过期后就会重新请求

Expires:

expires: Fri, 14 Apr ..

表示缓存的具体过期时间。超过这个时间后就会重新请求。由于这个时间是服务端计算的。如果服务端于客户端的时间存在偏差时,该功能可能会存在问题

协商缓存

如果不走强缓存,就会走协商缓存。让服务器来确定缓存的资源是否可用

Etag

返回资源的唯一标识,当资源内容改动后,Etag会变化。

If-None-Match

浏览器再次请求同一资源时,会发送If-None-Match,值为缓存的Etag值。

如果值和服务端相同,则返回 If-None-Match 为 false,返回状态码 304.客户端继续使用本地缓存

不同返回 If-None-Match 为 true, 返回新的数据,状态码为200.客户端使用新返回的数据

Last-Modified

资源在服务器最后修改时间. 该功能相较于Etag 存在一些问题:

  1. 可能文件修改时间改了,内容没有变化
  2. 时间精确到秒级,但文件改动如果时毫秒级变动,数据不准确

因此 Last-Modified 优先级低于Etag

If-Modified-Since

功能和 If-None-Match 类似。客户端再次请求时,会发送至之前返回的 Last-Modified 时间。服务端会与文件最后修改时间进行判断。

如果时间一致,则返回 304, 本地使用缓存

如果时间不一致,则返回新内容。 返回状态码 200

@vivipure
Copy link
Owner Author

HTTP连接过程和HTTPS连接过程

WIP

@vivipure
Copy link
Owner Author

常见的状态码

WIP

@vivipure
Copy link
Owner Author

vivipure commented Nov 10, 2022

HTTP 连接效率

HTTP 1.0

在 HTTP 1.0 时,每次链接都会建立一个TCP连接,连接成本大。浏览器限制同个域名的请求最多并发6个(Chrome),所以超出的请求只能在等待队列中进行排队。

HTTP 1.1

在HTTP 1.1 时,引入了 Keep-Alive, 同一个域名的请求共用一个TCP连接,多个连接不会重新创建TCP链接。但是还是受限于最大并发数的限制,性能上相较于HTTP 1.0 有提升。

HTTP 1.1 还引入了 pipe, 用来解决最大并发数。 pipe允许将所有请求都发给服务器,服务器按顺序一个个响应。节省了发送的等待时间,但是如果有一个请求阻塞了,会导致后面的请求都会被阻塞。

优化HTTP 1.1 的请求速度

  1. 请求分散,使用不同域名访问资源,解决浏览器同个域名最多并发数的限制
  2. 请求合并,例如雪碧图

HTTP 2

来到HTTP 2.0 时,由于HTTP 2.0基于二进制帧,不是基于文本的。可以做到无序传输。所有的请求都是建立在一个HTTP连接上的,由于所有数据都是流,不会存在互相阻塞的问题。实现了多路复用的功能。但是还是无法解决TCP队头阻塞的问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant