HTTP是浏览器中服务器和浏览器之间的传输协议,是前后端开发人员都要掌握的知识点,无论是开发还是面试,都是绕不开的话题,今天一起来学习一下相关知识,演进历程差不多算是从HTTP/1到即将来临的HTTP/2,再到未来的HTTP/3
1991年诞生了HTTP/0.9,当时主要是为了在服务器和浏览器之间传输HTML文件,也称之为超文本传输协议(HyperText Transfer Protocol), 实现比较简单,客户端发起请求,服务端返回数据
来看一下HTTP/0.9的一个完整的请求流程:
当时的HTTP主要就是为了传输体积较小的HTML文件,并没有太复杂的需求,所以当时的HTTP\0.9比较简单,一个请求行就可以了,没有请求头和请求体,服务器也没有响应头,并且使用简单的ASCII字符流也能满足文件的传输
随着万维网的飞速发展,0.9的策略已经不能再满足很多新的需求了,因为这时候不只是HTML文件了,随之而来的又有CSS文件,JavaScript脚本文件,图片,音频等等,这时候一种支持多种类型的文件传输协议就显得格外重要,并且传输形式也不能局限于ASCII字符流了,多种类型编码的文件也要支持
在0.9时代,请求只是HTML文件,没有更多的请求信息,比如文件编码以及类型等,服务器也不会返回更多的信息给浏览器,比如cookie,last-modified等,很显然这种交流传输的信息内容较少
在1.0时代,引入了请求头和响应头的概念,以key-value的形式存在,发送请求的时候带上请求头,服务器返回资源上带上响应头
想要支持多种类型的文件,需要解决下面几个问题:
基于上面的问题,1.0通过请求头和响应头来进行协商,发起请求的时候会通过HTTP请求头来告诉服务器期待什么类型的文件,压缩形式以及编码方式等,发送请求头如下所示:
accept: text/html
accept-encoding: gzip, deflate, br
accept-Charset: ISO-8859-1,utf-8
accept-language: zh-CN,zh
服务器接收到浏览器发送过来的请求头信息之后,会根据请求头的信息来准备相应数据,但是也会出现一些服务器资源压缩形式与请求形式不一致的情况,比如浏览器的请求压缩形式是gzip,而服务器上资源的压缩形式是br,那么这个时候浏览器会在响应头里通过content-encoding告诉浏览器,这个时候浏览器会根据最终的压缩形式来解析对应的资源,下面是一个例子:
content-encoding: br
content-type: text/html; charset=UTF-8
拿到了响应头信息之后,浏览器根据压缩方式br来解压文件,再按照编码格式UTF-8的形式来处理原始文件,最后按照HTML的方式来解析
除了上述几个功能之外,在1.0时代还额外增加了以下几个特性:
需求一直在推动技术的进步,随着技术的发展,1.1又持续改进:
1.0时代,每次HTTP请求都会经历TCP连接,数据传输,TCP断开连接三个阶段
随着文件的增大,数量的增多,每次都要建立连接,断开连接,这样会增加很多额外的开销,所以在1.1时代,增加了持久连接的方法,即 一个TCP连接可以传输多个HTTP请求,只要浏览器或者服务器没有主动断开连接,那么该连接会一直处于激活状态
HTTP的持久连接会减少TCP的连接次数,减少了服务器的压力,提升了效率,在请求头和响应头中都有一个connection:keep-alive字段,如果想要关闭可以设置为connection:close。目前浏览器对同一域名,默认运行同时建立6个持久TCP连接
1.0时代,一个主机对应一个IP,一个IP对应一个域名,随着虚拟机技术的进步,一个物理机可以绑定多个虚拟机,每个虚拟机又可以有自己单独的域名,这些域名都对应同一个IP地址。
在1.1时代,在请求头里还会有一个host字段,用来表明请求的域名地址,这样服务器就可以根据域名再找对应的虚拟机来做处理