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协议的实现版本.许多广泛使用的客户端,如浏览 ...
随机推荐
- Spark-1.6.0之Application运行信息记录器JobProgressListener
JobProgressListener类是Spark的ListenerBus中一个很重要的监听器,可以用于记录Spark任务的Job和Stage等信息,比如在Spark UI页面上Job和Stage运 ...
- Android开发之Intent.Action 各种Action的常见作用
1 Intent.ACTION_MAIN String: android.intent.action.MAIN 标识Activity为一个程序的开始.比较常用. Input:nothing Outpu ...
- JAVA面向对象-----接口的特点
接口的特点 1.类实现接口可以通过implements实现,实现接口的时候必须把接口中的所有方法实现,一个类可以实现多个接口. 2.接口中定义的所有的属性默认是public static final的 ...
- ROS_Kinetic_x 基於ROS和Gazebo的RoboCup中型組仿真系統(多機器人協作)
國防科學技術大學發布了RoboCup中型組仿真平臺,基於ROS和Gazebo設計. 該平臺可以用於多機器人協作研究.參考資料如下: ROS新聞:1 http://www.ros.org/news ...
- UITableView如何撤销移动操作
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道使用UITableView的委托方法canMoveRo ...
- iOS中 CoreGraphics快速绘图(详解) 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博 第一步:先科普一下基础知识: Core Graphics是基于C的API,可以用于一切绘图操作 Core Graph ...
- Salt: Master server cannot see any Minion
Issue: When you set up a Salt Master server and several Minions, you may find that none of minions c ...
- [GitHub]第七讲:GitHub issues
文章转载自:http://blog.csdn.net/loadsong/article/details/51591701 Github 上的每个项目仓库,都有三套基础设置可供使用:一个是通过 Gith ...
- 如何在Cocos2D游戏中实现A*寻路算法(六)
大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...
- Leetcode_67_Add Binary
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/40480151 Given two binary strin ...