一、HTTP1.0
特点:无状态、短连接
HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(短连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。
二、HTTP1.1
特点:长连接、请求管道化、缓存处理、Host字段、断点传输
① 长连接
HTTP1.1增加了一个Connection字段,通过设置Keep-Alive可以保持HTTP连接不断开,避免了每次客户端与服务器请求都要重复建立释放建立TCP连接,提高了网络的利用率。如果客户端想关闭HTTP连接,可以在请求头中携带Connection: false来告知服务器关闭请求。
② 请求管道化、
基于HTTP1.1的长连接,使得请求管线化成为可能。管线化使得请求能够“并行”传输。举个例子来说,假如响应的主体是一个html页面,页面中包含了很多img,这个时候keep-alive就起了很大的作用,能够进行“并行”发送多个请求。(注意这里的“并行”并不是真正意义上的并行传输,具体解释如下。)
需要注意的是,服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。
也就是说,HTTP管道化可以让我们把先进先出队列从客户端(请求队列)迁移到服务端(响应队列)。
③ 缓存处理
HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略。
④ Host字段
HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)。
⑤ 断点传输
在上传/下载时,将任务(一个文件或压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传/下载,如果碰到网络故障,可以从已经上传/下载的部分开始继续上传/下载未完成的部分,而没有必要从头开始上传/下载。可以节省时间,提高速度。
三、HTTP2.0
特点:二进制传输、多路复用、头部压缩、服务器推送
HTTP2.0 最大的特点就是多路复用机制,对同一个域的服务器只建立一次TCP连接,并使用二进制方式传输数据,加载多个资源,同时会对http头部进行压缩。
① 二进制传输
HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。
② 多路复用(或连接共享)
每一个request请求都是共享连接的。由于一个request对应一个id,这样一个连接上就可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的id将request再归属到各自不同的服务端请求里面。可见,HTTP2.0实现了真正的并行传输,它能够在一个TCP上进行任意数量的HTTP请求。
③ 头部压缩
HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。
④ 服务器推送
http1.x中,网页的加载过程是这样的:请求主网页 => 解析网页 => 请求页面内的依赖资源(如 js、css 、图片等静态文件) => 加载依赖资源。由于每一个依赖资源都必须明确地向服务器端发送请求,这样会导致加载过程非常缓慢。但是在http2.0中,服务器在响应浏览器第一个请求的时候,就可以开始推送这些依赖的资源,而无需客户端明确的向其发起请求。
四、升级到 HTTP2.0
由于 HTTP2.0 基本上只支持https协议,所以要确保网站必须支持https访问才行。SSL的安装与配置此处省略,此处只讨论Apache与Nginx服务器中如何配置http2.0。
Nginx配置http2.0
修改nginx.conf配置文件,加入如下内容:
server {
listen 443 ssl http2;
server_name 域名;
ssl_certificate /root/your.cert;
ssl_certificate_key /root/your.key;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM;
ssl_prefer_server_ciphers on;
}
Apache2.4配置http2.0
修改 httpd.conf 文件
将 LoadModule http2_module modules/mod_http2.so 前面的注释取消掉,即可启用http2模块。启用之后,还需要做如下配置:
如果是对全局启用,在 httpd.conf 文件中加入下面的配置即可。
Listen 443
<IfModule http2_module>
ProtocolsHonorOrder On
LogLevel http2:info
Protocols h2 h2c http/1.1
</IfModule>
如果是对某个虚拟主机启用,则需要在 httpd-vhosts.conf 文件中加入下面的配置。
<VirtualHost *:443>
ServerName 域名
DocumentRoot "项目根目录"
<Directory "/">
Options None
AllowOverride All
Require all granted
</Directory>
<IfModule http2_module>
ProtocolsHonorOrder On
LogLevel http2:info
Protocols h2 h2c http/1.1
</IfModule>
</VirtualHost>
注意:此处使用的是 https 默认的443端口。