更新内容

This commit is contained in:
卢克
2013-03-25 15:42:18 +08:00
parent c82244cf71
commit 07ed0959ec
+7 -17
View File
@@ -10,32 +10,27 @@ tags:
---
####一.Web起源
-----
1969年,美国国防高等研究计划署( ARPA ,Advanced Research Projects Agency )开始建立一个命名为ARPANET的网络。当初,ARPANET只联结4台主机,从军事要求上是置于美国国防部高级机密的保护之下,从技术上它还不具备向外推广的条件。
1969年,美国国防高等研究计划署( ARPA ,Advanced Research Projects Agency )开始建立一个命名为ARPANET的网络。当初,ARPANET只联结4台主机,从军事要求上是置于美国国防部高级机密的保护之下,从技术上它还不具备向外推广的条件。
1983年1月1日,原先ARPANET使用的交流协议NCP(Network Control Protocol)成为历史,TCP/IP开始成为通用协议。
1986年,美国国家科学基金会(National Science Foundation)建立了大学之间互联的骨干网络NSFNET,这是互联网历史上重要的一步。
<br>
互联网的发展当然也离不开操作系统的发展,起初贝尔实验室给大学研究室提供的UNIX,是附带源码的,各个研究室可以自行修改。1977,Bill Joy(比尔·乔伊,Sun Microsystems联合创始人,03年离开SUN) 伯克利大学的学生,编译发行了 BSD(Berkeley Software Distribution)。BSD UNIX 是第一个包含了网络协议栈库的UNIX(一开始支持的还是NCP协议),这个库也就是熟知的BSD Sockets。通过将套接字与Unix操作系统的文件描述符相整合,使得网络读写数据和读写本地文件一样容易。BSD Sockets几乎成了网络访问的标准,其他系统的Sockets多多少少是基于BSD Sockets修改而来的,即便是Windows中的Winsock也借鉴了BSD Sockets。
乔布斯1985年被赶出苹果,后来他创建了NeXT.Inc,并开发出NEXTSTEP操作系统。这个操作系统是基于Mach和BSD(混合内核 Hybrid kernel)的。1988年NeXTSTEP第一个正式发布版本问世了。
<br>
乔布斯1985年被赶出苹果,后来他创建了NeXT.Inc,并开发出NEXTSTEP操作系统。这个操作系统是基于Mach和BSD(混合内核 Hybrid kernel)的。1988年NeXTSTEP第一个正式发布版本问世了。
至于超文本的概念其实在HTTP之前就已经被提出来了,预言了一种非线性结构的文本,只是一直没有应用到计算机中。
1980年中Tim Berners-Lee到CERN工作,几个月间创建一个以超文本系统为基础的项目,方便研究人员分享及更新讯息。同时,他创建了一个原型系统,叫ENQUIRE。
但工作了几个月就离开了CERN,转到一个图形计算相关的公司工作,并在工作中积累了网络编程的经验。
1984年,伯纳斯-李以正式员工的身份重返CERN,并于1990年开始着手他构想了多年的万维网以及超文本协议,WorldWideWeb项目,只花了两个月开发在年底开发出来。于是世界上第一个Web出现了,而第一个Web正是构建在NeXTcube工作站上的,运行着NeXTSTEP系统。
后来伯纳斯-李创建了非赢利性的万维网联盟W3C。为Web的良性和谐发展做出了巨大的贡献。
<br>
<br>
####二.浅谈HTTP
-----
HTTP的全称为Hypertext Transfer Protocol,也就是所谓的超文本传输协议。是一个C/S(客户端/服务器端)结构下的请求响应协议。
在HTTP之初,只是用来传输静态内容,一个URL对应网络中的一个文件,不管你是谁,什么时候,用什么浏览器访问,返回的内容都是一样的,所以这是一种没有状态(stateless )的访问。所以HTTP一开始设计成无状态的也是可以理解的。
HTTP的全称为Hypertext Transfer Protocol,也就是所谓的超文本传输协议。是一个C/S(客户端/服务器端)结构下的请求响应协议。
在HTTP之初,只是用来传输静态内容,一个URL对应网络中的一个文件,不管你是谁,什么时候,用什么浏览器访问,返回的内容都是一样的,所以这是一种没有状态(stateless )的访问。所以HTTP一开始设计成无状态的也是可以理解的。
但是随着Web的不断发展,动态内容的需求出现了,所以状态的必要性显现出来了。现在一般都有Session的概念 ,服务器端一般可以通过以下方式来实现Session:
- HTTP Cookies
- Query string parameters
- 表单隐藏字段
<br>
下面我们再来看看HTTP请求响应的过程
当TCP连接成功后,HTTP的请求响应总的来说就分两步:
@@ -71,18 +66,15 @@ HTTP的全称为Hypertext Transfer Protocol,也就是所谓的超文本传输
如果Connection是keep-alive的话,tcp连接不会立即关闭。从HTTP/1.1起,默认都开启了Keep-Alive。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache,Nginx)中设定这个timeout时间。
<br>
<br>
####三.Web Server
----
Web Server 的功能其实很简单,就是接收HTTP请求,并对请求进行响应。
Web起初只支持静态的文件,后来为了支持动态的内容,就制定了一套web服务器执行脚本并返回结果的标准, 后来这套标准发展出了CGI标准([http://tools.ietf.org/html/rfc3875](http://tools.ietf.org/html/rfc3875))。
每次执行CGI脚本都需要新建一个进程(fork-and-execute),在这个进程还可能需要加载解释器之类的动作,所以代价比较高,如果短时间cgi访问较多的话,会很容器使得系统资源耗尽。
[FastCGI](http://www.fastcgi.com/drupal/node/6?q=node/15),是对CGI的一个优化(或者说是对CGI的一个扩展),提出了FastCGI Server的概念,FastCGI Server在启动后会预先加载多个CGI解释器进程,用于等待请求,其实也就是多了一个进程池的概念。减少不必要的创建销毁CGI进程的代价。Web Server将环境信息以及请求的信息通过UNIX Domain Socket的方式(比如Web Server和FastCGI在同一个机器上) 或者tcp链接(FastCGI Server分布在不同的机器上),然后FastCGI处理好了以同样的方式的连接将内容返回给web server。
对于不同的语言,FastCGI Server 可能会有不同的语言的实现,这些FastCGI Server并提供相关的API接口供你的web app使用。
SCGI(Simple Common Gateway Interface),和FastCGI类似,不过简单的多,没有FastCGI用得多。
AJP(Apache JServ Protocol,Apache 1.x通过mod_jk模块实现)它是一种二进制格式的传输协议,所以性能比较可观,一般后端为Java Servlet 容器,Apache Tomcat和Jetty这两个Servlet容器都支持AJP协议。
[SCGI](http://www.python.ca/scgi/protocol.txt)(Simple Common Gateway Interface),和FastCGI类似,不过简单的多,没有FastCGI用得多。
[AJP](http://tomcat.apache.org/connectors-doc/ajp/ajpv13a.html)(Apache JServ Protocol,Apache 1.x通过mod_jk模块实现,2.0中直接集成了AJP Connector)它是一种二进制格式的传输协议,所以性能比较可观,一般后端为Java Servlet 容器,Apache Tomcat和Jetty这两个Servlet容器都支持AJP协议。
以上的CGI,FastCGI,SCGI以及AJP这些都可以看做数据交换的协议,和语言无关的。
现在再将视线往Web Application这边移一步,这里说说Python的情况,在2003 出现WSGI之前,你若要使用Python写一个Web程序,可以专门针对CGI或者FastCGI写,也可以针对mod_python写,为了解决这种Python Web应用编写时API不一致的情况,提出了WSGI(Web Server Gateway Interface),在Web Server 和 Web App之间增加一个抽象层,使得Web App这边的接口得到统一。一般所谓的协议或者接口其实都需要两方,WSGI也不例外,分为WSGI Server端和WSGI App端,WSGI Server端也就是所谓的那个抽象层。
@@ -106,9 +98,7 @@ WSGI Family
前端web server 比如Apache,nginx,lighttpd,HAproxy用来直接处理用户的请求以及给用户响应,如果是静态文件的请求,那么web server直接给用户静态文件,毕竟前端的web server一般都是c语言写的,效率较好。
而动态的部分,则由 web server转至后端的 app server进行处理,传送的方式可以是cgi,fastcgi,ajp,或者直接反向代理。
<br>
<br>
####四.Web Application
----
应用开发
框架 框架 框架
Webx3 Roma(公司内部用得不是很多) Spring iBatis(现在是 apache ibatis)