ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 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)