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. 【DevOps敏捷开发动手实验】开源文档 v2015.2 stable 版发布

    Team Foundation Server 2015 Update 2版本终于在2周前的//Build 2016大会上正式发布了,借这个东风,小编也完成了[DevOps敏捷开发动手实验]开源文档的第 ...

  2. java的properties文件-jdbc优化编程(五)

    通过配置文件能够减小我们的工作量,带来方便. 建立properties文件 1.首先是新建一个dbconfig.properties.然后添加如下代码: driver=com.mysql.jdbc.D ...

  3. 查看apk签名信息

    经常在注册开发者的时候会遇到要求填写申请应用的应用签名: 有两种很方便的方法: 1.如果没有源码或者没有打开eclipse,直接下载这个应用应用下载链接 使用截图,只要把包名输入,自动会出现签名信息. ...

  4. Linux之read命令使用

    read命令: read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量 1)read后面的变量var可以只有一个,也可以有多个,这时如果输入多个数据,则第一个数据给第一个 ...

  5. java多线程的编程实例

    java中可有两种方式实现多线程: 一种是继承Thread类: 一种是实现Runnable接口: Thread类 是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的ru ...

  6. 查看linux的进程到底用了多少内存

    1. 在linux下,查看一个运行中的程序, 占用了多少内存, 一般的命令有    (1). ps aux:      其中  VSZ(或VSS)列 表示,程序占用了多少虚拟内存.          ...

  7. Cocos2D瓦块地图高清屏(retina)显示比例问题的解决

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 在Cocos2D的游戏编程里,常用到瓦块地图.而cocos2D ...

  8. iOS中 UITableViewCell cell划线那些事 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang 在开发中经常遇到cell分割线显示不全或者想自定义线的宽高等; 最近总结了一下,希望帮到大家: 1.不想划线怎么办? Table ...

  9. myeclipse一直停留在Loading workbench界面上的处理办法

    找到工作目录比如我的叫work,在.metadata中删掉以下两个文 件,再次重启myeclipse走一个! org.eclipse.ui.workbench org.eclipse.ui.workb ...

  10. UNIX网络编程——网络层:IP

    一.IP数据报格式 IP数据报格式如下: 版本:IP协议版本号,长度为4位,IPv4此字段值为4,IPv6此字段值为6 首部长度:以32位的字为单位,该字段长度为4位,最小值为5,即不带任何选项的IP ...