HTTP:超文本传输协议,用于在浏览器和web服务器之间传输超文本页面。
HTTP的版本
HTTP1.0到HTTP1.1有哪些改进?
(1)虚拟主机:在一个Web服务器中并存多个站点
如何区分网站:在请求头里面有Host,保存要访问的域名。
(2)持久连接
在HTTP1.0中,浏览器访问服务器的内容每次只能获得一个资源,在HTTP1.1中,建立连接后可以获得多个资源。通过Connection:keep-alive,一次请求完成后不要马上断开,在保持一会儿。
(3)代理连接:客户端可以通过代理服务器间接访问目标服务器。
Proxy:XXXX。
HTTP1.1的缺点:
1)在传输中会出现对首阻塞问题
2)响应不分轻重缓急,只会按先来后到的顺序执行
3)并行通信需要建立多个TCP连接
4)服务器不能主动推送客户端想要的资源,只能被动地等待客户端发起的请求
5)由于HTTP是无状态的,所以每次请求和响应都会携带大量冗余信息。
HTTP2.0和HTTP1.1相比的新特性?
1)二进制分帧层
二进制分帧层是HTTP2.0性能增强的关键,它改变了通信两端交互数据的方式,原先都是以文本传输,现在要先对数据进行二进制编码,再把数据分成一个一个的帧,接着把帧送到数据流中,最后对方接收帧并拼成一条消息,再处理请求。在2.0版本中,通信的最小单位是帧(frame),若干个帧组成一条消息,若干个消息在数据流中传输,一个TCP连接可以分出若干条数据流,因此HTTP2.0只要建立一次TCP连接就能完成所有传输。
2)多路通信
通信两端对请求或响应的处理都是串行的,也就是按顺序一个个处理,虽然在HTTP1.1中新增了管道化的概念,让客户端能一下发送多个请求,减少了不必要的网络延迟,但那只是将请求的队列顺序迁移到服务器中,服务器处理还是得按顺序来,所以本质上响应还是串行的。如果一定要实现并行通信,那么必须建立多条TCP连接,多个请求分别在不同的TCP通道中传输,间接实现并行通信。
TCP是一种可靠的通信协议,中途如果出现丢包,发送方就会根据重发机制再发一次丢失的包,由于通信两端都是串行处理请求的,所以接收端在等待这个包到达之前,不会在处理后面的请求,这种现象称为对首阻塞。
HTTP2.0不但解决了对首阻塞问题,还将TCP建立次数降低到1次。通信两端只需将消息分解为独立的帧,然后在多条数据流中乱序发送,最后在接收端把帧重新组合成消息,并且各条消息的组合互不干扰,这就实现了真正意义上的并行通信,达到了多路复用的效果。
3)请求优先级
客户端对请求资源的迫切度都是不同的,例如在浏览器的网页(即HTML文档)中,像CSS、JavaScript这些文件传的越快越好,而像图像则可以稍后再传。在HTTP1.1中,只能是谁先请求,谁就先处理,不能显式地标记请求的优先级。而在HTTP2.0中,每条数据流都有一个31位的优先值,值越小优先级约大(0 的优先级最高)。有了这个优先值,相当于能随时建立一条绿色通道,通信两端可以对不同数据流中的帧采取不同的策略,这样能更好地分配有限的带宽资源。
4)服务器推送
HTML文档中的资源可以从服务器中拉取,也可以经过编码后直接嵌入。嵌入虽然可以减少一次请求,但同时会让HTML文档体积膨胀,降低压缩效率,破坏资源缓存。虽然有种种不足&