最近整理了一下http的历史发展,学习参考。
http/2相比与http/1.1,提高了网络的性能优化;
http/3适用于http/2的部分问题优化。
一、http/1.1存在着以下缺陷
1、网络延迟
网络延迟主要是由于队头阻塞(Head-Of-LineBlocking),导致宽带无法被充分利用。
队头阻塞是指当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。
2、无状态
Header里携带了大量的内容(User Agent、Cookie、Accept、Server等头部字段),而body却只有很少的数据(如Get请求、204/301/304响应),Header在一定程度上增加了传输成本。其次在响应头中很多都是重复的。
3、明文传输
传输数据时采用的都是明文传输,客户端与服务端无法验证对方,不能保证数据的安全性。
4、不支持服务器推送消息
> 由于http/1.1的缺陷,所以我们会做引入雪碧图、将小图内敛、使用多个域名等来提高性能。而这些优化措施都是绕开了协议。
二、http/2
谷歌SPDY协议的出现,为解决http/1.1效率不高(降低网络延迟、压缩header等)的问题提供了方法,最终带来了http/2的诞生。
SPDY协议位于http之下,TCP和SSL之上(便于兼容老版本的http协议),不是一种用于替代HTTP的协议,而是对HTTP协议的增强。
SPDY协议的功能包括数据流的多路复用、请求优先级以及HTTP报头压缩。引入SPDY协议后,页面加载速度比原先快64%。
http/2基于SPDY协议,专注于性能,最大的一个目标是在用户和网站见只用了一个链接。
1、二进制传输
以二进制的方式传输和Header压缩,从而促使传输的数据量大量减少(而HTTP/1.x 里是纯文本形式的报文)。
http/2将请求和响应数据分割为更小的帧,用"HEADERS"帧存放头数据、"DATA"帧存放实体数据。http/2数据分帧后"Header+Body"的报文结构就完全消失了,协议看到的只是一个个的"碎片"。
http/2 中,同域名下所有通信都在单个连接上完成,该连接可以承载任意数量的双向数据流。每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装。
2、Header压缩
http/2采用了专门的“HPACK”算法,在客户端与服务端两端建立“字典”,用索引号标示重复的字符串。
采用哈夫曼编码压缩整数和字符串。
达到了50%~90%的高压缩率。
实现:
在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;
首部表在HTTP/2的连接存续期内始终存在,由客户端和服务器共同渐进地更新;
每个新的首部键-值对要么被追加到当前表的末尾,要么替换表中之前的值
3、多路复用
多路复用技术解决了浏览器限制同一个域名下的请求数量问题,同时也间接更容易实现全速传输。同时一个 TCP 连接就可以传输所有的请求数据。
http2的通信优势:(有了二进制分帧,不用再依赖 TCP 链接去实现多流并行)
同域名下所有通信都在单个连接上完成;
单个连接可以承载任意数量的双向数据流;
数据流以消息的形式发送,而消息又由一个或多个帧组成,多个帧之间可以乱序发送,因为根据帧首部的流标识可以重新组装(这一特性,使性能有了极大提升);
同个域名只需要占用一个 TCP 连接,使用一个连接 并行发送 多个请求和响应。这样整个页面资源的下载过程只需要一次慢启动,同时也避免了多个TCP连接竞争带宽所带来的问题。
并行交错地发送多个请求/响应,请求/响应之间互不影响。
在HTTP/2中,每个请求都可以带一个31bit的优先值,0表示最高优先级, 数值越大优先级越低。有了这个优先值,客户端和服务器就可以在处理不同的流时采取不同的策略,以最优的方式发送流、消息和帧。

