Web应用与HTTP协议
网络应用随处可见。任何时候浏览web,发送E-mail或者弹出一个X window,就是在使用一个网络应用。
客户端-服务器编程模型
每个网络应用都是基于客户端-服务器模型的。采用这个模型,一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源,并且通过操作这种来为它的客户端提供某种服务。
认识到客户端和服务器是进程,而不是常常提到的机器或者主机,这是很重要的。一台主机可以同时运行许多不同的客户端和服务器,而且一个客户端和服务器的事务可以再同一台(X Window)或者不同的主机上运行。无论客户端和服务器是怎样映射到主机上的,客户端-服务器模型是相同的。
客户端和服务器通过因特网这个全球网络来通信。从一个程序员的观点来看,我们可以把因特网看成一个全球范围内的主机集合,具有如下几个属性:1)每个因特网主机都有一个唯一的32位名字,称它为的IP地址。2)IP地址的集合被映射为一个因特网域名的集合。3)不同因特网主机上的进程能够通过连接互相通信。
客户端和服务器通过使用套接字接口建立连接。一个套接字是连接的一个端点。每个套接字都有相应的套接字地址,是由一个因特网地址和一个16位的证书端口组成的,用“地址:端口”来表示。当客户端发起一个连接请求时,客户端套接字地址中的端口是由内核自动分配的,称为临时端口。然而,服务器套接字地址中的端口通常是某个知名的端口,是和这个服务相对应的。例如,Web服务器通常使用端口80,而电子邮件服务器(SMTP)使用端口25.
HTTP概况
Web客户端和服务器之间的交互用的是一个基于文本的应用级协议,叫做HTTP(Hypertext Transfer Protocol,超文本传输协议)。HTTP协议由两部分程序实现:一个客户端程序和一个服务器程序,它们运行在不同的端系统当中,通过交换HTTP报文进行会话。HTTP定义了这些报文的格式以及客户端和服务器是如何进行报文交换的。Web服务和常规的文件检索服务(例如FTP)有什么区别?主要的区别是Web内容可以用一种叫做HTML(Hypertext Markup Language,超文本标记语言)的语言来编写。一个HTML程序(页)包含(标记),它们告诉浏览器如何显示这页中的各种文本和图形对象。
Web页面(Web page,也叫文档)是由对象组成,对象简单来说就是文件,如HTML页面、JPEG图形文件、Java小程序或视频片段文件,这些文件可以通过一个URL地址寻址。多数Web页面含有一个基本HTML文件(base HTML file)以及几个引用对象。在基本HTML文件中通过对象的URL地址对对象进行引用。每个URL地址由两部分组成:存放对象的服务器主机名和对象的路径名。Web浏览器实现了HTTP的客户端。Web服务器用于存储Web对象,每个对象由URL寻址。Web实现了HTTP的服务器端,流行的Web服务器有Apache和Mircosoft Internet Information Sever。
HTTP使用TCP(而不是UDP)作为它的支撑运输层协议,默认的端口号是80.
HTTP事务
一个服务静态内容的HTTP事务
因为HTTP是基于在因特网连接上传送的文本行,我们可以使用Unix的TELNET程序和因特网上的任何Web服务器执行事务。对于调试在连接上通过文本行来与客户端对话的服务器来说,TELNET十分便利。例如,上图是使用TELNET向AOL Web服务器请求主页。
在第一行,我们从Unix外壳运行TELNET,要求它打开一个到AOL Web服务器的连接。TELNET向终端服务器打印三行输出,打开连接,然后等待我们输入文本行(第五行)。我们每次输入一个文本行,并键入回车键,TELNET会读取该行,在后面加上回车和换行符号,并将这一行发送到服务器。
HTTP报文
http报文包括以下三部分:
1. 起始行(请求行)
报文的第一样就是起始行,在请求报文中用来说明要做些什么,在响应报文中说明出现了什么情况。
2. 首部字段
起始行后面有零个或多个首部字。每个首部字段都包含一个名字和一个值,为了便于解析,两个之间用冒号(:)来分隔。首部行以一个空行结束。添加一个首部字段和添加新行一样简单。
3. 主体
空行之后就是可选的报文主体了,其中包含了所有类型的数据。请求主体中包括了要发送给Web服务器的数据,响应主体中装载了要返回给客户端的数据。起始行和首部都是文本形式且都是结构化的,而主体则不同,主体中可以包含任意的二进制数据(比如图片、视频、音轨、软件程序)。当然,主体中也可以包含文本。
HTTP请求
一个HTTP请求的组成是这样的:一个请求行(request line)(第5行),后面跟零个或更多个请求报头(request header)(第六行),再跟随一个空的文本行来终止报头列表(第7行)。请求行有3个字段:方法字段,URI字段和HTTP协议版本字段,即有如下的形式是:
<method><uri><version>
HTTP支持许多不同的方法,方法字段可以取值GET、POST、HEAD、PUT和DELETE。绝大部分的HTTP请求报文使用GET方法和POST方法。当浏览器请求一个对象时,使用GET方法,在URL底端填写该对象的URL地址。例子中使用的是 '/',它是最小的URL后缀,所有服务器将其扩展为某个默认的主页,例如,/index.html’
HEAD方法类似于GET方法。当服务器收到使用HEAD方法的请求时,会有一个HTTP报文进行响应,但是不返回请求对象。应用程序开发者常用HEAD进行故障跟踪。
PUT方法也被应用程序用来向web服务器上传对象。利用DELETE方法,用户或者应用程序可以删除web服务器上的对象。
总的来说,第5行的请求行要求服务器取出并返回HTML文件/index.html.它也告知服务器请求剩下的部分是HTTP/1.1格式的。
请求报头为服务器提供了额外的信息,例如浏览器的商标名,或者浏览器理解的MIME类型。请求报头的格式为:
<header name>:<header data>
针对我们的目的,唯一需要关注的报头是Host报头(第6行),这个报头在HTTP/1.1请求中是需要的,而在HTTP/1.0请求中是不需要的。代理缓存(proxy cache)会使用Host报头,这个代理缓存有时作为浏览器和管理被请求文件的原始服务器(origin server)的中介。客户端和原始服务器之间,可以有多个代理,即所谓的代理链(proxy chain)。Host报头中的数据指示了原始服务器的域名,使得代理链中的代理能够判断它是否可以在本地缓存中拥有一个被请求内容的副本。
第7行的空文本行(通过在键盘上键入回车键生成)终止了报头,并指示服务器发送被请求的HTML文件。
当用户点击超链接时,浏览器在浏览器和Web服务器之间发起一个TCP连接,这涉及一个“三次握手”过程,即客户机向服务器发送一个小TCP报文段,服务器用一个小TCP报文段做出确认和响应,最后,客户端向服务器返回确认。完成了三次握手的前两个部分后,客户端将三次握手第三个部分(客户端确认)和一个HTTP请求结合起来发送给该TCP链接。一旦该请求报文到达服务器,服务器向该TCP链接发送HTML文件。
由于绝大部分HTTP请求是用GET方法或POST方法。所有有必要清楚这两者之间的定义以及区别。
GET - 用来获取远程数据。
POST - 用来插入/更新远程数据,比如密码。
根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。
(1).所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。
* 注意:这里安全的含义仅仅是指是非修改信息。
(2).幂等的意味着对同一URL的多个请求应该返回同样的结果。这里我再解释一下幂等这个概念:
幂等有一下几种定义:
对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a)=abs(abs(a))。
对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x。
看完上述解释后,应该可以理解GET幂等的含义了。
但在实际应用中,以上2条规定并没有这么严格。引用别人文章的例子:比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。从根本上说,如果目标是当用户打开一个链接时,他可以确信从自身的角度来看没有改变资源即可。
2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求。继续引用上面的例子:还是新闻以网站为例,读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。
HTTP响应
HTTP响应也是由三个部分组成,分别是:响应报头、终止报头的空行以及响应主体。
1、响应行格式如下:
<version> <Status-Code> <Reason-Phrase CRLF>
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK //客户端请求成功
400 Bad Request //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden //服务器收到请求,但是拒绝提供服务
404 Not Found //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
502 Bad Gateway //对用户访问请求的响应超时造成的
503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
eg:HTTP/1.1 200 OK (CRLF)
2、响应正文就是服务器返回的资源的内容
参考资料:
1. http://blog.csdn.net/gueter/article/details/1524447
2.《计算机网络-自顶向下方法》
3. http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386832653051fd44e44e4f9e4ed08f3e5a5ab550358d000
4. http://www.w3school.com.cn/tags/html_ref_httpmethods.asp
5. http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html
6. 《深入理解计算机系统>(第二版) 机械工业出版社