Erlang cowboy 入门参考之现代Web发展史
原文:
http://ninenines.eu/docs/en/cowboy/1.0/guide/modern_web/
让我回顾一下web技术的发展历史,并可预见一下未来的发展。除了HTTP/2.0这个还未正式纳入规范的技术,Cowboy与所有这些技术都是兼容的。
早期的Web
起初的HTTP就是用来对GET请求返回HTML页面的。最初的版本是HTTP/0.9。HTTP/1.0定义了GET,HEAD和POST方法,能通过POST请求发送数据。
HTTP/1.0 的工作方式非常简单。首先建立到服务器的TCP连接,然后发送请求,服务端返回结果,然后关闭连接。
必须要指出,HTTP/1.0 不是非常讲究效率的。打开一个TCP连接需要较长时间,页面上各种元素的加载因此而变慢。近些年来对加快加载速度做了很多改善。
HTTP/1.1
紧接着到来的HTTP/1.1增加了保活机制,允许多次请求使用同一个连接,同时也支持流,允许发送body块数据。HTTP/1.1 定义了GET, HEAD, POST, PUT, DELETE, TRACE 和CONNECT 方法,近来又增加了PATCH方法。同时为了提高缓存的能力而引入了许多头部(header)定义。
HTTP/1.1 的工作方式仍然和 HTTP/1.0一样,除了连接能被保持供接下来调用。这样就可以允许客户端执行管线操作:在一行里发送多个请求,然后按发送相同的次序处理请求。
REST
HTTP/1.1 的设计受到REST风格的影响。REST即表述性状态转移,是一种对分布式系统的松散组合的架构。REST 定义了约定以实现系统的RESTful。系统不遵守这个约定就不是RESTful。
REST 是具有清晰界定的客户-服务架构,通过资源引用通信。资源可以被定位和操作。资源具有媒体类型和是否可以被缓存的信息。超媒体决定了资源如何被关联和使用。REST是无状态的,所有的请求包括完整的信息,用来执行动作。HTTP/1.1 定义了所有方法,头部和语法,以用来实现RESTful的系统。REST普遍用来设计Web程序API,可以直接用在可执行的代码中。
XmlHttpRequest
也称作AJAX,这个技术允许页面上的Javascript代码向服务器发送异步请求。这个技术开启了web站点从静态页面转向动态web程序的大幕。
在底层,XmlHttpRequest仍然执行HTTP请求,然后等待响应,但是Javascript脚本可以继续运行,直到响应到达,通过事先定义好的回调函数通知页面。这个技术仍然是客户端先发起请求,服务端仍然无法主动推送数据给客户,于是新的技术又出现了。
长轮询(Long-polling)
轮询技术解决的问题是服务器无法直接推送数据给客户端。因此客户端只能不断重复地建立连接,发出请求,得到响应,循环往复。这花费太高的代价。
为了实现消息队列和类似的机制,当有事件发生试,用户必须能得到通知,而不是用户不断地刷新页面。典型的系统是聊天程序。长轮询虽然可以减少服务器负载,但是客户端仍然无法及时得到服务器的反馈。
长轮询的机制和轮询类似,轮询是立即得到反馈,而长轮询是服务器一直不把响应返回给客户,直到有事件发生。客户端得到响应之后就发起另一个请求,然后继续进入等待状态。
你可能猜到长轮询有点像黑客技术,可能会导致一些难以意料的问题。的确,长轮询机制不能很好地结合代理使用。
HTML5
HTML5 是HTML4之后的版本。但是HTML5是解决动态web程序的问题。
HTML最初是用来写web站点的页面。可是不久人们就想要写更复杂、交互性更好的页面,现在叫web程序。比如新闻阅读器,浏览器中的email客户端,视频站点。
因为HTML不够用,人们开始使用自己的解决方法,比如插件。虽然不是很完美,但是对大多数人足够了。
终于现在有了标准的方法解决这类问题。浏览器自身就可以播放媒体。可以绘图,可以通知事件。这就是HTML5,目前正在标准化过程中。
EventSource
事件源也称为服务端发送事件,这种技术允许服务端推送数据到HTML5程序。事件源是服务器到客户端的单向通讯,客户端除了使用HTTP之外没有办法与服务器交互。这种技术利用Javascript对象建立一个连接到服务器的EventSource,然后在HTTP/1.1连接上,通过一个小协议发生事件给客户端。
EventSource是一个轻量的解决方案,仅仅支持UTF-8编码的文本数据。协议不允许使用二进制数据。一个重量级的通用的方法就是Websocket。
Websocket
Websocket 是HTTP/1.1之上的协议,提供全双工的客户与服务器通信。通信是异步的且是可以并发的。Websocket包含一个Javascript对象,用于建立到服务器的连接,然后使用基于二进制的协议在服务器和客户端之间发送数据。
Websocket连接可以传输UTF-8编码的文本或二进制数据。这个协议还支持ping/pong机制,允许服务器和客户端确认连接可用。
Websocket连接可以传输任何类型的数据,无论大小,文本还是二进制。因此,Websocket 常常应用在系统之间的通信。
SPDY
SPDY是google搞出来的协议,用来减少页面加载时间。方法是打开到服务器的连接并为接下来的请求保持这个连接,同时压缩了HTTP头尺寸以减小数据传输。
SPDY与HTTP/1.1语法兼容,实际上不同于HTTP,SPDY采用二进制帧而不是基于文本的协议。SPDY允许服务器针对请求发送额外的响应,功能包括数据流的多路复用、请求优先级以及HTTP包头压缩。
SPDY是实验性质的,但是被证明是成功的,有可能成为HTTP/2.0的标准。浏览器利用传输层协议扩展协商(TLS Next Protocol Negotiation)将HTTP连接无缝升级为SPDY连接。目前chrome和firefox默认支持打开SPDY协议。
这个协议本身还不完善,正在HTTP/2.0标准化过程中不断修改。
HTTP/2.0
HTTP/1.1之后很长时期,终于等到了HTTP/2.0。它基于SPDY协议并进行了大幅修改。HTTP/2.0是双向异 步全双工协议。计划2014年晚些时候完成。