# HTTP
HTTP 分为 HTTP1.0 和 HTTP1.1 两个版本。
## 生命周期
#### HTTP 1.0
HTTP 的生命周期通过 Request 来界定,也就是一个 Request 一个 Response ,那么在 HTTP1.0 中,这次HTTP请求就结束了。
#### HTTP 1.1
对 HTTP 1.0 进行了改进,使得有一个 keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。
> 但是,Request = Response,在 HTTP 中永远是这样,也就是说一个 request 只能有一个 response。而且这个 response 也是被动的,不能主动发起。
## http 方式的实时获取信息(仿 WebSOcket)
### http long poll
`long poll` 其实原理跟 ajax轮询 差不多,都是采用轮询的方式。
不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。
直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。
### ajax 轮询
ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。
> 无论是 http long poll 还是 ajax 轮询都是被动的,都是由客户端不停的发起请求,都是非常消耗资源的。
> 不同的是,ajax轮询 需要服务器有很快的处理速度和资源(速度)。 而,long poll 需要有很高的并发,也就是说同时接待客户的能力。
> 而且,http连接是无状态的,每次连接都是一个新的连接。
## HTTP1.0 和 HTTP1.1 和 HTTP2.0 的区别
### HTTP1.0 和 HTTP1.1 主要区别
- 长连接
HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。
HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。
- 节约带宽
HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。
另外HTTP1.1还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。
- HOST 域
现在可以web server例如tomat,设置虚拟站点是非常常见的,也即是说,web server上的多个虚拟站点可以共享同一个ip和端口。
HTTP1.0是没有host域的,HTTP1.1才支持这个参数。
### HTTP1.1 和 HTTP2.0 主要区别
- 多路复用
HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。
当然HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。
TCP连接有一个预热和保护的过程,先检查数据是否传送成功,一旦成功过,则慢慢加大传输速度。因此对应瞬时并发的连接,服务器的响应就会变慢。所以最好能使用一个建立好的连接,并且这个连接可以支持瞬时并发的请求。
> 二进制分帧,在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层,在这个二进制分帧层,所有传输的消息被分为更小的消息和帧,并对它们采用二进制编码,其中 http1.x的首部信息会被封装到HEADER frame,而相应的 request body 则被封装到 DATA frame 中。在建立连接之初,http2.0会限制连接的速度,当数据传输成功后,会逐步增大信息传输的速度。
- 数据压缩
HTTP1.1不支持header数据的压缩,HTTP2.0使用 `HPACK算法` 对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。
- 服务器推送
意思是说,当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。
http1.x 服务端只能对一个请求发生一个 response,但是 http2.0 可以对一个 request 返回多个 response。
> HTTP2.0 [参考文章](https://imququ.com/post/http2-resource.html)
- 1. HTML
- 1.1 HTML 标签
- 1.2 HTML 属性
- 1.3 HTML5
- 2. CSS/CSS3
- 2.1 CSS3
- 2.2 Less
- 2.3 Sass
- 3. JavaScript
- 3.1 JQuery
- 3.2 javascript code
- 3.3 es6
- 4. 前端框架
- 4.1 Angular4+
- 4.2 React
- 4.3 Vue
- 5. 综合知识
- 5.1 HTTP
- 5.2 websocket
- 5.3 综合问题集合
- 5.4 前端优化
- 6. 附加知识
- 6.1 TCP/IP
- 6.2 数据结构
- 6.3 前端开发
- 7. 相关工具
- 7.1 Git
- 7.2 调试
- 7.3 Linux
- 8. 其他需要了解的内容
- 8.1 Python3
- 8.2 Java
- 8.3 数据库