应用程序体系结构(application architecture)有应用程序研发者设计,规定了如果在各种端系统上组织该应用程序。现代网络应用程序中所使用的两种主流体系结构:客户-服务器体系结构和**对等(P2P)**体系结构。注意,应用程序的体系结构是明显不同于网络的体系结构。
在客户-服务器体系结构(client-server architecture)中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。值得注意的是利用客户-服务器体系结构,客户相互之间不直接通信。该体系结构的另一个特征是该服务器具有固定的、周知的地址,该地址称为IP地址。示意图如下:
在**P2P体系结构(P2P architecture)中,对位于数据中心的专用服务器有最小的(或者没有)依赖。相反,应用程序在间断连接的主机对之间使用直接通信,这些主机称为对等方。该体系结构的最引人入胜的特性之一是它们的自扩展性(self-scalability)**。示意图如下:
用操作系统的术语来说,运行在多个端系统上的程序它们之间进行通信的实际上是**进程(process)**而不是程序。一个进程可以被认为是运行在端系统中的一个程序。当多个进程运行在相同的端系统上时,它们使用进程间通信机制相互通信。进程间通信的规则由端系统上的操作系统确定。
在两个不同端系统上的进程,通过跨越计算机网络交换**报文(message)而相互通信。对每对通信进程,通常将这两个进程之一标识为客户(client),而另一个进行标识为服务器(server)**。对于客户和服务器进程的定义如下:在一对进程之间的通信会话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户,在会话开始时等待联系的进程是服务器。
进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接受报文。套接字是同一台主机内应用层与运输层之间的接口。由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的**应用程序编程接口(Application Programming Interface,API)。在一台主机上运行的进程为了向在另一条主机上运行的进程发送分组,接受进程需要有一个地址。该地址包含两种信息:主机地址(IP地址)和在目的主机中指定接收进程的标识符(端口号)**。
一个运输层协议能够为调用它的应用程序提供的服务大体可分为四个方面:可靠数据传输、吞吐量、定时和安全性。
1)可靠数据传输是指应用程序的一端发送的数据正确、完全地交付给该应用程序的另一端。
2)可用吞吐量就是发送进程能够向接收进程交付比特的速率。具有吞吐量要求的应用程序被称为带宽敏感的应用(bandwidth-sensitive application),与之对应的弹性引用能够根据当时可用的带宽或多或少地利用可供使用的吞吐量。当然,吞吐量越多越好。
3)运输层也能提供定时保证,同时能够以多种形式实现。
4)运输协议能够为应用程序提供一种或多种安全性服务。
因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议,即UDP和TCP。TCP服务模型包括面向连接服务和可靠数据传输服务。
1)面向连接的服务:在应用层数据报文开始流动之前,TCP让客户机和服务器互相交换运输层控制信息。这个所谓的握手过程提醒客户和服务器,让它们为大量分组的到来做好准备。在握手阶段,一个TCP连接就在两个进程的套接字之间建立了。这条连接是全双工的,即连接双方的进程可以在此连接上同时进行报文收发。当应用程序结束报文发送时,必须拆除该连接。
2)可靠的数据传输服务:通信进程能依靠TCP,无差错、按适当顺序交付所有发送的数据。当应用程序的一端将字节流传进套接字时,它能够依靠TCP将相同的字节流交付给接收方的套接字,而没有字节的丢失和冗余。
TCP协议还具有拥塞控制机制,当发送方和接收方之间的网络出现拥塞时,TCP的拥塞控制会抑制发送进程。因为完全性的问题,因特网界研发了TCP的加强版本,称为**安全套接字层(Secure Sockets Layer,SSL)**。用SSL加强后的TCP不仅能够做传统的TCP所能做的一切,而且提供了关键的进程到进程的安全性服务,包括加密、数据完整性和端点鉴别。
UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。UDP是无连接的,没有拥塞控制机制,提供了一种不可靠数据传输服务。
**应用层协议(application-layer protocol)**定义了运行在不同端系统上的应用程序进程如何相互传递报文,特别是应用层协议定义了:
1)交换的报文类型。例如请求报文和响应报文。
2)各种报文类型的语法。如报文中的各个字段以及这些字段如何描述。
3)字段的语义,即这些字段中的信息的含义。
4)确定一个进程何时以及如何发送报文,对报文进行响应的规则。
Web的应用层协议是**超文本传输协议(HyperText Transfer Protocol,HTTP)**,它是Web的核心。HTTP由两个程序实现:一个客户程序和一个服务器程序。这两个程序都运行在不同的端系统中,通过交换HTTP报文进行会话。HTTP定义了这些报文的结构以及客户和服务器进行报文交换的格式。
Web页面(Web page)(也叫文档)是由对象组成的。一个对象(object)只是一个文件,诸如一个HTML文件、一个JPE图形这样的文件,且它们可通过一个URL地址寻址。多数Web页面含有一个HTML基本文件(base HTML file)以及几个引用对象。HTML基本文件通过对象的URL地址引用页面中的其他对象。URL地址分为两部分组成:存放对象的服务器主机名和对象的路径名。Web浏览器(Web browser)(例如Firefox)实现了HTTP的客户端,Web服务器(Web server)实现了HTTP的服务器端,它用于存储Web对象,每个对象由URL寻址。HTTP使用TCP作为它的支撑运输协议(而不是在UDP上运行)。因为HTTP服务器并不保存关于客户的任何信息,所以说HTTP是一个**无状态协议(stateless protocol)**。
当客户发出一系列请求时,每个请求响应如果是经一个单独的TCP连接发送,这样的应用程序称为非持续连接(non-persistent connection);如果所有的请求及其响应经过相同的TCP连接发送,这样的应用程序称为持续链接(persistent connection)。
非持续连接的使用,其中每个TCP连接在服务器发送一个对象后关闭,即该连接不为其他的对象而持续下来。值得注意的是每个TCP连接只传输一个请求报文和一个响应报文。**往返时间(Round-Trip Time,RTT)**是指一个短分组从客户到服务器然后再返回客户所花费的时间。RTT包括分组传播时延、分组在中间路由器和交换机上的排队时延以及分组处理时延。
“三次握手”过程:客户向服务器发送一个小TCP报文段,服务器用一个小TCP报文段做出确认和响应,最后,客户向服务器返回确认(其中包含请求报文)。
非持续连接的缺点:第一,必须为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户和服务器中都要分配TCP的缓冲区和保存TCP变量,这给Web服务器带来了严重的负担。第二,每个对象经受两倍RTT的交付时延,即一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象。
持续链接的HTTP,服务器在发送响应后保持该TCP连接打开。在相同的客户和服务器之间,后续的请求和响应报文能够通过相同的连接进行传送。
HTTP报文有两种:请求报文和响应报文。HTTP请求报文的第一行叫作请求行(request line),其后继的行叫作首部行(header line)。请求行有3个字段:方法字段、URL字段和HTTP版本字段。方法字段可以取不同的值,包括GET,POST,HEAD,PUT和DELETE。示例如下:
其中首部行Host的内容指明了对象所在的主机,该首部行提供的信息是Web代理高速缓存所要求的。后面的Connection首部行告诉服务器是否使用持续连接(close即不要使用持续连接)。User-agent首部行用来指明用户代理,即向服务发送请求的浏览器类型。最后的Accept-language首部行表示用户想得到对象的法语版本(如果服务器中有这样的对象的化);否则,服务器应当发送它的默认版本。Accept-language首部行仅是HTTP中可用的众多内容协商首部之一。
一个请求报文的通用格式如下:
注意到在首部行后有一个“实体体”(entity body),使用GET方法时实体体为空,而使用POST方式时才使用该实体体。当服务器收到一个使用HEAD方法的请求时,将会用一个HTTP报文进行响应,但是并不返回请求对象。PUT方法常与Web发行工具联合使用,它允许用户上传对象到指定的Web服务器上指定的路径(目录)。DELETE方法允许用户或者应用程序删除Web服务器上的对象。
如下是上述HTTP请求报文示例的对应的HTTP响应报文:
该响应报文分为三个部分:一个初始化状态行(status line),6个首部行(header line),然后是实体体(entity body)。实体体部分是报文的主要部分,它包含了所请求的对象本身。状态行有3个字段:协议版本字段,状态码和响应状态信息。Connection首部行具有与请求报文中相同的含义,表示是否使用持续连接(该例中不使用,服务器将告诉客户发送报文后将关闭该TCP连接)。Date首部行指示服务器产生并发送该响应报文的日期和时间,这个时间不是指对象创建或者最后修改的时间,而是服务器从它的文件系统中检索到该对象,将该对象插入响应报文,并发送响应报文的时间。Server首部行指示该报文由那一台服务器产生的。Last-Modified首部行指示了对象创建或者最后修改的日期和时间。Content-Length首部行指示了被发送对象中的字节数。Content-Type首部行指示了实体体中对象的类型(在该例中是HTML文本)。
一个HTTP响应报文的通用格式如下:
一些常见的状态码和相关的短语如下:
1)200 OK:请求成功,信息在返回的响应报文中。
2)301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location首部行中。客户软件将自动获取新的URL。
3)400 Bad Request:一个通用差错代码,指示该请求不能被服务器理解。
4)404 Not Found:被请求的文档不在服务器上。
5)505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本。
HTTP使用了cookie,它允许站点对用户进行跟踪。如下所示,cookie技术有4个组件:
1)在HTTP响应报文中的一个cookie首部行。
2)在HTTP请求报文中的一个cookie首部行。
3)在用户端系统中保留一个cookie文件,并由用户的浏览器进行管理。
4)位于Web站点的一个后端数据库。
Web缓存器(Web cache)也叫代理服务器(proxy server),它是能够代表初始Web服务器来满足HTTP请求的网络实体。Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本。需要注意的是,当Web缓存器接收浏览器的请求并发回响应时,它是一个服务器。当它向初始服务器发送请求并接收响应时,它是一个客户。因此Web缓存器既是服务器又是客户。Web缓存器通常由ISP购买并安装。通过使用内容分发网络(Content Distribution Network,CDN),Web缓存器正在因特网中发挥着越来越重要的作用。
HTTP协议有一种机制,允许缓存器证实它的对象是最新的。它就是**条件GET(**conditional GET)方法。如果请求报文中使用GET方法,并且请求报文中包含一个“If-Modified-Since:”首部行。那么,这个HTTP请求报文就是一个条件GET请求报文。
内容分发网络(Content Distribution Network,CDN)基本思路是尽可能避开互联网上有可能影响传输速度和稳定性的瓶颈和环境,使内容传输得更快更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接,负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向最新的服务节点上。使用户就近取得所需内容,解决网络拥挤情况,提供用户访问网站的响应速度。