网络应用随处可见。任何时候浏览web,发送E-mail或者弹出一个X window,就是在使用一个网络应用。
客户端-服务器编程模型
每个网络应用都是基于客户端-服务器模型的。采用这个模型,一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源,并且通过操作这种来为它的客户端提供某种服务。
认识到客户端和服务器是进程,而不是常常提到的机器或者主机,这是很重要的。一台主机可以同时运行许多不同的客户端和服务器,而且一个客户端和服务器的事务可以再同一台(X Window)或者不同的主机上运行。无论客户端和服务器是怎样映射到主机上的,客户端-服务器模型是相同的。
客户端和服务器通过因特网这个全球网络来通信。从一个程序员的观点来看,我们可以把因特网看成一个全球范围内的主机集合,具有如下几个属性:1)每个因特网主机都有一个唯一的32位名字,称它为的IP地址。2)IP地址的集合被映射为一个因特网域名的集合。3)不同因特网主机上的进程能够通过连接互相通信。
客户端和服务器通过使用套接字接口建立连接。一个套接字是连接的一个端点。每个套接字都有相应的套接字地址,是由一个因特网地址和一个16位的证书端口组成的,用“地址:端口”来表示。当客户端发起一个连接请求时,客户端套接字地址中的端口是由内核自动分配的,称为临时端口。然而,服务器套接字地址中的端口通常是某个知名的端口,是和这个服务相对应的。例如,Web服务器通常使用端口80,而电子邮件服务器使用端口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请求的组成是这样的:一个请求行(request line)(第5行),后面跟零个或更多个首部行。请求行有3个字段:方法字段,URL字段和HTTP协议版本字段。方法字段可以取值GET、POST、HEAD、PUT和DELETE。绝大部分的HTTP请求报文使用GET方法。当浏览器请求一个对象时,使用GET方法,在URL底端填写该对象的URL地址。例子中使用的是 ‘/‘,它是最小的URL后缀,所有服务器将其扩展为某个默认的主页,例如,/index.html’
HEAD方法类似于GET方法。当服务器收到使用HEAD方法的请求时,会有一个HTTP斑纹进行响应,但是不返回请求对象。应用程序开发者常用HEAD进行故障跟踪
当用户点击超链接时,浏览器在浏览器和Web服务器之间发起一个TCP连接,这涉及一个“三次握手”过程,即客户机向服务器发送一个小TCP报文段,服务器用一个小TCP报文段做出确认和响应,最后,客户端向服务器返回确认。完成了三次握手的前两个部分后,客户端将三次握手第三个部分(客户端确认)和一个HTTP请求结合起来发送给该TCP链接。一旦该请求报文到达服务器,服务器向该TCP链接发送HTML文件。
HTTP响应
HTTP响应和HTTP请求时相似的。一个HTTP响应的组成是这样的:一个响应行(response line)(第8行)后面跟着零个或更多的响应报头(response header)(第9~13行),再跟随一个终止报头的空行(第14行),再跟随一个响应主体(response body)(第15~17行)。一个响应航的格式是:
<version> <status code> <status message>
对应是:
HTTP/1.0 200 OK
版本字段描述的响应所遵循的HTTP版本。状态码(status code)是一个三位的整数,指明对请求的处理。状态消息(status message)给出与错误代码等价的英文描述。主要的状态码如下所示:
200 | 成功 | 处理请求无误 |
301 | 永久移动 | 内容已移动到位置头中指明的主机上 |
400 | 错误请求 | 服务器不能理解请求 |
403 | 禁止 | 服务器无权访问所请求的文件 |
404 | 未发现 |
服务器不能找到所请求的文件 |
501 | 未发现 | 服务器不支持请求的方法 |
505 | HTTP版本不支持 | 服务器不支持请求的版本 |