HTTP——新增协议
HTTP建立之初,只是用于传输HTML文档,所以功能非常简单。但如今的Web应用的用途越来越多样,需求也不断变化,HTTP已无法满足。在不抛弃HTTP的基础上,新建立了一些协议用以满足新需求。
HTTP的性能瓶颈
用户庞大的社交网站在短时间内就会有大量用户发布内容,Web页面则要在短时间内就对大量内容进行更新。这需要做到服务器的数据一有更新,就需要将内容反馈到客户端的界面上。
根据HTTP协议标准,其很难满足这种短间隔内更新大量数据的需求:
- 一条连接上只可发送一个请求
- 请求只能从客户端开始,客户端不可以接收除响应以外的指令
- 请求 / 响应首部未经压缩就发送,首部信息越多延迟越大
- 发送冗长的首部,每次互相发送相同的首部造成的浪费较多
- 可任意选择数据压缩格式,非强制压缩发送
解决一:Ajax
Ajax是一种可以达到局部加载更新Web页面的异步通信手段。和原始的同步通信相比,它只更新一部分页面,响应中传输的数据量会因此而减少,优势明显。
Ajax的核心技术是名为XHR的API,通过JS语言的调用就能和服务器进行HTTP通信。借用这种手段,就能从已加载完毕的Web页面上发起请求,只更新局部页面。
缺点:利用Ajax实时从服务器获取内容,可能会导致大量请求产生。另外,Ajax仍未解决HTTP协议本身存在的问题,即首部冗余和非强制压缩等。
解决二:Comet
为了解决Ajax大量请求的问题,Comet通过延迟应答,模拟实现服务器向客户端推送的功能。
通常服务器在接收到请求后会立即响应,但Comet会先将响应挂起,当服务器内有内容更新时,再返回该响应。因此,服务器一旦有更新,就可以立即返回给客户端。
缺点:为了保留相应,一次连接的时间也变长了。为了维持连接也会消耗更多的资源。并且,首部冗余和非强制压缩等HTTP本身的问题也没有解决。
解决三:SPDY
Google于2010年发布了SPDY,目的在于解决HTTP的性能瓶颈,缩短Web页面的加载时间(50%)。
对HTTP本身的小修小改都无法突破HTTP本身的限制,所以需要协议层的改动。SPDY协议就是为了消除HTTP的瓶颈。
SPDY是在TCP/IP的应用层与运输层之间通过新加会话层的形式运作。SPDY以会话层的形式加入,控制对数据的流动。但还是采用HTTP建立通信连接。
使用SPDY后,HTTP获得额外功能:
- 多路复用流
通过单一的TCP连接,可以无限制处理多个HTTP请求。所有请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高。 - 赋予请求优先级
不仅可以无限并行处理请求,还可以给请求分配优先级,解决因带宽不够而导致响应变慢的问题。 - 压缩HTTP首部
压缩首部,通信产生的数据包数量和发送的字节数就更少了。 - 推送功能
支持服务器主动向客户端推送数据的功能。 - 服务器提示功能
服务器可主动提示客户端请求所需的资源,避免不必要的请求。
缺点:该技术在实际应用中效果不佳, 因为SPDY基本上只是将单个域名(IP地址)的通信多路复用,所以当一个Web网站上使用多个域名下的资源,改善效果就会受到限制。
使用浏览器进行全双工通信的WebSocket
利用Ajax和Comet技术进行通信可以提升Web的浏览速度。但若使用HTTP协议,就无法彻底解决瓶颈问题,WebSocket真是为解决这些问题而实现的一套新协议及API。
WebSocket曾计划将其作为HTML5标准的一部分,而它逐渐变成了独立的协议标准。在2011年被正式定为标准。
一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,不论哪方都可以直接向对方发送报文。
WebSocket功能:
- 推送功能
支持服务器向客户端推送数据。 - 减少通信量
只要建立起WebSocket连接,就一直保持连接状态。减少了每次连接的开销。此外,WebSocket的首部信息很小,通信量也相应减少了。
为建立WebSocke通信,需要完成一次“握手”的步骤,这次“握手”是通过HTTP实现的,需要用到HTTP的Upgrade首部字段,告知服务器通信协议发生改变。对于该请求,服务器返回状态码101 Switching Protocols。成功握手建立WebSocket连接。