HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
http的优点及缺点
优点:
1.灵活可扩展
2.请求应答模式
3.基于TCP的可靠连接
4.无状态(一方面可以减少网络开销,一方面不能保存用户的登陆信息)
缺点:
1.无状态
2.明文传输,不安全即协议里的报文(主要指的是头部)不使用二进制数据,而是文本形式。这让HTTP的报文信息暴露给了外界,给攻击者带来了便利。
3.队头堵塞
http 0.9
- 只支持get,过时,仅支持纯文本发送
http1.0
- 可以传输文本、视频、图像、二进制码
- 支持get,post,head
- 每次通信都必须包括头信息(HTTP header),用来描述一些元数据。
- 缓存相关:使用 header 中的 If-Modified-Since 和 Expires 作为缓存失效的标准
- 不支持断点传输
http1.1(主流协议版本,用的最多)
- 持续连接,即TCP连接默认不关闭,可以被多个请求复用,不用声明
Connection: keep-alive。长连接的连接时长可以通过请求头中的keep-alive来设置。 - 支持断点续传,通过使用请求头中的
Range来实现 - 缓存相关:HTTP 1.1 中新增加了 E-tag,If-Unmodified-Since, If-Match, If-None-Match 等缓存控制标头来控制缓存失效。
- 新增方法:PUT、 PATCH、 OPTIONS、 DELETE。
http1.0/1.1的缺点
- 明文传输
- 复用TCP连接造成的对头堵塞
- 对于单文件被不断请求的服务,Keep-alive会极大影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间。
http2.0
采用二进制分帧,头信息和数据体都是二进制,并且统称为"帧":头信息帧和数据帧。头部压缩,HTTP 1.1版本会出现 「User-Agent、Cookie、Accept、Server、Range」 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用HPACK算法进行压缩。多路复用复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,这样子解决了队头阻塞的问题。- 服务器推送
http2.0的关键点解释
1.采用HPACK来解决头部压缩
-
类似于索引表,每个索引表对应一个值,比如索引为2对应头部中的method头部信息,这样子的话,在传输的时候,不在是传输对应的头部信息了,而是传递索引,对于之前出现过的头部信息,只需要把「索引」(比如1,2,...)传给对方即可,对方拿到索引查表就行了。
-
2.对于整数和字符串进行 「哈夫曼编码」
2.多路复用
- HTTP 1.x 中,如果想并发多个请求,必须使用多个 TCP 链接,且浏览器为了控制资源,还会对单个域名有 6-8个的TCP链接请求限制。 HTTP2中:
- 同域名下所有通信都在单个连接上完成。
- 单个连接可以承载任意数量的双向数据流。
- 数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装,也就是
Stream ID,流标识符,有了它,接收方就能从乱序的二进制帧中选择ID相同的帧,按照顺序组装成请求/响应报文。
3.服务器推送
- 浏览器发送一个请求,服务器主动向浏览器推送与这个请求相关的资源,这样浏览器就不用发起后续请求。
- 客户端可以缓存推送的资源
4.二进制分帧
- 之前是明文传输,不方便计算机解析,对于回车换行符来说到底是内容还是分隔符,都需要内部状态机去识别,这样子效率低,HTTP/2采用二进制格式,全部传输01串,便于机器解码。
5.多路复用
- 在客户端与服务器之间,双方都可以互相发送二进制帧,这种
双向传输的序列,称为流,所以HTTP2.0中以流来表示一个TCP连接上进行多个数据帧的通信,这就是多路复用概念。