HTTP1.0
- 只支持短连接,且不支持连接复用
- 有Head of line block问题
即后面的请求只能等之前的请求响应之后才能发送。那么如果前面的请求响应较慢,那么后面的请求只能阻塞(例如前面的请求正在重传)。
如果需要发送多个请求必须创建多个 TCP 连接,并且浏览器对于单域名请求有数量限制(一般6个),其连接无法被复用 - 不支持Host请求头字段,使得不能通过Host得知要访问服务器的那个web站点,这样就无法使用WEB服务器在同一个IP地址和端口号上配置多个虚拟WEB站点。
- 不支持断点续传,每次传送都是从0字节开始。
HTTP1.1
- HTTP1.1是默认长连接的
如果想要关闭,则需要 header中的Connection的值为close,同时header中还有一个keep-alive属性,表示长连接的时间。 - HTTP1.1 采用流水线技术(依靠长连接)
默认情况下,HTTP请求是在上一个请求响应后发出的,由于收到网络延迟和带宽的限制,所以在下一个请求别发送到服务器之前可能要等很长时间。
流水线是指下一条请求可以在前一请求响应之前发出,但是响应顺序要按照请求顺序响应。(但也会有延迟,因为要按顺序响应) - HTTP新增了很多请求头来扩展功能
(1)Connection:长连接
(2)Host:域名
(3)Range:范围请求,服务器只发送了一部分数据,范围请求可以是客户端之请求未发送的部分
(4)RANGE:bytes=XXXX:表示要求服务器从文件XXXX字节处开始传送
(5)新增cookie
(6)Cache-Control:控制缓存
(7)Accept-encoding:内容编码,将实体主体进行压缩,从而减少传输的数据量。
HTTP2.0
- 二进制分帧层(在应用层和传输层之间)
(1)将HTTP1.X中的首部信息封装到Headers fram中,RequestBody封装到Data frame中,且都是二进制格式,消除了HTTP1.x文本格式上的维护。
(2)在通信过程中,只会有一个TCP连接存在,承载这任意数量的双向数据流(stream)
- 一个数据流(stream)都有一个唯一标识父和可选的优先级信息,用于承载双向信息。
- 消息(message)是与逻辑请求或响应对应的完整的一系列帧
帧(Fream)是最小的通信单位,来自不同的数据流的帧可以交错发送,然后根据每个针头的数据流标识符重新组装。
(3)这种单连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大;而且由于 TCP 连接的减少而使网络拥塞状况得以改善,同时慢启动时间的减少,使拥塞和丢包恢复速度更快。
帧代表着最小的数据单位,每个帧会标识出该帧属于哪个流,流也就是多个帧组成的数据流。
多路复用,就是在一个 TCP 连接中可以存在多条流。换句话说,也就是可以发送多个请求,对端可以通过帧中的标识知道属于哪个请求。通过这个技术,可以避免 HTTP 旧版本中的队头阻塞问题,极大的提高传输性能。
- 首部压缩
HTTP/1.1的首部带有大量信息,且每次都要重复发送,浪费性能
HTTP/2.0要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,同时避免了重复传输。
HTTP/2.0也是用了Huffman编码读首部字段进行压缩。 - 多路复用
http/1中的每个请求都会建立一个单独的连接,除了在每次建立连接过程中的三次握手之外,还存在TCP的慢启动导致的传输速度低。其实大部分的http请求传送的数据都很小,就导致每一次请求基本上都没有达到正常的传输速度。
在http1.1中默认开启keep-alive,解决了上面说到的问题,但是http的传输形式是一问一答的形式,一个请求对应一个响应(http2中已经不成立,一个请求可以有多个响应,server push),在keep-alive中,必须等下上一个请求接受才能发起下一个请求,所以会收到前面请求的阻塞。
使用pipe-line可以连续发送一组没有相互依赖的请求而不比等到上一个请求先结束,看似pipe-line是个好东西,但是到目前为止我还没见过这种类型的连接,也间接说明这东西比较鸡肋。pipe-line依然没有解决阻塞的问题,因为请求响应的顺序必须和请求发送的顺序一致,如果中间有某个响应花了很长的时间,后面的响应就算已经完成了也要排队等阻塞的请求返回,这就是线头阻塞。
http2的多路复用就很好的解决了上面所提出的问题。http2的传输是基于二进制帧的。每一个TCP连接中承载了多个双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧是可以交错传输,然后在接收端通过帧头的信息组装成完整的数据。这样就解决了线头阻塞的问题,同时也提高了网络速度的利用率。
- 服务推送
当客户端请求一个资源的时候,会把相关资源一起发送给客户端,客户端就不需要再次请求了。
虚拟主机
一台服务器上有多个web节点。即一台物理设备上有多台逻辑主机(web站点)。基于端口或ip或域名进行区分。目的是最佳的使用CPU,RAM,带宽等计算资源。