http1.x
- 冗余的header:每个请求都会带上冗余重复的Header,导致传输的体积很大
- http是无状态的协议,每个请求没有做特殊的标识:无法通过一个TCP链接并发的发送多个请求,只能等上一个请求的rsp返回了,才能发送下一个请求。(只能串行的发送)
- 因为http1.x是基于”文本“的协议,请求的内容打包在header/body中,内容通过CRLF来分割,同一个TCP链接中,无法区分req/rsp是属于哪个请求
- 于是http1.x提出了pipeline:允许请求方一口气的发送多个请求,但是有一个严重的弊端,需要对应的rsp按照req的顺序严格排列(因为每个请求没有唯一的标识,所以不按照顺序排列就无法区分rsp是属于哪个req)。==> 若前面的req迟迟不来,后面的请求都会要等待
- Chrome浏览器,一个域名,只能有6个TCP链接在同时工作
http2.0
相较于http1.0的改进点
- header压缩
- 静态字典:常见的头部名称,如,get/post/cookie等
- 动态字典:比如一个req过来,会将字段保存在动态字典中,再一个req,若发现相同的字段,无需传递,只需要使用动态字典中的标识
- 流/帧 + 多路复用
- http2.0提出了流的概念,每个请求对应一个流,每个流都有唯一的ID,用来区分不同的req/rsp
- 基于流的概念,又提出了帧:一个请求的数据被分成多个帧,方便进行数据传输。每个帧都属于某一个流ID
- 多路复用:在一个TCP链接上,可以同时发起无数个请求,并且响应可以同时返回
- 请求划分优先级
- 多路复用带来的一个问题是,在共享连接的基础上会存在一些关键请求被阻塞,SPDY 允许给每个请求设置优先级,这样重要的请求就会优先得到响应
- 服务端推送
- 在HTTP1.x中,访问一个页面,浏览器首先获取HTML资源,然后在解析页面时增量地获取其他资源,服务器必须等待浏览器发出请求后才下发页面内资源。而服务器实际上是知道页面内资源有哪些的,如果服务器能够在浏览器显式请求资源之前就将资源推送到浏览器,页面加载速度将会大大提示,这也是本篇的主旨。
- 简单来讲,就是当用户的浏览器和服务器在建立链接后,服务器主动将一些资源推送给浏览器并缓存起来,这样当浏览器接下来请求这些资源时就直接从缓存中读取,不会在从服务器上拉了,提升了速率
http2.0存在的问题:http2.0只是通过多路复用技术解决了http层面上的队首阻塞,但是tcp层面的毫无办法。TCP 的队头阻塞并没有彻底解决。TCP 为了保证可靠传输,有一个“超时重传”机制,丢失的包必须等待重传确认
TCP队头阻塞 ? ? ? ? 我们都知道,TCP是一种可靠传输,这个可靠就是体现在它能够“按序到达”,然后再被上层接收,这里的按序到达指的是最终顺序是按序排列的,也就是说每当有一个或几个Packet丢失的时候,会等待它到达后合并,然后再向上交付。
? ? ? ?因此,很容易可以理解,当一个流的第一个数据包丢失了,那么即使后面的数据包都到达了,后面的这些数据包也不能被处理,而是要等第一个数据包到了之后才能被上层接收处理,那么这个时候不止是第一个数据包需要额外等待一个或多个RTT,后面的第二个Packet、第三个Packet......都需要同样多等待那么多时间才能处理,但实际上他们是按时到达了的,这也就是所谓的TCP队头阻塞。
http3.0
http3.0彻底弃用了TCP协议,改用可靠的UDP协议(QUIC)
RPC和http有什么区别
- RPC是方法,http是传输协议。其实两者不是一个类型,没有什么可比性
- 传输协议
- RPC:tcp协议、http协议
- http:http协议
- 传输效率
- RPC ①如果使用自定义的TCP协议,可以让请求头的信息更少 ②使用http2.0协议,传输效率也很高
- http:请求头中包含很多无用的信息,比如refer,keepalivetime,last-modify等信息。在流量大的时候,每次请求多几个字节,影响效率
- 性能
- RPC:可以基于thrift或pb来实现二进制传输
- http:也可以使用pb,但是目前主流的浏览器大部分是使用json文本传输
protobuf压缩
|