HTTP/1.0/1.1/2.0
HTTP 0.9
1991年,原型版本,功能简陋,只有一个命令GET,只支持纯文本内容,该版本已过时。
HTTP 1.0
任何格式的内容都可以发送,这使得互联网不仅可以传输文字,还能传输图像、视频、二进制等文件。除了GET命令,还引入了POST命令和HEAD命令。http请求和回应的格式改变,除了数据部分,每次通信都必须包括头信息(HTTP header),用来描述一些元数据。只使用 header 中的 If-Modified-Since 和 Expires 作为缓存失效的标准。不支持断点续传,也就是说,每次都会传送全部的页面和数据。通常每台计算机只能绑定一个 IP,所以请求消息中的 URL 并没有传递主机名(hostname)
HTTP 1.1
http1.1是目前最为主流的http协议版本,从1999年发布至今,仍是主流的http协议版本。
引入了持久连接( persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。长连接的连接时长可以通过请求头中的 keep-alive 来设置引入了管道机制( pipelining),即在同一个TCP连接里,客户端可以同时发送多个 请求,进一步改进了HTTP协议的效率。HTTP 1.1 中新增加了 E-tag,If-Unmodified-Since, If-Match, If-None-Match 等缓存控制标头来控制缓存失效。支持断点续传,通过使用请求头中的 Range 来实现。使用了虚拟网络,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。新增方法:PUT、 PATCH、 OPTIONS、 DELETE。
http1.x版本问题
在传输数据过程中,所有内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性。HTTP/1.1 版本默认允许复用TCP连接,但是在同一个TCP连接里,所有数据通信是按次序进行的,服务器通常在处理完一个回应后,才会继续去处理下一个,这样子就会造成队头阻塞。http/1.x 版本支持Keep-alive,用此方案来弥补创建多次连接产生的延迟,但是同样会给服务器带来压力,并且的话,对于单文件被不断请求的服务,Keep-alive会极大影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。
HTTP 2.0
二进制分帧 这是一次彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧":头信息帧和数据帧。头部压缩 HTTP 1.1版本会出现 「User-Agent、Cookie、Accept、Server、Range」 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用 HPACK 算法进行压缩。多路复用 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,这样子解决了队头阻塞的问题。服务器推送 允许服务器未经请求,主动向客户端发送资源,即服务器推送。请求优先级 可以设置数据帧的优先级,让服务端先处理重要资源,优化用户体验。
HTTP 和 HTTPS
HTTP 是明文传输协议,HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。HTTPS比HTTP更加安全,对搜索引擎更友好,利于SEO,谷歌、百度优先索引HTTPS网页。HTTPS标准端口443,HTTP标准端口80。HTTPS需要用到SSL证书,而HTTP不用。 HTTPS:
- 对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全;
- 对网站服务器进行真实身份认证。
HTTP 请求方法
GET:通常同于获取资源 POST:提交数据,上传数据 PUT:修改数据 OPTIONS:可对资源实行的请求方法,用于跨域请求
HTTP 常见状态码
1xx:协议处理中状态 2xx:成功 3xx:重定向(301永久重定向,302临时重定向,304命中缓存) 4xx:请求报文有误 5xx:服务器端发生错误
GET 和 POST 的区别
缓存角度:GET请求会被浏览器主动缓存下来,留下历史记录 参数角度:GET放在url中,因此安全性不高,且浏览器地址栏有长度限制
HTTP缓存策略
强缓存
Expires(http1.0)
Expires 即过期时间,时间是相对于服务器的时间而言的,存在于服务端返回的响应头中,在这个过期时间之前可以直接从缓存里面获取数据,无需再次请求。比如下面这样: Expires:Mon, 29 Jun 2020 11:10:23 GMT复制代码 表示该资源在2020年7月29日11:10:23过期,过期时就会重新向服务器发起请求。 这个方式有一个问题:「服务器的时间和浏览器的时间可能并不一致」,所以HTTP1.1提出新的字段代替它。
Cache-Control(http1.1)
这个字段采用的时间是过期时长 Cache-Control:max-age=6000
当Expires和Cache-Control同时存在时,优先考虑Cache-Control。
协商缓存
当缓存资源失效了,也就是没有命中强缓存,接下来就进入协商缓存
Last-Modified
这个字段表示的是「最后修改时间」。在浏览器第一次给服务器发送请求后,服务器会在响应头中加上这个字段。 浏览器接收到后,「如果再次请求」,会在请求头中携带If-Modified-Since 字段,这个字段的值也就是服务器传来的最后修改时间。 服务器拿到请求头中的If-Modified-Since的字段后,其实会和这个服务器中该资源的最后修改时间对比: 如果请求头中的这个值小于最后修改时间,说明是时候更新了。返回新的资源,跟常规的HTTP请求响应的流程一样。否则返回304,告诉浏览器直接使用缓存。
ETag
ETag是服务器根据当前文件的内容,对文件生成唯一的标识,比如MD5算法,只要里面的内容有改动,这个值就会修改,服务器通过把响应头把该字段给浏览器。 浏览器接受到ETag值,会在下次请求的时候,将这个值作为「If-None-Match」这个字段的内容,发给服务器。 服务器接收到「If-None-Match」后,会跟服务器上该资源的「ETag」进行比对👇
如果两者一样的话,直接返回304,告诉浏览器直接使用缓存如果不一样的话,说明内容更新了,返回新的资源,跟常规的HTTP请求响应的流程一样
|