Erlang cowboy 入门参考之现代Web的发展历史
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的发展历史的更多相关文章
- Erlang cowboy 入门参考
Erlang cowboy 入门参考 cheungmine,2014-10-28 本文翻译自: http://ninenines.eu/docs/en/cowboy/HEAD/guide/gettin ...
- 1.2 java web的发展历史
前言 了解java web的发展历史和相关技术的演进历程,非常有助于加深对java web技术的理解和认识. 阅读目录 1.Servlet的出现 2.Jsp的出现 3.倡导了MVC思想的Servlet ...
- [转]1.2 java web的发展历史
前言 了解java web的发展历史和相关技术的演进历程,非常有助于加深对java web技术的理解和认识. 阅读目录 1.Servlet的出现 2.Jsp的出现 3.倡导了MVC思想的Servlet ...
- HTTP从入门到入土(2)——HTTP协议发展历史
HTTP协议的发展历史 HTTP/0.9 0.9版本是第一个定稿的HTTP版本,相对较为简陋.它有以下特点: 只有一个命令GET 没有header等描述数据的信息 服务器发送完毕,就关闭TCP连接 注 ...
- 实时Web的发展历史
传统的Web是基于HTTP的请求/响应模型的:客户端请求一个新页面,服务器将内容发送到客户端,客户端再请求另外一个页面时又要重新发送请求.后来有人提出了AJAX,AJAX使得页面的体验更加“动态”,可 ...
- Erlang cowboy websocket 服务器
Erlang cowboy websocket 服务器 原文见于: http://marcelog.github.io/articles/erlang_websocket_server_cowboy_ ...
- Web开发技术发展历史
Web开发技术发展历史 来自:天码营 原文:http://www.tianmaying.com/tutorial/web-history Web的诞生 提到Web,不得不提一个词就是"互 ...
- 【转载】Web开发技术发展历史-版本1
原文在这里. Web开发技术发展历史 Web的诞生 提到Web,不得不提一个词就是“互联网”.Web是World Wide Web的简称,中文译为万维网.“万维网”和我们经常说的“互联网”是两个联系极 ...
- Erlang cowboy 处理不规范的客户端
Erlang cowboy 处理不规范的客户端 Cowboy 1.0 参考 本章: Dealing with broken clients 存在许多HTTP协议的实现版本.许多广泛使用的客户端,如浏览 ...
随机推荐
- RxJava(四) concatMap操作符用法详解
欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/51533282 本文出自:[余志强的博客] concatMap操作符的 ...
- Android Multimedia框架总结(十)Stagefright框架之音视频输出过程
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52560012 前言:上篇文中最后 ...
- 树莓派初体验,安装Ubuntu 14.04 LTS
转载自:http://www.polarxiong.com/archives/%E6%A0%91%E8%8E%93%E6%B4%BE%E5%88%9D%E4%BD%93%E9%AA%8C-%E5%AE ...
- Struts 1 之配置文件
web.xml中配置Struts的入口Servlet--ActionServlet,ActionServlet不负责任何的业务处理,它只是查找Action名单,找到path属性与URL属性一致的Act ...
- RDD:基于内存的集群计算容错抽象
转载自:http://shiyanjun.cn/archives/744.html 摘要 本文提出了分布式内存抽象的概念--弹性分布式数据集(RDD,Resilient Distributed Dat ...
- UNIX环境高级编程——环境变量表读取/添加/修改/删除
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { char* pVal ...
- [Python]程序性能分析
有些脚本发现比预期要慢的多,就需要找到瓶颈,然后做相应的优化,参考A guide to analyzing Python performance,也可以说是翻译. 指标 运行时间 时间瓶颈 内存使用 ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- iOS中 项目开发易错知识点总结 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博! 点击return取消textView 的响应者 - (BOOL)textFieldShouldReturn:(UI ...
- (一〇六)iPad开发之UIPopoverController的使用
很多App里都有一种点击显示的悬浮气泡菜单,例如下图: 在iPad上可以使用UIPopoverController实现这个功能,popoverController继承自NSObject而不是UIVie ...