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年晚些时候完成。

Erlang cowboy 入门参考之现代Web的发展历史的更多相关文章

  1. Erlang cowboy 入门参考

    Erlang cowboy 入门参考 cheungmine,2014-10-28 本文翻译自: http://ninenines.eu/docs/en/cowboy/HEAD/guide/gettin ...

  2. 1.2 java web的发展历史

    前言 了解java web的发展历史和相关技术的演进历程,非常有助于加深对java web技术的理解和认识. 阅读目录 1.Servlet的出现 2.Jsp的出现 3.倡导了MVC思想的Servlet ...

  3. [转]1.2 java web的发展历史

    前言 了解java web的发展历史和相关技术的演进历程,非常有助于加深对java web技术的理解和认识. 阅读目录 1.Servlet的出现 2.Jsp的出现 3.倡导了MVC思想的Servlet ...

  4. HTTP从入门到入土(2)——HTTP协议发展历史

    HTTP协议的发展历史 HTTP/0.9 0.9版本是第一个定稿的HTTP版本,相对较为简陋.它有以下特点: 只有一个命令GET 没有header等描述数据的信息 服务器发送完毕,就关闭TCP连接 注 ...

  5. 实时Web的发展历史

    传统的Web是基于HTTP的请求/响应模型的:客户端请求一个新页面,服务器将内容发送到客户端,客户端再请求另外一个页面时又要重新发送请求.后来有人提出了AJAX,AJAX使得页面的体验更加“动态”,可 ...

  6. Erlang cowboy websocket 服务器

    Erlang cowboy websocket 服务器 原文见于: http://marcelog.github.io/articles/erlang_websocket_server_cowboy_ ...

  7. Web开发技术发展历史

    Web开发技术发展历史   来自:天码营 原文:http://www.tianmaying.com/tutorial/web-history Web的诞生 提到Web,不得不提一个词就是"互 ...

  8. 【转载】Web开发技术发展历史-版本1

    原文在这里. Web开发技术发展历史 Web的诞生 提到Web,不得不提一个词就是“互联网”.Web是World Wide Web的简称,中文译为万维网.“万维网”和我们经常说的“互联网”是两个联系极 ...

  9. Erlang cowboy 处理不规范的客户端

    Erlang cowboy 处理不规范的客户端 Cowboy 1.0 参考 本章: Dealing with broken clients 存在许多HTTP协议的实现版本.许多广泛使用的客户端,如浏览 ...

随机推荐

  1. 关于Lt分发系统的时序图分析

    我们已经知道,系统共分为两个模块,mather与son 同时系统允许的操作也有三种,向mather提交war包,我某个服务器更新代码,为所有服务器更新代码 我们一个一个来看 先说,向mather提交w ...

  2. 根据iOS 10 的新特性,创建iMessage App,可用于自定义表情

    第一. 介绍(原文作者 澳大利亚19岁少年--Davis Allie ----原文地址) 随着iOS10的发布,苹果对开发者开放了Messages应用程序,开发人员现在可以创建他们自己的各种类型 并且 ...

  3. Maven原型骨架及常见问题

    关于Maven原型工程的制作就不在这里详细介绍了,具体细节请参考之前的文章:定制Maven原型生成项目 下面分享制作和使用Maven原型工程时碰到的常见问题,以及原型的上传和使用方法. 1.模块路径问 ...

  4. 百度的android面试总结分析

    今天就是今天上午10点,我接到了百度的电话面试,当然提前和我说了,我的拖延症是有多强烈,以至于我没怎么准备,当然我也想着看看自己的真实水平,在此检讨一下!!!!!!!!!!!!!!!!!!!!!!!! ...

  5. Andriod Studio科普篇——4.关于编译的常见问题

    1.android支持库未安装 编译不过,提示如下: Could not find any version that matches com.android.support:appcompat-v7: ...

  6. (九十四)集成PKRevealController实现左右抽屉视图

    使用PKRevealController可以实现类似于QQ等软件的左右抽屉视图,拖出的视图分为leftView和rightView,分别取自View的左半部分和右半部分,因此,根据不同的需求,可以选择 ...

  7. Nginx+PHP-FPM的域Socket配置方法

    1什么是域Socket "Unix domain socket 或者 IPCsocket 是一种终端,可以使同一台操作系统上的两个或多个进程进行数据通信.与管道相比,Unix domain ...

  8. Oracle 中PLSQL的ftp应用

    CREATE OR REPLACE PACKAGE BODY ftp AS -- ----------------------------------------------------------- ...

  9. 【Unity Shaders】Reflecting Your World —— Unity3D中简单的Cubemap反射

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

  10. unity 实现流光效果

    1.通过一些简单效果可以让我们更好的去理解shader,具体都在代码注释中: Shader "Unlit/MoveLightImage" { Properties { //主纹理 ...