基于HTTP的协议

本文详细介绍了SPDY如何优化HTTP性能,包括多路复用、请求优先级和压缩首部,以及WebSocket的全双工通信、推送功能和WebSocket协议的工作原理。通过对比Ajax和Comet,展示了SPDY在解决HTTP瓶颈和实时通信上的进步。
摘要由CSDN通过智能技术生成

声明:本人的所有博客皆为个人笔记,作为个人知识索引使用,因此在叙述上存在逻辑不通顺、跨度大等问题,希望理解。分享出来仅供大家学习翻阅,若有错误希望指出,感谢!

基于HTTP的协议

SPDY

其开发目标在解决HTTP的性能瓶颈,缩短Web页面的加载时间(50%)

HTTP的瓶颈

  • 一条连接上只可发送一个请求
  • 请求只能从客户端开始,客户端不可以接收除响应以外的指令
  • 请求/响应首部未经压缩就发送,首部信息越多延迟越大
  • 发送冗长的首部,每次互相发送相同的首部造成的浪费较多
  • 可任意选择数据压缩格式,非强制压缩发送

Ajax解决方案

Ajax(Asynchronous JavaScript and XML)是一种利用JavaScript和DOM的操作,以达到局部web页面替换加载的异步通信手段,由于它只更新一部分页面,响应中传输的数据量会因此减少

  • Ajax的核心技术是名为XMLHttpRequest的API,通过JavaScript脚本语言的调用就能和服务器进行HTTP通信
  • 利用Ajax实时从服务器获取内容,有可能会导致大量请求产生,另外Ajax未解决HTTP协议本身存在的问题

Coment解决方案

一旦服务器端有内容更新了,Coment不会让请求等待,而是直接给客户端返回响应这是一种通过延迟应答,模拟实现服务器端向客户端推送的功能

  • 为了实现推送功能,Comet会先将响应置于挂起状态,当服务器端有内容更新时,再返回该响应。因此,服务器端一旦有更新, 就可以立即反馈给客户端
  • 内容上虽然可以做到实时更新,但为了保留响应,一次连接的持续时间也变长了。期间,为了维持连接会消耗更多的资源。另外,Comet也仍未解决HTTP协议本身存在的问题

SPDY 的设计与功能

  • SPDY没有完全改写HTTP协议,而是在TCP/IP的应用层与传输层之间通过新加会话层的形式运作。同时,考虑到安全性问题,SPDY规定通信中使用SSL
  • SPDY以会话层的形式加人,控制对数据的流动,但还是采用HTTP建立通信连接。因此,可照常使用HTTP的GET和POST等方法、Cookie 以及HTTP报文等

使用SPDY后,HTTP协议额外获得以下功能

多路复用流

通过单一的TCP连接,可以无限制处理多个HTTP请求,所有请求的处理都在一条TCP连接上完成,因此TCP的处理效率得到提高

赋子请求优先级

SPDY不仅可以无限制地并发处理请求,还可以给请求逐个分配优先级顺序。这样主要是为了在发送多个请求时,解决因带宽低而导致响应变慢的问题

压缩HTTP首部

用缩HTTP请求和响应的首部。这样一来, 通信产生的数据包数量和发送的字节数就更少了

推送功能

支持服务器主动向客户端推送数据的功能。这样,服务器可直接发送数据,而不必等待客户端的请求

服务器提示功能

服务器可以主动提示客户端请求所需的资源。由于在客户端发现资源之前就可以获知资源的存在,因此在资源已缓存等情况下,可以避免发送不必要的请求

全双工通信WebSocket

WebSocket 的设计与功能

  • WebSocket,即Web浏览器与Web服务器之间全双工通信标准
  • WebSocket技术主要是为了解决Ajax和Comet里XMLHttpRequest附带的缺陷所引起的问题

WebSocket 协议

  • 一旦Web服务器与客户端之间建立起WebSocket协议的通信连接,之后所有的通信都依靠这个专用协议进行。通信过程中可互相发送JSON、XML、HTML或图片等任意格式的数据
  • 由于是建立在HTTP基础上的协议,因此连接的发起方仍是客户端,而一旦确立WebSocket通信连接,不论服务器还是客户端,任意一方都可直接向对方发送报文

WebSocket 协议的主要特点:

推送功能

支持由服务器向客户端推送数据的推送功能。这样,服务器可直接发送数据,而不必等待客户端的请求

减少通信量

只要建立起WebSocket连接,就希望一直保持连接状态。 和HTTP相比,不但每次连接时的总开销减少,而且由于WebSocket的首部信息很小,通信量也相应减少了


为了实现WebSocket通信,在HTTP连接建立之后,需要完成一次“握手”的步骤

握手:请求

为了实现WebSocket通信,需要用到HTTP的Upgrade首部字段,告知服务器通信协议发生改变,以达到握手的目的

GET /chat HTTP/1.1
Host:server.example.com
Upgrade:websocket
Connection:Upgrade
Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==
Origin:http://example.com
Sec-WebSocket-Protocol:chat,superchat
Sec-WebSocket-Version:13
  • ScWebSokrKkey字段内记录着握手过程中必不可少的建值
  • Sec-WebSocket-Protocol字段内记录使用的子协议
    • 子协议按WebSocket协议标准在连接分开使用时,定义那些连接的名称
握手:响应

对于之前的请求,返回状态码101 Switching Protocols的响应

HTTP /1.1 101 Switching Protocols
Upgrade:websocket
Connection:Upgrade
Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbk+xOo=
Sec-WebSocket-Protocol:chat
  • See-Websocket-Accept的字段值是由握手请求中的Sec-WebSocket-Key的字段值生成的

成功握手确立Websocket连接之后,通信时不再使用HTTP的数据帧,而采用WebSocket独立的数据帧

WebSocket API

JavaScript可调用"The WebSocket API”内提供的WebSocket 程序接口,以实现WebSocket协议下全双工通信

以下为调用WebSocket API,每50ms发送一次数据的实例

var socket = new WebSocket('ws://game.example.com:12010/updates')
socket.onopen = function(){
    setInterval(function(){
        if(socket.bufferedAmount == 0)
            socket.send(getUpdateData())
    },50);
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值