超文本传输协议
HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范
链接层
网络层
传输层
应用层
物理层
数据链路层
网络层
传输层
会话层
表示层
应用层
GET / HTTP/1.1 | HTTP/1.1 200 OK |
---|
“安全”是指请求方法不会“破坏”服务器上的资源,即不会对服务器上的资源造成实质的修改。
只有 GET 和 HEAD 方法是“安全”的,因为它们是“只读”操作
“幂等”实际上是一个数学用语,被借用到了 HTTP 协议里,意思是多次执行相同的操作,结果也都是相同的,即多次“幂”后结果“相等”。
POST 是“新增或提交数据”,多次提交数据会创建多个资源,所以不是幂等的;而 PUT 是“替换或更新数据”,多次更新一个资源
客户端和服务器看到的 URI 是不一样的。客户端看到的必须是完整的 URI,使用特定的协议去连接特定的主机,而服务器看到的只是报文请求行里被删除了协议名和主机名的 URI。
在 URI 里对“@&/”等特殊字符和汉字必须要做编码,否则服务器收到 HTTP 报文后会无法正确处理。
优化HMAC算法
减少握手阶段
加密套件的简化
简化密钥协商算法
对header进行压缩,开发了专门的“HPACK”算法,在客户端和服务器两端建立“字典”,用索引号表示重复的字符串,
利用哈夫曼树对 响应和请求头进行编码。计算出先频率,编码。
不再是“Header+Body”的形式,而是分散为多个二进制“帧”
它是二进制帧的双向传输序列,HTTP/2 就可以在一个 TCP 连接上用“流”同时发送多个“碎片化”的消息,这就是常说的“多路复用”( Multiplexing)——多个往返通信都复用一个连接来处理。而在“连接”的层面上看,消息却是乱序收发的“帧”。多个请求 / 响应之间没有了顺序关系,不需要排队等待,也就不会再出现“队头阻塞”问题,降低了延迟,大幅度提高了连接的利用率。
浏览器刚请求 HTML 的时候就提前把可能会用到的 JS、CSS 文件发给客户端,减少等待的延迟
也增强了安全性,要求至少是 TLS1.2,而且禁用了很多不安全的密码套件。
通常我们说队头阻塞,都是说tcp,但是HTTP1.1中也有一个类似TCP队头阻塞的问题
TCP是一种可靠传输,这个可靠就是体现在它能够“按序到达”,然后再被上层接收,这里的按序到达指的是最终顺序是按序排列的,也就是说每当有一个或几个Packet丢失的时候,会等待它到达后合并,然后再向上交付。
当一个流的第一个数据包丢失了,那么即使后面的数据包都到达了,后面的这些数据包也不能被处理,而是要等第一个数据包到了之后才能被上层接收处理
HTTP管道化要求服务端必须按照请求发送的顺序返回响应,那如果一个响应返回延迟了,那么其后续的响应都会被延迟,直到队头的响应送达。
对于HTTP1.1中管道化导致的请求/响应级别的队头阻塞,可以使用HTTP2解决。HTTP2不使用管道化的方式,而是引入了帧、消息和数据流等概念,每个请求/响应被称为消息,每个消息都被拆分成若干个帧进行传输,每个帧都分配一个序号。每个帧在传输是属于一个数据流,而一个连接上可以存在多个流,各个帧在流和连接上独立传输,到达之后在组装成消息,这样就避免了请求/响应阻塞。
当然,即使使用HTTP2,如果HTTP2底层使用的是TCP协议,仍可能出现TCP队头阻塞。
HTTP/2 虽然通过多路复用解决了 HTTP 层的队头阻塞,但仍然存在 TCP 层的队头阻塞。
连接双方的有任一个数据包丢失,或任一方的网络中断,整个TCP连接就会暂停,丢失的数据包需要被重新传输,从而阻塞该TCP连接中的所有请求,反而在网络较差或不稳定情况下,使用多个连接表现更好。
同时,TCP以及TCP+TLS建立连接存在的延迟(握手延迟)
因此提出了QUIC协议,一种基于UDP的低延时的互联网传输层协议。
QUIC基于UDP的低时延的互联网传输层协议,HTTP-over-QUIC于2018年11月更名为HTTP/3。
http3的主要目表是改进网络链接的性能和安全性。
在传统的 HTTP/1.1 和 HTTP/2 中,建立连接需要进行三次握手,这会引入一定的延迟。而在 HTTP/3 中,通过使用 QUIC 协议,可以实现零 RTT(Round-Trip Time)建立连接,即在建立连接的过程中不需要进行额外的往返时间。
QUIC 已经通过将传输和加密握手合并为一个,减少了典型连接握手的完整往返行程。
允许客户端在连接的第一次往返中发送应用程序数据,而无需事先完成任何其他握手。
UDP 是不可靠传输协议,(不保证交付,不保证顺序,不保证不重复)
QUIC 在每个数据包都设有一个 offset 字段(偏移量),接收端根据 offset 字段就可以对异步到达的数据包进行排序了,保证了有序性。
QUIC基于UDP, UDP的数据包在接收端没有处理顺序, 即使中间丢失一个包, 也不会阻塞整条连接. 其他的资源会被正常处理.