在HTTP0.9中,只有GET方法,没有请求头headers,没有状态码,只能用于传输HTML文件。
到了HTTP1.0(1996),HTTP1.0传输请求头,有状态码,并且新增了POST和HEAD方法。
HTTP1.0中,使用短连接,当服务器返回数据之后,就会断开连接,每次发送请求,都要重新建立连接(三次握手)然后传输数据,然后再断开连接。如果一个HTML文件中有多个CSS JS等文件的请求,就会建立多个连接。串行请求。
到了HTTP1.1(1997年),HTTP1.1默认开启长连接。每次一个请求处理完成后连接不会直接断开,一次通信中,可以发送多个请求,没有不断建立和断开连接的开销。它允许浏览器端不必等待上一个请求响应,就可以发送下一个请求。但是服务器端必须按顺序响应并返回。
服务器发送响应时,可以不等整个响应完毕再返回,可以返回小的响应块,这可能会加快初始页面的呈现速度。
HTTP1.1还增加了cache-control缓存机制,ETag、If-Modified-Since。
但HTTP1.1存在队头阻塞的问题,如果一个请求的响应需要很久,后续的响应就必须等待上一个响应返回才能处理。
HTTP2(2015)引入了二进制帧,多路复用,首部压缩和服务器推送。
二进制帧:HTTP2采用二进制传输数据,而非文本格式,更加高效。
将请求和响应数据分割为更小的帧,并且它们采用二进制编码。每个数据流都以消息的形式发送,而消息又由一个或多个帧组成。多个帧之间可以乱序发送,根据帧首部的流标识可以重新组装,这也是多路复用同时发送数据的实现条件。
多路复用:允许一个TCP连接中,同时发送多个请求和多个响应。响应不用按照顺序一一对应。避免了队头堵塞。
首部压缩/头部压缩:建立头部索引表,将传输过的头部存入表中,下次传输时,如果表中有这个头部,就传输索引号,否则传输请求头。
服务器推送:服务器向客户端建立连接。一般请求都是客户端向服务器发起,但有了服务器推送,服务器端可以告知客户端还有信息要传输,客户端不关闭连接,而是待机等待。