HTTP0.9
在Http刚兴起的时候,主要用来传输一些文本文档,页面内容页比较单一。所以早期的HTTP0.9版本中,只支持传输简单的HTML文档。
HTTP1.0
随着拨号上网的发展,网速有了一定的提升。支持多类型文件的传输(图片、音频、视频、js、css等)成为HTTP发展的主要诉求。在HTTP1.0版本中,通过引入了请求头和响应头,去帮助浏览器表达它希望收到的资源类型、压缩方式、编码方式及语言类型,帮助服务器通知浏览器返回资源的类型、编码方式、压缩方式及语言类型。浏览器通过响应头中对应的字段,判断出对应的文件类型,压缩方式等,进行针对性的处理。
同时,为了表示对请求的处理结果,即如果请求的资源不存在或者服务器不能处理请求了,也会返回对应的表示,引入了HTTP状态码机制。
为了加快浏览器的呈现,节省带宽资源,引入了Cache机制(expires),对一些资源进行缓存,以便再次获取时能利用本地缓存。
为了统计用户设备信息,请求中头加入了用户代理(user-agent)字段。
HTTP1.1
随着一个页面中引用的资源越来越多,以往的连接方式需要改进。以前,发起一个请求需要通过3次握手建立TCP连接,资源获取完成后,通过四次挥手断开连接。每请求一个资源都要经历这样的过程。在HTTP1.1版本中,为了节省建立TCP连接的开销,引入了持久连接(keep-alive)。即在发起一个请求建立TCP连接后,资源获取完成后不关闭TCP连接,继续利用这个TCP链接获取其它的资源,直到资源获取完毕。
除此之外,随着技术的发展,有很多资源是动态生成的,直到拿到它的那刻才能够直到它的content-length。所以在该版本中通过chunk transfer增加了对动态内容的支持。
随着电子商务、邮件服务等的发展,对安全性的要求也日益突出,所以引入了TLS加密机制,通过CA证书和加密秘钥增强安全性。
由于HTTP协议是无状态的,服务器不会识别到上次访问的用户,但是对于电子商务等一些需要服务器识别访问者的场景,引入了COOKIE机制。
HTTP2.0
在数据传输时,在一个TCP连接中,一个请求发送给服务器,后边的请求会等到该请求返回后才继续向服务器发请求。对于一些关键资源,如果它在请求队列中位置靠后,那在页面中就不能提早的获取到它。而且,在HTTP1.0中,一个域名最多能建立6个TCP连接。在TCP连接发送数据的过程中,发送数据的速度会有一个慢启动的过程。同时,多个TCP连接也会竞争有限的带宽。于是乎,就有了多路复用机制。多路复用机制通过一个域名建立一个TCP长连接,引入二进制分帧层,对发送的请求分成一个个数据包,加上对应的ID编号,不段地发送给服务器。服务器收到数据包后,根据同一请求所属的ID,将数据包进行整合,得出一个完整的请求,然后将数据发送给浏览器。
之前浏览器和服务器通信,只能是浏览器发起请求,服务器响应请求。在HTTP2.0中加入了服务器主动推送的能力。
HTTP3.0
在TCP传输过程中,如果一个数据包丢失,那后续的待传输队列就会等到该数据包重传成功后再继续传输。当丢包率超过一定限度时,HTTP2.0的传输性能倒不如HTTP1.0了。这个叫做TCP队头阻塞。为了处理这个问题,HTTP3.0中将TCP协议换为UDP协议,并在UDP协议和HTTP协议中间加了QUIC协议。在QUIC协议层实现了流量控制和传输可靠性、TLS加密以及多路复用等。
最后,一起来总结下:
- http0.9: 只支持传输简单的html文档,用于学术交流
- http1.0: 多类型文件支持(引入请求头和响应头),状态码,Cache机制,用户代理(user-agent)
- http1.1: 持久连接(keep-alive), 动态内容的支持(content-length, chunk-transfer), cookie和安全机制,虚拟主机支持(请求头中的Host)
- http2: 多路复用(多个TCP竞争带宽、TCP慢启动、队头阻塞), 服务器推送 (丢包率的增加会使得多路复用的效率降低)
- http3: 使用UDP协议替换TCP协议,同时在UDP协议上增加了QUIC协议,处理流量控制和传输可靠性、TLS加密、多路复用等。