102 views

HTTP/2标准的发展 2–HTTP Server Push

image

Server Push是HTTP 1.X协议设计的一大痛点,但并非设计失误。回想前文RESTful风格,严格基于C/S模型。从未想到过支持Server发起请求。但Web发展的如此复杂,远不是浏览静态页面。为提升用户体验,不得不引入Server/Client消息通知。于是工程师们开始在HTTP1.X旧协议上做各种hack,新的标准也被引入进来,。

本想把已有Server Push技术学习总结一下,但是【1-5】这一系列文章很全面,且都提供源码。这里简述并实验一下。

1.Client Poll

与Server Push相对的是Client Poll,很容易理解,【1】提到两种poll方式。

1.1 Client定时向Server询问是否有事件

1.2 Piggyback

Server端将事件累积起来,在下一次应答Client请求的时候捎带送回去。有点像Linux异常的实现,在下一次系统调用的时候捎带把signal送回去。

这两种都是方式都是模拟,缺点显而易见。

2.Server Push

Server Pull的目的是即时将消息发送到Client。基于现有HTTP 1X有两种hack机制:long poll和HTTP streaming。

2.1 Long polling

long polling机制是:

1.Client发起一个请求,目的是创建一个控制通道。

2.server端保持这个请求,不应答,直到有事件产生,server发送response通知client。

3.一次事件通知后,连接关闭。client发起一个新的请求,重建控制通道,等待下次事件。

简言之,Client每个poll至少收到一个event响应(server也可以积攒多个事件,一次发送)。

 

2.2 Streaming

Stream利用了协议设计中的奇淫巧计,算是HTTP1X下hack方式Server Push实现的精华了。可以在同一连接,分多个部分发送HTTP response,我能立刻想到是chunked编码。

Server一直不发送last chunk,有事件就插入到chunk data通知Client,可以一直插入新的chunk data。这样一个HTTP连接可以用于多次事件通知,这也是streaming和long poll这两个名词的区别所在。

如果不理解chunked编码,可以参考我的一篇关于Chunked的日志:“HTTP Chunked Body/Trailer编码

2.2.1.MIME Multipart

是streaming的一种实现。MIME Multipart本质上和chunk类似,只是在MIME中。不是HTTP机制。一个MIME内可以带若干个Message,Message之间使用叫做boundary的字符串分开。在MIME结束的地方,会有一个结尾boundary的特殊字符串,类比HTTP chunk编码的last chunk。

【7】中描述了multipart/x-mixed-replace实现streaming.

Mixed-Replace
The content type multipart/x-mixed-replace was developed as part of a technology to emulate server push and streaming over HTTP. All parts of a mixed-replace message have the same semantic meaning. However, each part invalidates – “replaces” – the previous parts as soon as it is received completely. Clients should process the individual parts as soon as they arrive and should not wait for the whole message to finish.

Mixed-Replace这种MIME type,底层传输也是基于HTTP chunked 编码。它的引入就是为了server push。这类multipart之中的所有单独的message都是针对同一个对象的信息。新message替换旧的。可以想象,把电影胶片有序排列,每幅胶片通过一个message传输,更新HTML的某个图像框,multipart MIME一气发送下来,展现出来的就是一部影片了。

 

3.支持Server Push的新协议

3.1 Server-Sent Events(SSE)

是W3C的标准,与其说是全双工协议,不如说是long polling的标准化。看了协议描述,SSE同前文提到的multipart/x-mixed-replace是本质一样的。

a)定义了标准的MIME type “text/event-stream ”

b)定义了消息格式,如下面

c)标准化了前文例子中的keep alive

使用':’开头的数据,表示comments,每隔一段时间发送一次,作为keep-alive

d)建议disable chunked编码,可以独立于chunked编码工作。

 

SSE并非新协议,附属于HTTP1.X,没有被IETF标准化。

 

3.2 WebSockets

websocket独立实现了完全的Server Push。是HTML5中提出,并最终独立发展的全双工协议,恰如其名,web上面的socket。

和streaming类似,websocket是client发起的长连接。但C/S双方可以随时互发信息,独立于HTTP,不受拘束。

我比较奇怪的是HTML5这种信息表示层的规范会涉及通信协议的定义,可能和Google的SPDY一样,为了解决问题,赶IETF上架。

 

4.现实世界的例子

【6】列举了很多server push的具体,不再罗列。

 

5.实验时间

5.1 MIME Multipart

http://www.howtocreate.co.uk/php/serverpushdemo.php 这里有个很好的演示例子。

 

image

 

图中的方框会被浏览器维持的HTTP 长连接用“multipart/x-mixed-replace ”中的数据渲染。两个按钮,点击后会将用户颜色选择发送到服务器端。服务器在长连接内加入新的MIME part message响应,更新颜色。

 

从下面抓到的报文可以看出来,服务器端在没有收到用户事件的时候会增加空的chunk data用于keep alive。在有用户事件的时候推送一个新的MIME part,包括一个小GIF图片,更新图片框颜色。

 

 

5.2 Websocket的实验

【9】里提供了一个用C#编写的websocket server以及前端页面的例子。

功能是实现一个聊天室。

image

websocket在这里的用途是,当任何一个用户发送消息的时候,服务器将消息通过websocket广播到其他用户的浏览器。

image

上面是实际抓到的websocket协议报文,wireshark的最新版本可以完美解析内部格式。

6.给力的Visual Studio

开始看的时候,尝试使用Visual Studio 2013开发小例子,感觉还不错。

6.1 Django的支持

做的很完善,创建Django工程后微软为每个工程生成一套python虚拟环境,可以pip安装python包。

此前我被Linux上新的Django和python2.6不兼容搞的焦头烂额,微软很贴心。

6.2 Node.js的支持

Visual studio node.js 1.0RC2版本出来了,但是安装express等组件一直没有反映,应该是被长城挡住了,没有试验成功。

6.3 peek definition

image

看代码的时候发现的小功能,画中画,很酷。

 

【参考】

1.Reverse Ajax, Part 1: Introduction to Comet, http://www.ibm.com/developerworks/web/library/wa-reverseajax1/index.html

2.Reverse Ajax, Part 2: WebSockets,http://www.ibm.com/developerworks/library/wa-reverseajax2/

3.Reverse Ajax, Part 3: Web servers and Socket.IO,http://www.ibm.com/developerworks/library/wa-reverseajax3/

4.Reverse Ajax, Part 4: Atmosphere and CometD,http://www.ibm.com/developerworks/library/wa-reverseajax4/

5.Reverse Ajax, Part 5: Event-driven web development,http://www.ibm.com/developerworks/library/wa-reverseajax5/

6.HTTP Steraming – http://ajaxpatterns.org/HTTP_Streaming

7.MIME – http://en.wikipedia.org/wiki/MIME

8.Pushing technology – http://en.wikipedia.org/wiki/Push_technology

9.使用 HTML5 WebSocket 构建实时 Web 应用 – http://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">