HTTP的升级之路
HTTP简介
HTTP(HyperText Transfer Protocol,超文本传输协议)是一种用于分布式、协作式和超媒体信息系统的应用层协议[1]。HTTP是万维网的数据通信的基础设计HTTP最初的目的是为了提供一种远距离共享知识的方式,借助多文档进行关联实现超文本,连成相互参阅的WWW(world wide web,万维网)HTTP的发展是由蒂姆·伯纳斯-李(Tim Berners-Lee)于1989年在欧洲核子研究组织(CERN)所发起。HTTP的标准制定由万维网协会(World Wide Web Consortium,W3C)和互联网工程任务组(Internet Engineering Task Force,IETF)进行协调,最终发布了一系列的RFC,其中最著名的是1999年6月公布的 RFC 2616,定义了HTTP协议中现今广泛使用的一个版本——HTTP 1.1版
HTTP工作过程
HTTP协议是工作在TCP/IP协议上的应用层协议。
工作过程如下:
1.DNS解析,获取域名真实IP地址
2.建立TCP连接,就是常见的TCP三次握手,并协商传输的各种规范,如压缩格式等
3.客户端发送http请求(request)
4.服务器端接收客户端发送的http请求,并作出处理,如寻找静态资源,查询数据库等操作。
5.服务器端构建相应报文,将处理好的数据以一定的规范发送给客户端作为相应报文(response)
6.客户端浏览器接收处理服务器端的数据,解析数据格式,如html,css,js等,将效果渲染在浏览器
7.完成会话,断开连接(TCP四次挥手)
完整过程如下:
HTTP协议的发展
HTTP/0.9
仅支持GET命令,服务器仅相应html格式的字符串
HTTP1.0
支持了cache,MIME,methord
cache:缓存机制,加速了访问过程
MIME:(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型。类型支持包括video,MP3,MP4,jpg,gz等格式的媒体数据
,返回给客户端时使用content-type告知其数据类型,常见Content-Type值:text/xml image/jpeg audio/mp3
method:增加了HEAD和POST方法。
问题:由于http1.0版本连接过程为没建立一次连接只能发送一个请求,一个请求处理完成就关闭连接,如果有新的请求则需要重新建立连接,因此增加了连接时的资源损耗,且影响了性能,因此在http1.1引入了新的解决方法。
HTTP1.1
http1.1引入了持久化连接(keepalive),每次建立连接不直接关闭,而是等待请求次数或者连接时间过期才会断开连接,即针对同一个连接默认不关闭,可以同时处理多个请求,从而提升了http协议的效率。
增加方法:PATCH,PUT,OPTIONS,DELETE
http1.1中同一个TCP请求中是按次序进行的,服务器端顺序处理回应,如果前面的处理慢,则后面的请求就会阻塞排队,造成“队头阻塞”,解决方法为:减少请求(不现实)或者增加持久化连接。
网页优化:图片嵌入CSS代码、域名分片等
http是无状态的,即相应结果后不知道客户端是做何处理,所以客户端每次请求都需要带上所有的信息,浪费带宽,影响性能。
http1.0和1.1的主要区别总结
1.长连接
,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,弥补了HTTP1.0每次请求都要创建连接的缺点。
2.缓存处理
,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略.
If-Modified-Since:通过文件的访问时间
判断是否被修改策略中的参数
Entity tag:通过文件的哈希值判断文件是否被修改
策略中的参数
详细信息可以参考:http缓存机制
https://segmentfault.com/a/1190000020801458?utm_source=tag-newest
3.带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如:客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域
,它允许只请求资源的某个部分,即返回码206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接错误通知的管理,在HTTP1.1中新增24个状态响应码
,如409(Conflict)表示请求的资源与资源当前状态冲突;410(Gone)表示服务器上的某个资源被永久性的删除。
4.Host头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP1.1的请求消息和响应消息都应支持Host头域
,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
HTTP1.X存在的问题
1.数据传输都是明文,存在安全性的问题
2.请求头heads里的传输内容过大,增加了传输成本
3.虽然keepalive保证了传输的持久化,但是依然存在着问题,比如请求一张图片,希望请求后就断开连接,由于持久化连接的原因不能及时释放,这样也给服务器带来了大量的性能压力
HTTPS协议
为了解决明文的问题,引入了HTTPS协议,即HTTPS=HTTP+TSL(SSL)
,ssl就是安全加密的协议,两者并用即传输加密,保证了数据的安全性。
注:TSL就是SSL的升级版,说白了就是换个名字而已
特点:
1.HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费
2.HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
3.HTTP和HTTPS使用的是不同的连接方式,端口不同,前者是80,后者是443
4.HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题
5.HTTPS 实现过程降低用户访问速度,但经过合理优化和部署,HTTPS 对速度的影响还是可以接受的
基于SPDY协议的HTTP2.0
SPDY协议:2009年,谷歌研发,综合HTTPS和HTTP两者有点于一体的传输协议,主要特点:
1.降低延迟
,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)
。多路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率
浏览器阻塞(HOL blocking):浏览器会因为一些原因阻塞请求。浏览器对于同一个域名,同时只能有 4 个连接(这个根据浏览器内核不同可能会有所差异),超过浏览器最大连接数限制,后续请求就会被阻塞。
2.请求优先级(request prioritization)
。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,重要的请求就会优先得到响应。比如浏览器加载首页,首页的html内容应该优先展示,之后才是各种静态资源文件,脚本文件等加载,可以保证用户能第一时间看到网页内容
3.header压缩
。HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量
4.基于HTTPS的加密协议传输,大大提高了传输数据的可靠性
5.服务端推送(server push)
,采用了SPDY的网页,例如网页有一个sytle.css的请求,在客户端收到sytle.css数据的同时,服务端会将sytle.js的文件推送给客户端,当客户端再次尝试获取sytle.js时就可以直接从缓存中获取到,不用再发请求了
HTTP2.0:SPDY协议的升级版
特点:
1.头信息和数据体都是二进制
,称为头信息帧和数据帧
2.复用TCP连接
,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了“队头堵塞“,此双向的实时通信称为多(Multiplexing)
3.引入头信息压缩机制(header compression)
,头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
4.HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)
,一个网页里是有许多资源的,通常是先获取主页面,然后从主页面中重新发起请求获取其他资源,而服务器推送可以主动将主页面中的其他资源不经客户端同意直接推送给客户端,从而减少了请求的资源,加快的传输效率
HTTP2.0和SDPY的区别:
2.0不强制要求加密,SPDY强制
消息头压缩算法不同:HTTP2.0 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DEFLATE
HTTP请求方法
GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
POST:用于传输信息给服务器,主要功能与GET方法类似,但一般推荐使用POST方式。
PUT: 传输文件,报文主体中包含文件内容,保存到对应URI位置。
HEAD: 获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:删除文件,与PUT方法相反,删除对应URI位置的文件。
OPTIONS:查询相应URI支持的HTTP方法。
HTTP常见状态码
200:请求被正常处理
204:请求被受理但没有资源可以返回
206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
301:永久性重定向
302:临时重定向
303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