4、Server Push
HTTP2还在一定程度上改变了传统的“请求-应答”工作模式,服务器不再是完全被动地响应请求,也可以新建“流”主动向客户端发送消息。
比如,在浏览器刚请求HTML的时候就提前把可能会用到的JS、CSS文件发给客户端,减少等待的延迟,这被称为"服务器推送"( Server Push,也叫 Cache push)。
5.提高安全性
出于兼容的考虑,HTTP/2延续了HTTP/1的“明文”特点,可以像以前一样使用明文传输数据,不强制使用加密通信,不过格式还是二进制,只是不需要解密。
但由于HTTPS已经是大势所趋,而且主流的浏览器Chrome、Firefox等都公开宣布只支持加密的HTTP/2,所以“事实上”的HTTP/2是加密的。
也就是说,互联网上通常所能见到的HTTP/2都是使用"https”协议名,跑在TLS上面。HTTP/2协议定义了两个字符串标识符:“h2"表示加密的HTTP/2,“h2c”表示明文的HTTP/2。

三、http/3
http2存在问题:
TCP 以及 TCP+TLS建立连接的延时;
TCP的队头阻塞并没有彻底解决。
HTTP/3是一个基于 UDP 协议的“QUIC”协议,让HTTP跑在QUIC上而不是TCP上。它在HTTP/2的基础上又实现了质的飞跃,真正“完美”地解决了“队头阻塞”问题。

QUIC新功能
上面我们提到QUIC基于UDP,而UDP是“无连接”的,根本就不需要“握手”和“挥手”,所以就比TCP来得快。此外QUIC也实现了可靠传输,保证数据一定能够抵达目的地。它还引入了类似HTTP/2的“流”和“多路复用”,单个“流"是有序的,可能会因为丢包而阻塞,但其他“流”不会受到影响。
具体来说QUIC协议有以下特点:
1、实现了类似TCP的流量控制、传输可靠性的功能。
2、虽然UDP不提供可靠性的传输,但QUIC在UDP的基础之上增加了一层来保证数据可靠性传输。它提供了数据包重传、拥塞控制以及其他一些TCP中存在的特性。
3、实现了快速握手功能(RTT:往返时延)。
由于QUIC是基于UDP的,所以QUIC可以实现使用0-RTT或者1-RTT来建立连接,这意味着QUIC可以用最快的速度来发送和接收数据,这样可以大大提升首次打开页面的速度。0RTT 建连可以说是 QUIC 相比 HTTP2 最大的性能优势。
4、集成了TLS加密功能。
目前QUIC使用的是TLS1.3,相较于早期版本TLS1.3有更多的优点,其中最重要的一点是减少了握手所花费的RTT个数。
5、多路复用,彻底解决TCP中队头阻塞的问题。
和TCP不同,QUIC实现了在同一物理连接上可以有多个独立的逻辑数据流(如下图)。实现了数据流的单独传输,就解决了TCP中队头阻塞的问题。

四、总结
HTTP/1.1有两个主要的缺点:安全不足和性能不高。
HTTP/2完全兼容HTTP/1,是“更安全的HTTP、更快的HTTPS",头部压缩、多路复用等技术可以充分利用带宽,降低延迟,从而大幅度提高上网体验;
HTTP/3采用了QUIC协议,QUIC 基于 UDP 实现的,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议。
五、http状态码有哪些?
1、分类
1xx 【消息】服务器收到请求,需要请求者继续执行操作
2xx 【成功】请求已成功被服务器接收、理解、并接受。
3xx 【重定向】客户端需要采取进一步的操作以完成请求
4xx 【客户端请求错误】客户端错误,请求包含语法错误或无法完成请求
5xx 【服务器错误】服务器在处理请求的过程中发生了错误
2、常见状态码
200 OK //客户端请求成功
304 Not Modified // 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized // 当前请求要求用户的身份认证
403 Forbidden // 服务器理解请求客户端的请求,但是拒绝执行此请求
404 Not Found //请求资源不存在,输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable // 由于超载或系统维护,服务器暂时的无法处理客户端的请求。一段时间后可能恢复正常
源文章地址:https://blog.csdn.net/howgod/article/details/102597450
网友评论