应用层基础知识

应用层

网络应用是计算机网络存在的理由。在过去的几十年中,许多有影响力的网络应用被创造出来,如 20 世纪 80 年代出现的电子邮件、文件传输、远程访问、新闻组、文本聊天等基于文本的网络应用, 20 世纪 90 年代中期出现的万维网( Web )应用以及包括因特网电话、视频会议、视频点播、远程教育等在内的多媒体网络应用,还有 20 世纪末出现的具有联系人列表的即时讯息(如 MSN Yahoo Messengers )和对等( peer-to-peer P2P )文件共享等新型网络应用。
       当构建一种新的网络应用时,首先需要决定应用的体系结构。应用的体系结构规定了在各种端系统上应如何组织应用程序。现代网络应用有 3 种主流的体系结构:客户 / 服务器体系结构, P2P 体系结构,以及客户 / 服务器和 P2P 混合的体系结构。
l          在客户 / 服务器体系结构中,有一个总是打开的主机称为服务器,它在固定的、众所周知的地址上为其它称为客户机的主机提供服务,客户机之间不直接通信。经典的网络应用,如电子邮件、文件传输、远程访问、万维网等,都采用了这种体系结构。
l          在纯 P2P 体系结构中,没有一个总是打开的服务器,任意一对主机(称为对等方 peer )之间直接通信。对等文件共享采用了这种体系结构,任何主机都能向其它主机请求文件,也能向其它主机发送文件。每个主机的作用都像一台服务器,向它所在的共享文件社区贡献资源。在今天的因特网中, P2P 文件共享流量在所有流量中占了很大一部分。
l          混合体系结构同时使用客户 / 服务器结构和 P2P 结构,即时讯息采用了这种结构。在即时讯息中,两个聊天的用户之间通常是 P2P ,即这两个用户之间发送的消息不通过总是打开的中间服务器。然而,一个用户在开始他的即时讯息应用前必须在某个中心服务器上注册,当他要与联系人列表中的某个人聊天时,他的即时讯息客户机要与中心服务器联系,以找出可以聊天的在线联系人。
除 了确定应用的体系结构外,每一种应用还应规定相应的应用层协议。应用层协议定义了运行在不同端系统上的应用程序如何进行通信,包括它们之间交换的报文类 型、各种报文类型的语法、各个字段的语义、以及对各种报文的处理等。区分网络应用和应用层协议是很重要的,应用层协议只是网络应用的一部分。比如, Web 应用是一种客户 / 服务器应用,它允许客户机从 Web 服务器获取所需的文档。 Web 应用有好几个组成部分,包括文档格式标准、 Web 浏览器、 Web 服务器程序以及一个应用层协议 HTTP HTTP 定义了在浏览器程序和 Web 服务器程序间传输的报文格式和序列。可见, Web 的应用层协议 HTTP 只是 Web 应用的一个部分。
本章介绍的几个网络应用均为客户 / 服务器模式的应用。
 
1.        域名系统 DNS
网络内部使用 IP 地址来引用主机、信箱及其它资源,但这种二进制形式的地址记忆起来很不方便,因此人们引入了便于记忆的 ASCII 名字。在各种网络应用中通常使用这种 ASCII 名字来引用资源,这就需要在资源的 ASCII 名字和它的 IP 地址之间建立起一种映射关系。
在小型系统里面可以使用一个配置文件来保存这种映射关系,但是在一个大规模的网络中,文件将变得非常庞大,一致性将很难维护,更糟糕的是重名很难避免, Internet 解决这一问题的方案是引入域名系统。
域名系统是一种分级结构的基于域的命名方案和实现这种命名方案的分布式数据库,它主要用于将主机名和 email 地址映射到 IP 地址,在其它方面也有用途。
 
(1) 域名空间
       如何使命名系统能够提供大量和可扩展的名字集合,并且不需要一个中心节点来进行管理呢?答案在于分散命名的机制,即将各个名字空间的管理权委托给不同的管理机构,使名字与地址之间的映射的责任分布在各处。
DNS 在概念上将 Internet 分成了 200 多个顶级域,每个顶级域都包括很多主机。每个顶级域又被进一步划分成若干个二级子域,每个二级子域还可以再分子域,依次类推。所有这些域可以组织到一棵树中,如图 7-1 所 示。叶子节点代表没有子域的域,它既可以是一台主机,也可以代表一个拥有许多主机的公司。一个指定的域是指树中一个特定的节点以及该节点下所有的节点,这 个域的域名是用从该域开始向上直到树根(为空)的标记序列来命名的,标记之间用圆点分隔。树中每个节点必须具有唯一的域名,在保证域名唯一的前提下,相同 的标记可以用于不同的节点。需要注意的是,域名的任一后缀也是一个域。
顶级域分为两大类:通用域和国家域。通用域也称组织域,是按组织类型进行分级的。国家域是按国家或称地理划分进行分级的,每个国家对应一个国家域。许多国家仿照组织域的分类方法,在它们的国家域下面建立类似组织域的第二级子域。
 
(2) DNS 工作原理
       为了将一个主机名映射为一个 IP 地址,应用程序调用一个称为解析器的库例程。在 UNIX 系统上,这个库例程是 gethostbyname() 。解析器的输入参数为包含主机名的字符串,如果执行成功,解析器的返回值是对应于该名称的一个 IP 地址。
每一个解析器的内部都配置了本地 DNS 服务器的地址,当解析器被调用时,它将需要查询的信息封装成一个 DNS 请求报文,将报文封装到一个 UDP 包中发送给本地 DNS 服务器。本地 DNS 服务器查找本地数据库,如果在本地数据库中找到需要的信息,就将查询结果封装成一个 DNS 响应报文,然后将报文封装到另一个 UDP 包中,发回给解析器。解析器从 DNS 响应报文中取出查询结果,返回给调用者。 DNS 请求和响应报文所用的 UDP 端口均为 53
       如果在本地数据库中没有找到需要的信息,那查找过程就比较复杂了,本地 DNS 服务器必须向其它的 DNS 服务器查询。那么本地 DNS 服务器该向哪个 DNS 服务器发出请求呢?为解释这个问题,首先需要了解因特网中 DNS 服务器的组织方式。因特网中使用了大量的 DNS 服务器,它们以层次方式组织,并且分布在全世界范围内。没有一台 DNS 服务器知道因特网上所有主机的映射信息,这些信息被分布在所有的 DNS 服务器上。因特网中有三种类型的 DNS 服务器,按照层次结构从上到下依次为根 DNS 服务器、顶级域服务器和权威 DNS 服务器。
l          DNS 服务器:根 DNS 服务器知道所有顶级域服务器的 IP 地址。因特网上有 13 个根 DNS 服务器(标号为 A M ),其中大部分位于北美。
l          顶级域( TLD )服务器:每个顶级域至少有一个顶级域服务器,每个 TLD 服务器知道本域下所有二级子域的权威 DNS 服务器的 IP 地址。
l          权威 DNS 服务器:在因特网上具有公共可访问主机(如 Web 服务器和邮件服务器)的每个组织机构必须提供公共可访问的 DNS 记录,这些记录保存在组织机构的权威 DNS 服务器中。每个组织机构可以选择实现自己的权威服务器,也可以支付费用将这些 DNS 记录存储在某个服务提供商的权威服务器中。多数大学和大公司实现和维护它们自己的主权威服务器和辅助权威服务器。
假如某台主机 A 想知道主机 email.ustc.edu.cn IP 地址,主机 A 向自己的本地 DNS 服务器发送一个 DNS 请求报文。如果 A 的本地 DNS 服务器不知道如何解析这个名字,它将报文转发给一个根服务器,每个本地 DNS 服务器必须配置至少一个根服务器的 IP 地址。这个根服务器注意到 cn 这个后缀,就向本地 DNS 服务器返回负责 cn 这个域的 TLD 服务器的 IP 地址列表。本地 DNS 服务器向这些 TLD 服务器之一发送一个 DNS 请求报文,收到请求的 TLD 服务器注意到 edu.cn 这个后缀,就用负责 edu 这个二级子域的权威服务器的 IP 地址进行响应。本地 DNS 服务器再向这个权威服务器发送 DNS 请求报文,这个权威服务器用负责 ustc.edu.cn 的权威服务器的 IP 地址进行响应。本地 DNS 服务器再向 ustc.edu.cn 的权威服务器发送请求,这个权威服务器用 email.ustc.edu.cn IP 地址进行响应。至此,本地 DNS 服务器得到了主机名 email.ustc.edu.cn IP 地址。
注意到在上面的例子中,为了获得一个主机名映射,共发送了 5 DNS 请求报文和 5 DNS 响应报文。实际上,为了减小时延和减少因特网上传输的 DNS 报文数量, DNS 广泛使用了缓存技术。 DNS 缓存的想法很简单,每当本地 DNS 服务器从某个 DNS 服务器收到一个 DNS 响应报文,它就缓存这个响应报文中的信息。这样,如果本地 DNS 服务器中缓存了一个 < 主机名, IP 地址 > 对,当另一个对相同主机名的查询到达该服务器时,它可以直接返回响应。由于主机名与 IP 地址之间的映射不是永久的,所以 DNS 服务器在一段时间后(通常设置为两天)将丢弃缓存的信息。本地 DNS 服务器也可以缓存 TLD 服务器的 IP 地址,从而允许本地 DNS 服务器绕过查询链中的根服务器,这种情况是经常发生的。
另 一个需要说明的是,在具体实现时物理域名服务器的层次结构与域名的层次结构不完全一致。比如,一个公司可以将它的所有域名都放在一个服务器中,尽管这个公 司实际上拥有多层的域结构;也可以将域名分放在几个服务器中,其中每个服务器可以负责一个层次或者多个层次的域。因此,虽然域的层次可能很多,但服务器的 层次并不多,从而查询链不会太长。
 
(3) 资源记录
       每个域都有一组与之相关联的资源记录。对于一个主机来说,最常见的资源记录就是它的 IP 地址,但还有其它种类的资源记录。当一个解析器向 DNS 查询一个域名时,它得到的其实是和这个域名相关联的资源记录。因此可以说, DNS 的主要功能是将域名映射到资源记录上。
       一条资源记录就是一个五元组,它包括域名、生存期、信息类型( class )、资源记录类型( type )、值( value )五项。
n          域名表示该记录适用的域。通常一个数据库中包含许多域的信息,一个域又有许多资源记录,因此域名是用于查询的主关键字, DNS 会返回所有与域名相匹配的资源记录,而资源记录在数据库中的顺序并不重要。
n          生存期:表示资源记录的稳定性如何。可以给一个稳定的资源记录指定一个较大的值,如 86400 秒(一天),给一个易变的资源记录指定一个较小的值,如 60 秒。
n          信息类型:对于 Internet 信息,该项总为 IN ,其它类型信息很少见。
n          资源记录类型:最重要的类型列于图 7-2 中,包括授权开始 SOA (指明一个服务器实现的命名等级部分的多个字段)、主机 IP 地址(可有多个)、域邮件服务器(可有多个并列有优先级)、名字服务器(域的授权服务器名,父域服务器名)、域的别名、反向查找指针(从 IP 地址映射到域名)、主机信息( CPU 及操作系统)及域的描述信息。
n          值:可以是一个数字、域名或 ASCII 串,其语义由记录类型决定。
一个可能的 DNS 数据库的部分信息如图 7-3 所示。
2.        文件传输
文件传输是因特网上最早出现且目前仍在频繁使用的网络应用之一,它将一个完整的文件从一个系统拷贝到另一个系统。在早期的因特网中,用于传输文件的数据报占了网络流量的近三分之一。直到 1995 年,万维网的信息流量才第一次超过了文件传输。
 
(1)     文件传输协议 FTP
因特网中最流行的文件传输服务使用 FTP File Transfer Protocol )协议,它能在任意两台计算机之间传输文件的拷贝。虽然 FTP 协议明确规定了两台计算机上的 FTP 软件如何进行交互,但该标准并没有定义用户接口,因此不同的 FTP 实现所提供的用户接口可能不同。为维护产品之间的相似性,许多厂商采纳了最早在 BSD UNIX 系统中使用的 FTP 软件版本。 BSD FTP 接口含有 50 多条命令,令许多初学者感到无从下手。所幸的是,大多数用户仅需要几条命令就可以进行文件传输。另外,一些新开发的 FTP 应用程序为用户隐藏了 FTP 接口的许多细节,用户只要输入文件服务器的名字、本人帐号及口令等信息,拖动鼠标就可以方便地完成文件的上传和下传。
像其它网络应用一样, FTP 使用客户 / 服务器模式。用户运行一个本地 FTP 客户程序, FTP 客户程序负责解释用户输入的命令,与远程文件服务器建立 TCP 连接,并在 TCP 连接上完成与服务器的通信及数据传输等。 FTP 使用两条 TCP 连接完成文件传输,一条是控制连接,另一条是数据连接。平时 FTP 服务器总在端口 21 上等待客户的连接请求,当用户需要传输文件时, FTP 客户与 FTP 服务器的端口 21 建 立一个控制连接,用来传送客户的命令和服务器的响应。当客户在控制连接上发出数据传输命令时,服务器在另一个端口上主动与客户建立一条数据连接,然后在数 据连接上传输文件。当一个文件传输结束时,关闭数据连接。如果用户请求另一个文件的传输,则服务器和客户再建立一个数据连接,用于传输新的文件。虽然数据 连接频繁地建立和释放,但控制连接在整个会话期间一直保持,直到客户与服务器通信结束为止。
上图是 FTP 的功能模块及两条连接的示意图。从图中可以看到,终端用户并不直接处理控制连接上的 FTP 命令和 FTP 响应, FTP 命令和响应的处理由两个协议解释器完成。用户接口为终端用户提供某种形式的输入界面,接收用户的命令,将其转换成标准的 FTP 命令,并将控制连接上的 FTP 响应转换成用户可阅读的形式显示出来。
使用分开的控制连接和数据连接有几个优点:( 1 )简化了协议的设计和实现,因为文件数据不会干扰 FTP 命令;( 2 )由于控制连接一直保持,它在文件传输过程中仍然可用,比如客户可以随时发出终止传输的命令;( 3 )数据连接的关闭可用于通知对方文件传输结束,允许动态创建文件(不需要告知对方传输文件的大小)。由于发送方用关闭连接来表示一个文件传输结束,所以数据连接总是由发送文件的一方主动关闭。
       需要注意的是,在建立数据连接时客户和服务器的角色是相反的,服务器扮演客户的角色,而客户扮演服务器的角色。建立一个数据连接的过程如下:
l          客户进程为数据连接选择一个本地的临时端口号,并在该临时端口上等待服务器的连接请求;
l          客户进程在控制连接上用 PORT 命令将临时端口号发送给服务器;
l          服务器收到端口号后,发送一个连接请求,同客户机的该端口建立一个数据连接,服务器用于数据连接的端口号总是 20
 
(2)     简单文件传输协议 TFTP
因特网还包含另一种文件传输服务,称为简单文件传输,其协议为 TFTP Trivial File Transfer Protocol )。 TFTP 最初打算用于引导无盘系统(通常是工作站或 X 终端),因而 TFTP 使用 UDP 而不是 TCP 进行文件传输,以保持算法简单和短小。 TFTP 代码和它所需要的 UDP IP 和设备驱动程序都能适合只读存储器( ROM ),这一点对于引导无盘系统非常重要。
引导无盘系统通常需要一个网络连接和一小块 ROM ROM 中有支持 TFTP UDP IP 的代码。当这种设备启动后,它执行 ROM 中的代码,然后在网络上产生一个 TFTP 的广播请求。网络上配置的 TFTP 服务器通过发送文件来响应这一请求,这一文件包含可运行的二进制程序。设备接收到这一文件后,将它装载到内存中,然后开始执行该程序。
       在开始工作时, TFTP 客户与服务器交换信息,客户发送一个读请求或写请求给服务器;如果文件是允许读或写的,则客户与服务器之间采用停 - 等协议进行数据传输。以读一个文件为例, TFTP 客户向服务器发送一个读请求,说明要读的文件名和文件模式( ASCII 文件还是二进制文件)。如果这个文件允许被该客户读取, TFTP 服务器发送一个块编号为 1 的数据分组, TFTP 客户收到后发送一个块编号为 1 的确认分组。 TFTP 服务器随后发送块编号为 2 的数据分组, TFTP 客户返回块编号为 2 的确认分组。重复这个过程,直至这个文件传送完。除最后一个数据分组可含有不足 512 字节的数据外,其它每个数据分组均含有 512 字节的数据。当 TFTP 客户收到一个不足 512 字节的数据分组时,就知道它收到了最后一个数据分组。
在写文件的情况下, TFTP 客户发送写请求,指明文件名和模式。如果这个文件能被该客户写, TFTP 服务器返回块编号为 0 的确认分组。该客户将文件的头 512 字节以块编号为 1 发送,服务器收到后返回块编号为 1 的确认。依次类推。
由于 TFTP 使用不可靠的 UDP 传输数据,分组可能出错或丢失。 TFTP 使用超时重传机制解决分组丢失问题。至于检测错误,和许多 UDP 应用程序一样, TFTP 报文中没有校验和,它假设 UDP 会检测数据错误并丢弃出错的包。
       TFTP 服务器使用 UDP 端口 69 TFTP 要求客户进程首先向服务器进程的 UDP 熟知端口( 69 )发送第一个报文(读请求或写请求),之后服务器进程向服务器主机申请一个尚未使用的端口,重新创建一个进程在该端口上与请求的客户进程交换数据,随后服务器进程回到 69 端口继续监听其它客户的请求。服务器中的 UDP 模块根据目的端口号区分不同的客户。
TFTP 报文不提供用户名和口令,这是因为 TFTP 被设计用于系统引导进程,它不可能提供用户名和口令。 TFTP 的这一特性(安全漏洞)被许多解密高手用于获取 UNIX 口令文件的拷贝,然后猜测用户口令。为防止这种类型的访问,目前大多数 TFTP 服务器提供了一个选项,限制只能访问特定目录下的文件( UNIX 系统中通常是 /tftpboot ),这个目录中只包含无盘系统引导所需的文件。
 
 
3.        电子邮件
因特网电子邮件系统由三个主要部分组成:用户代理、消息传输代理和简单邮件传输协议( Simple Mail Transfer Protocol SMTP )。用户代理是一个本地程序,有时也称邮件阅读器,它为用户提供阅读邮件、编辑邮件、发送邮件及信箱管理等功能。消息传输代理是运行在邮件服务器后台的一个系统守候进程( daemon ),负责为用户传递邮件及将收到的邮件放入用户的邮箱。在两个计算机之间传递邮件使用 SMTP 协议。
 
(1) 简单邮件传输协议( SMTP
       在因特网中,为将邮件从一台主机(源)发送到另一台主机(目的),源主机首先和目的主机建立一个 TCP 连接,端口 25 固定用于邮件传输,然后双方运行 SMTP 协议传递信件。在端口 25 监听的服务进程称为 email 守候进程,它接收源主机的连接请求,将收到的邮件放入相应的信箱;如果邮件无法投递,它将返回一个错误报告。
SMTP 的工作过程很简单。客户机建立了与服务器的 TCP 连 接后,等待服务器发送一个准备好消息,如果服务器未准备好,客户机释放连接。当收到服务器的准备好报文后,客户机向服务器通报信件的发送方和接收方;如果 接收方信箱在服务器上,服务器就会通知客户机继续;于是客户机将信件发给服务器,服务器回应。如果还有信件需要发送,重复以上过程,直到信件发完。然后, 服务器交换发送方和接收方的身份,以使邮件能反向流动。当两个方向上的信件均交换完后,释放连接。过程如图 7-14 所示。
 
(2) 两阶段交付
       SMTP 方案暗示着服务器必须在任何时候做好接受电子邮件的准备。一旦用户输入邮件,客户就试图将其发送出去。如果服务器运行在具有永久互联网连接的计算机上,是能够做到这一点的,但对于并非一直连接到互联网的计算机(如拨号上网的计算机),就无法做到这一点了。
       解决这个问题的方法是使用一个两阶段的交付过程。第一阶段,在具有永久 Internet 连接的计算机上为每个用户分配一个邮箱,这台计算机运行一个常规 SMTP 服务器,一直准备着接收电子邮件。第二阶段,用户与邮件服务器建立一个连接,运行一个从永久邮箱检索邮件的协议,这个协议把邮件传输到用户使用的计算机,在这台计算机上、阅读邮件。
       有两个协议可允许远程用户从永久邮箱检索邮件,一个是邮局协议 POP ,另一个是 Internet 邮件访问协议 IMAP
 
(3) 邮局协议 POP3
       把邮件从永久邮箱传输到本地计算机的最流行的协议是邮局协议版本 3 ,即 POP3 。用户激活一个 POP3 客户,该客户与带有永久邮箱的计算机的端口 110 建立一个 TCP 连接;连接建立后,用户发送用户名和口令以鉴别该会话;一旦接受了鉴别,用户就可以发送命令,收集邮件同时将邮件标记为删除;当客户发出退出命令时,服务器删除所有标记的邮件,回应客户,并释放连接。过程如图 7-16 所示。
       尽管 POP3 协议支持将邮件下载到客户机,同时在服务器上也保留备份,但是大多数邮件软件都是简单地下载邮件,然后将邮箱清空。
       带有永久邮箱的计算机必须运行两个服务器, SMTP 服务器接受发送给一个用户的邮件,并把传入的每个邮件添加到该用户的永久邮箱中, POP3 服务器允许用户从邮箱中提取邮件并将其删除。为了确保操作正确,这两个服务器必须协调对邮箱的使用,如果邮件通过 SMTP 到达的同时用户通过 POP3 提取邮件,邮箱必须能够保持有效状态。
 
(4) Internet 邮件访问协议 IMAP
       由于 POP3 总是一次性把邮箱中的所有内容都传到本地机器上,这对于那些经常使用多台计算机却只有一个邮箱帐号的用户来说很不方便,因为他们的邮件会散布到多台机器上,而这些机器可能并不是他们自己的。
POP3 不同, IMAP 允许用户将所有邮件无限期地保留在服务器中,在线地阅读邮件,并允许用户动态地在服务器上创建、删除和管理多个信箱,将阅读过的信件放到相应的信箱中保存。另一个和 POP3 不同的地方是, IMAP 除了为用户接收邮件以外,还可以为用户发送邮件。 IMAP 服务器在端口 143 上监听。
 
(5) 多用途因特网邮件扩展协议 MIME
       邮件格式最早在 RFC 822 中规定。 RFC 822 规定了信头中可以使用的域,包括收信人、发信人、信件经过的路径等与消息传输有关的域,还有回信地址、信件编号、关键字、信件主题等供用户代理及收信人使用的域。在电子邮件发展的初期,所有信件都是用英文写的,编码方式都是 ASCII 码,且信件的格式也都是纯文本格式,因此 RFC 822 的信体不需要什么结构。发信程序和收信程序可以直接对信体进行发送和接收,而不需要进行任何代码转换。
随着网络规模的扩大和通信业务类型的增多,越来越多的用户要求电子邮件不仅能传输英文,也能传输其它语系的文字,甚至能传输多媒体信息。当信体是非 ASCII 文本形式的数据时,为了保证这些数据在现有系统中得以可靠传输,发送前通常必须将它们转换成某种适合传输的代码形式,接收时再进行相应的解码。另外,非 ASCII 文本形式的信体大多是具有一定数据结构的信息块,必须调用相应的信件浏览器才能进行显示,因此在用户端需要运行特殊的发信程序和收信程序。因此,人们对 RFC 822 进行了扩展,提出了多用途因特网邮件扩展协议( Multipurpose Internet Mail Extensions MIME )。 MIME RFC 822 所作的扩充是,允许信体具有一定的数据结构,规定了非 ASCII 文本信息在传输时的统一编码形式,并在信头中扩充了一些域,用以指明信体的数据类型和传输编码形式,从而引导收信程序正确地接收和显示信件。
       MIME 在信头中扩充的最重要的两个域是:信体传输编码形式和信体数据类型。 MIME 定义了五种传输编码形式:基本的 ASCII 编码集,扩展的 ASCII 编码集,二进制编码,基 64 编码( base64 encoding ), quoted-printable 编码。在基 64 编码中,每 24 比特数据被分成 4 6 比特的单元,每个单元编码成一个合法的 ASCII 字符,其对应关系为: 0 25 编码成‘ A ’~‘ Z ’, 26 51 编码成‘ a ’~‘ z ’, 52 61 编码成‘ 0 ~‘ 9 62 63 分别编码成‘+’和‘/’,‘==’和‘=’分别表示最后一组只有 8 比特和 16 比特,回车和换行忽略。使用这种编码方式可以正确传输二进制文件。 Quoted-printable 编码适用于消息中绝大部分都是 ASCII 字符的场合。每个 ASCII 字符仍用 7 比特表示,大于 127 的字符编码成一个等号再跟上该字符的十六进制值。
       RFC 1521 定义了七种数据类型,有些类型还定义了子类型。比如,文本( text )类型分为无格式文本( text/plain )和带有简单格式的文本( text/richtext ),图像类型分为静态 GIF 图像( image/gif )和 JPEG 图像( image/jpeg ),还有音频类型、视频类型、消息类型(信体中包含另一个报文)、多成分类型(信体中包含多种数据类型)和应用类型(需要外部处理且不属于其它任何一种类型)。
 
4.        万维网
从用户的角度来看, Web 是由数量巨大且遍布全球的文档组成的,这些文档称为 Web 页(或简称页)。每个页除了含有基本的信息之外,还可以含有指向其它页的链接,这样的页就称为超文本( hypertext )页或超媒体( hypermedia )页。超文本和超媒体的不同在于文档内容,超文本文档只包含文本信息,而超媒体文档还包含其它媒体信息,如图标、图形、数字照片、音频、视频等。
页需要用称为浏览器的程序阅读,浏览器负责取回指定的页,并按照指定的格式显示在屏幕上。图 7-18 是一个 Web 页的例子,页中指向其它页的文本串称为超级链接( hyperlink ),通常用下划线、加亮、闪烁、突出的颜色等进行强调。其实除了文本串以外,页中的其它元素,如图标、照片、地图等,都可以有指向其它页的超级链接。当用户点击超级链接时,浏览器就会取回该链接指向的页,并显示给用户。 Web 的基本工作模型如图 7-19 所示。
 
(1) 客户方
当用户点击了一个超级链接后,浏览器如何找到所需的页呢?每个 Web 页使用统一资源定位器( URL )进行命名,如 [url]http://www.itu.org/home/index.html[/url] URL 由三部分组成:用于访问页的协议名称(如 http )、页所在机器的域名(如 [url]www.itu.org[/url] )和包含页的文件(如 /home/index.html )。当用户点击了以上的超级链接后,浏览器按以下步骤工作:
n          浏览器确定 URL (从页及点击位置获取);
n          请求 DNS 解析域名 [url]www.itu.org[/url]
n          DNS 返回 IP 地址 156.106.192.32
n          浏览器与 156.106.192.32 的端口 80 建立一个 TCP 连接;
n          浏览器发送一个请求,要求取文件 /home/index.html
n          [url]www.itu.org[/url] 服务器发送文件 /home/index.html
n          释放 TCP 连接;
n          浏览器显示文件 /home/index.html 的所有文本内容;
n          浏览器取回该文件中的所有图像并显示(一次取一个图像显示)。
为了使得浏览器能够正确解释和显示每一个 Web 页, Web 页必须使用称为 HTML (超文本标记语言)的标准语言书写。但并不是每一个页都是 HTML 格式的,如一个页可以包含 PDF 格式的文档、 GIF 格式的图标、 JPEG 格式的照片、 MP3 格式的歌曲、 MPEG 格式的视频等,浏览器如何来显示这些页呢?当服务器返回一个页的时候,同时要返回关于这个页的一些额外信息,特别是页的 MIME 类型。当页的 MIME 类型不是浏览器本身所支持的类型时,浏览器查找自己的 MIME 类型表,该表将每个 MIME 类型关联到一个阅读器上,浏览器调用相应的阅读器进行显示。这些阅读器可以是和浏览器运行在同一个程序空间的插件程序,也可以是一个独立的助手程序。浏览器也可以显示本地文件,但本地文件没有 MIME 类型,浏览器是通过文件的扩展名来得知文件类型的。
 
(2) 服务器方
       Web 服务器的典型工作过程如下:
n          服务器在端口 80 监听,与请求的客户建立 TCP 连接,接收服务请求;
n          确定请求的 Web 页(名字扩展);
n          (若需要)认证客户;
n          (若需要)对客户进行访问控制;
n          (若需要)对请求的页进行访问控制;
n          检查请求的页是否在高速缓存中;
n          若不在高速缓存中,从本地磁盘读取文件;
n          确定要包含在响应中的 MIME 类型;
n          其它处理;
n          将文件返回给客户,并进行日志记录;
n          释放连接。
服务器的设计主要着眼于如何提高服务的响应速度,以及如何服务于更多的客户。常用的技术包括将经常访问的文件保存在高速缓存中,服务器设计为多线程的且使用多个磁盘,建立 server farm 等。
 
(3) 状态信息和 cookie
       Web 本质上是无状态的,浏览器向服务器发送一个文件请求,服务器将请求的文件返回,此后服务器上不保留有关客户的任何信息。当 Web 只用于获取公开可访问的文档时,这种工作模式是非常合适的。但随着 Web 涉足其它领域,有些服务需要在确认了用户的身份后才能提供,这就需要将用户信息保存起来。如有些软件需要用户注册后才能使用,当用户注册后,用户信息必须被保存下来,当用户下次请求服务时,这些信息就被用来判断用户是否是注册用户,从而决定如何向用户提供服务。
在 两次调用之间程序保存的信息称为状态信息,保存状态信息的方法依赖于这些信息需要被保存的时间和信息的大小。服务器可以将少量信息传递给浏览器,浏览器将 这些状态信息存储在磁盘上,然后在后续请求中将这些信息返回给服务器。如果服务器需要存储大量的信息,服务器必须将这些信息保存在本地磁盘上。
传递给浏览器的状态信息称为 cookie ,它被保存在浏览器的 cookie 目录下。 cookie 是一个小文件,最多包括 5 个字段(如图 7-25 ),包括产生 cookie Web 站点名称、适用的路径(在服务器的哪部分文件树上要使用这个 cookie ),内容、有效期和安全性要求。当浏览器要向某个 Web 服务器发送请求时,先检查 cookie 目录,看看是否有从那个服务器发来的 cookie ,如果有就把发来的所有 cookie 都包含在请求消息中,发送给服务器。由于 cookie 很小,大多数服务器软件不会在 cookie 中存储实际数据,两次调用之间需要保存的信息实际上是存放在服务器本地磁盘的文件中,而 cookie 被用作这些信息的索引。
 
(4) Web 文档类型
       Web 文档按照文档内容产生的时间可以划分为三个较宽的范畴:
n          静态文档:静态文档以文件方式保存在 Web 服务器上,由文档的作者决定文档的内容。由于文档的内容不会改变,所以对静态文档的请求会产生相同的响应。
n          动态文档:动态文档不是预先存在的,它是在浏览器请求文档时由 Web 服务器创建的。当请求到达时, Web 服务器运行一个应用程序创建动态文档,服务器将应用程序的输出作为响应。因为针对每个请求均会创建一个新的文档,所以每个请求产生的动态文档是不同的。
n          主动( active ) 文档:主动文档不是完全由服务器指定,主动文档由一个计算机程序组成,该程序知道如何进行计算并显示结果。当游览器请求一个主动文档时,服务器返回一个必 须在浏览器本地运行的程序的拷贝。当程序运行时,主动文档程序可以与用户进行交互,并不断地改变显示。因此,主动文档的内容不是固定不变的。
静 态文档的优点是简单、可靠和高性能,缺点是缺少灵活性。当信息改变时文档必须被修改,而且需要手工修改,因此静态文档适用于那些不需要经常修改的信息。动 态文档的优点是能够报告当前信息,例如,动态文档可用于报告当前股票价格、天气状况等。当浏览器请求这些信息时,服务器会运行一个应用程序来访问所需的信 息并创建文档,然后将文档发送给浏览器。但动态文档一旦被发送到浏览器后,其信息也不会再改变了,因此当用户浏览股票价格时,这些信息可能已经过时了。所 以,动态文档不适用于那些变化非常快的信息。主动文档与动态文档相比,主要优点在于可以持续不断地更新信息。主动文档可以直接访问信息源并能不断更新显 示,因此用于显示股票价格的主动文档可以不断返回股票信息并改变显示,无需用户的任何操作。主动文档的主要缺点来自于创建和运行这种文档所带来的额外开销 以及不安全因素的引入。
总而言之,静态文档中的信息只有在作者修改文档时才会改变,动态文档的信息在服务器接到对该文档的请求时被改变,而主动文档显示的信息在文档被载入浏览器中之后仍可以改变。
 
(5) HTML XML XHTML
       静态文档使用 HTML 语言书写。 HTML 是一种标记语言,用于描述文档的显示格式。 HTML 并不指定详细的文档格式,它允许文档含有显示所需的大纲性的信息,而让浏览器来决定具体的显示细节。因此,同一个 HTML 文档在两个浏览器上的显示可能是不同的。
       HTML 中的格式命令称为标签( tag ),使用时标签成对出现,包含在一对标签中的文档内容,其显示格式就由该标签指定,常见的标签列于表 7-27 中。
当需要在 Web 页中嵌入图像时,图像数据文件必须存储在一个独立的地方,然后在文档中包含指向该文件的指针。当浏览器遇到这样一个指针时,会到指针所指的地方获得图像的拷贝,然后将图像插入到被显示的文档中。 HTML 使用 <IMG> 标签来指出获取图像文件的地方及图像在文档中的显示位置等信息,如: <IMG SRC="[url]http://www.widget.com/images[/url] /logo.gif " ALIGN=middle ALT="AWI Logo"> ,其中 SRC 给出图像数据文件的 URL ALIGN 表示显示位置, ALT 是当图像不能显示时代替图像的文字。
当需要在文档中包含超级链接时,使用标签 <A> ,如: <A HREF="http://www.nasa.gov"> NASA's home page </A> ,显示时包含在标签之间的文字会被加上下划线( NASA's home page ),而点击它则会显示 NASA 的主页。也可以为图像设置超级链接,如: <A HREF="http://www.nasa.gov"> <IMG SRC="shuttle.gif" ALT="NASA"> </A> ,当点击飞船( shuttle )图像(或替代的 NASA 字符串)时会显示 NASA 的主页。
       在许多应用中用户不仅需要下载信息,也需要向服务器输入信息,如进行注册、网上购物、回答问卷调查、输入查询关键字等,这就需要信息逆向流动。 HTML 使用表单来收集用户的输入信息,表单中包含一些需要用户提供信息的条目,每个条目都有一个唯一的名字,当用户点击提交按钮时,浏览器将所有条目及条目的值汇总,发送给服务器。
       HTML 的缺点是将文档的内容与格式绑在了一起,这使得要从文档中提取信息或者改变信息的输出格式变得非常困难。为此提出了两种新的语言,扩展的标记语言 XML 和扩展的样式语言 XSL XML 以一种结构化的方式描述内容,而 XSL 则描述独立于内容的显示格式,这使得数据的收集、处理与输出更加灵活方便。
       HTML XML 都是针对运行在 PC 机上的浏览器设计的,随着无线手持设备(如 PDA )的普及,人们可能会想用这些设备来浏览网页,但这些设备的内存和处理器速度都很有限,无法运行现在这些复杂的浏览器。可扩展的超文本标记语言 XHTML 是一种更规范的语言,可简化浏览器的处理。
 
(6) CGI 和服务器端脚本技术
       当服务器收到浏览器发过来的表单数据时,它需要将数据交给一个程序去处理,该程序可能会去查询数据库,然后生成一个定制的 HTML 文档返回给浏览器,比如让用户进行确认。 HTML 表单的处理过程如图 7-33 所示。
       处理表单和其它交互式 Web 页(动态文档)的传统方法是公共网关接口 CGI CGI 是一个标准的接口,它允许 Web 服务器与一个能够处理动态文档的后台程序或脚本进行交互。 CGI 规定了服务器与后台程序交互的通用规则,但允许程序员选择大多数细节。例如, CGI 允许程序员选择编程语言,并且允许不同的动态文档使用不的语言。因此,对于需要大量数学计算的文档,程序员可以使用传统的 FORTRAN C C++ 语言,而对于需要处理文本格式的文档,可以使用 Perl TCL UNIX Shell 脚本语言。在实际应用中, CGI 程序的输出并不局限于 HTML CGI 标准允许 CGI 应用产生任意文档类型,如文本或数字图片。为区分各种不同的文档类型, CGI 标准允许 CGI 程序在输出中放置一个头部,头部中含有描述文档类型的文本。
       每个 CGI 程序被赋予一个 URL ,位于 cgi-bin 目录下。表单的 ACTION 参数中指出了处理表单数据的 CGI 程序的 URL ,当表单数据被提交后, Web 服务器调用相应的 CGI 程序进行处理,并接收 CGI 程序的输出。 CGI 程序输出后,服务器要检查输出的头部,因此 CGI 程序可以通过头部与服务器进行通信,比如指出生成的文档类型,也可以指出文档放在另一个不同的 URL 处。服务器取得 CGI 生成的文档,返回给浏览器。
       CGI 技术的主要缺点在于它的模式,每次请求 CGI 程序,均会产生一个完整的 HTML 页,即使每次产生的 HTML 文件内容只有几行不同。在实际应用的一些例子中,大部分网页的内容均是相同的,如一个含有股票交易信息的网页,只有动态插入的公司名称和当前的股票价格是不同的,其余部分如网页头和页面的格式信息都是相同的。
       针对只需要改变网页中一小部分内容的情况,已经有了不同于 CGI 技术的其它动态网页技术。这些技术不需要运行产生网页的单独程序,它们与服务器软件紧密集成在一起,修改网页的工作由在服务器中内置的解释器完成。在服务器中存储的网页称为模板,它包含传统的 HTML 和脚本信息,对于 HTML 信息解释器不做任何改变,对于脚本信息解释器用解释脚本的结果代替。为使解释器能够高速运行,模板的脚本信息使用特殊的语法。存在以下几种服务器端脚本技术:
n          ASP Active Server Pages ):微软公司创建的一种动态网页技术,脚本信息用 VB 编写,脚本解释器与微软公司的 Internet 信息服务器( Internet Informaton Server IIS )紧密集成。
n          JSP Java Server Pages ):一种独立于平台的动态网页技术,网页中嵌入的脚本代码是用 Java 语言编写的。
n          PHP Perl Helper Pages ):一种使用 Perl 语言的动态网页技术,速度比 ASP JSP 快,但嵌入的代码难以阅读。
n          ColdFusion :一种在网页中嵌入 SQL 数据库查询的动态网页技术,当服务器处理这种页时,解释器向数据库系统发送 SQL 查询,并将结果转换为 HTML ,置于查询语句的位置。
 
(7) Java JavaScript ActiveX controls
       主动文档是一个程序,它从服务器下载并在浏览器中运行,它能与用户动态交互,并能主动地从服务器获取最新信息,因而可以为用户提供不断更新的信息。
       Java 是由 Sun 微系统公司开发用于创建并运行主动文档的一种技术,它使用术语 Applet 描述主动文档程序。运行 Java 的游览器含有两个解释器,一个 HTML 解释器和一个用于解释 Applet Java 解释器。在浏览器下载并运行 Applet 之前, Java Applet 必须被编译成字节码并存储在 Web 服务器上。调用 Applet 的方法有两种,一种是用户向支持 Java 的浏览器提供一个 Applet URL ,当浏览器与 URL 中指定的服务器联系时,服务器通知浏览器该文档是一个 Applet 。另一种方法是在 HTML 文档中包含一个指向 Applet 的标记 <applet> ,当浏览器遇到这一标记时,与服务器联系获得该 Applet 的一个拷贝,下载到本地执行。 Applet 可以与浏览器中的 HTTP 客户和 HTML 解释器进行交互, Applet 使用浏览器的 HTTP 客户检索文档,使用浏览器的 HTML 解释器显示网页信息。
       JavaScript 是一种脚本语言,提供有与用户交互的 JavaScript 函数,脚本直接嵌入 HTML 页中,由浏览器解释执行。 JavaScript 的优点是简单并易于使用,不需要独立的编译器,缺点是代码空间比较大,解释执行的速度较慢。
       微软公司的解决方案是 ActiveX controls ,这些是编译成机器语言的程序,并在硬件上执行,因此它比 Java Applet 运行更快且更灵活。当 Internet Explorer Web 页中遇到一个 ActiveX control 时,它从服务器上下载,检验其标识,然后执行。
 
(8) 超文本传输协议 HTTP
       浏览器与 Web 服务器之间通信所用的协议是超文本传输协议 HTTP ,它规定了客户方与服务器方通信所使用的命令及响应。 HTTP 通常运行在 TCP 连接之上,当浏览器和服务器的端口 80 建立了 TCP 连接之后,就向服务器发送 HTTP 请求,服务器返回响应。 HTTP 请求是自包含的,服务器不保留以前的请求或会话的历史记录。
       HTTP 的早期版本( 1.0 )为每个数据传输使用新的 TCP 连接,即客户建立 TCP 连接,发送一个 HTTP 请求,服务器返回一个响应,然后关闭连接。早期的 Web 页大多只包含纯文本信息,这种方法是比较合适的,但后来的 Web 页包含了越来越多的图标、图像等,建立一个 TCP 连接只为传输一个图标,这样的开销就太大了。因此,当版本 1.1 出现时,它以一种根本的方式改变了基本 HTTP 模式。它不是为每个传输使用 TCP 连接,而是把持久连接用作默认方式,即一旦客户建立了和特定服务器的 TCP 连 接,客户就让该连接在多个请求和响应过程中一直存在,当客户或服务器准备关闭连接时就通知另一端,然后关闭连接。还可以用流水线技术进一步优化使用持久连 接的浏览器,可令浏览器逐个连续地发送请求而不必等待响应。在必须为某个页面取得多幅图像的情况下,流水线技术特别有用,它使得底层互联网具有较高的吞吐 量,并且应用具有较快的响应速度。使用持久连接的缺点是要标识通过连接发送的每一数据项的开头和结尾, HTTP 通常使用的方法是先发送数据项的长度,然后再发送数据项。
除了能从 Web 服务器上下载文件以外, HTTP 还可以有其它操作,内置的 HTTP 操作列于表 7-41 中。
HTTP 使用消息进行交互。它借用了电子邮件的基本格式,每个 HTTP 消息包含一个头部、一个空行和要发送的数据项。头部中的每一行包含关键字、冒号和信息,常见的 HTTP 头列于表 7-43 中。 HTTP 允许浏览器和服务器通过消息头部交换元信息,如数据项使用的编码方法及语言、数据项长度、网页类型、最后修改时间、 cookie 等。
除了描述数据项的详细信息以外, HTTP 还允许浏览器和服务器通过头部协商各种能力,如可接受的网页类型、字符集、编码方法、语言等。有两种类型的协商:服务器驱动和代理驱动(即浏览器驱动)。服务器驱动是从浏览器发出请求开始的,请求指定首选列表以及要求的数据项的 URL ;服务器从可用的表示法中选出符合浏览器首选要求的一项,如果有多项符合条件,则服务器进行“最好的猜测”。在代理驱动协商方法中,浏览器首先向服务器发送请求,询问可用的内容,服务器返回可能的内容列表;浏览器选择其中一个可能项,发送第二个请求获得该数据项。
HTTP 还允许发送方有条件地请求,即当浏览器发送请求时,可以在头部说明在哪种条件下应该响应请求,如果不符合条件,服务器不返回请求的数据项。条件请求通过避免不必要的传输,可使浏览器优化检索过程。
 
(9) Web 性能优化
       随着 Web 应用的普及,互联网络流量激增,网络经常处于超载状态,网络响应速度变慢。针对这种情况,人们提出了几种改善 Web 传输效率的技术,目的是尽量避免不必要的传输,减少网络负载,从而加快响应速度。
 
Web 缓存
第一种方法是 Web 缓存,即将请求到的网页放到缓存中,以备过后还要使用。通常的做法是用一个称为代理的进程来维护这个缓存,浏览器被配置为向代理而不是真正的服务器请求网页。当缓存中有所请求的页时,代理直接将页返回,否则先从服务器取回,添加到缓存中,然后返回给请求页的客户。
       在这里涉及到两个重要的问题,一是谁来做缓存,二是一个页可以缓存多长时间。在实际的使用中,每一台 PC 机通常都会运行一个本地代理,缓存自己请求过的页,以便在需要时快速找到自己访问过的页。在一个公司的局域网上,通常有一台专门的机器作为代理,该代理可被所有的机器访问。许多 ISP 也运行代理,以便为它的客户提供更快速的服务。通常所有这些代理都是一起工作的,因此请求首先被发送到本地代理,如果本地缓存中没有,本地代理会向局域网代理查询,如果局域网代理也没有,局域网代理会向 ISP 代理查询,若 ISP 代理也没有,它必须向更高层的代理请求(如果有的话)或者向真正的服务器查询。每个代理都将获得的页添加到自己的缓存中,然后再返回给请求者。这种方法称为分级缓存,一种可能的实现示于图 7-45 中。
       确 定一个页需要缓存多长时间是比较困难的,因为这和页的内容以及生成时间等各种因素都有关系。事实上,所有高速缓存方案中的主要问题都是和时限有关,一方 面,保留高速缓存的副本时间太长会使副本变得陈旧,另一方面,如果保留副本的时间不够长效率就会降低。因此,方案的选择既要考虑到用户对过时信息的忍受程 度,也要考虑到系统为此付出的开销。
解决这个问题有两种方法,第一种方法是使用一个启发式来猜测每个页要保存多长时间,常用的一个启发式是根据 Last-Modified 头来确定保存时间,即若一个页是在距今 D T 时间前更新的,那么这个页可以在缓存中存放 D T 时间。尽管这个启发式在实际工作中运行得很好,但它确实会经常返回过时的页。另一种方法是使用条件请求,代理将客户请求的页的 URL 及缓存中该页的最后修改时间放入 If-Modified-Since 请求头中发送给服务器,若服务器发现该页自请求头中给出的时间以后未曾修改过,就发回一个简短的 Not Modified 消息,告诉代理可以使用缓存中的页,否则返回新的页。尽管该方法总是需要一个请求消息和一个响应消息,但是当缓存中的页仍然有效时响应消息是非常短的。这两种方法也可以结合起来使用,在取回页之后的 D T 时间内,如果有客户请求该页,代理直接从缓存中取出来交给客户,在此时间之后,代理使用 If-Modified-Since 消息检查页的有效性, D T 的选择通常总是根据页最后一次修改至今(取页时)经过的时间,并使用某种启发式方法。
       包含动态内容的页不应该被缓存,为此定义了一种通用的机制,允许服务器指示网页返回途中经过的每一个代理,再次使用该页前必须检查其有效性。这个机制也可用于任何可能变化非常快的网页。
       改善性能的另一个方法是积极缓存,当代理从服务器取得一个页后,它可以检查一下该页上是否有指向其它页的链接,如果有就向相关的服务器发送请求预取这些页,放在缓存中以备今后需要。这种方法能够减小后继请求的访问时间,但它也会消耗许多带宽取来许多可能根本不会用的页。
      
服务器复制
       Web 缓存是为改善 Web 性能而在客户端采用的技术,也有服务器端的技术,最常见的技术是服务器在多个相距较远的位置上复制它们的内容,这种技术称为镜像。一些访问量很大的站点,如 IEEE 的站点,通常会在世界各地设置一些镜像站点,以便用户可以从最近的站点获得服务。
       镜 像站点一般是静态的,首先由网站管理层决定在哪些地方设置镜像站点,然后在这些地方放置一个服务器,将原始服务器上的部分或全部内容拷贝到镜像服务器上, 站点的选择通常会保持数月或数年。但有时一些突发事件会使得一个原本默默无闻的网站突然之间变成全世界点击的焦点,巨大的流量很快使得 Web 服务器崩溃。因此,服务器应该有一种动态创建镜像的能力,即当服务器检测到流量剧烈增加时,自动在一些预先设置好的位置上创建自己的镜像,维护内容的一致性,直到该事件的影响过去后再自动关闭这些镜像。
 
内容投递网络 CDN
       因特网上有许多为用户提供内容服务的内容提供商,他们建有自己的信息网站,提供音乐、视频、新闻等各种服务。内容提供商通常借助内容投递网络( CDN )来为自己发送信息, CDN 会和数量众多的 ISP 签订协议,以允许在 ISP 的网络上放置自己远程可控的服务器。大型的 CDN 在全球各地可能拥有上万台服务器。
       如何将客户的请求重定向到离他最近的 CDN 服务器呢?以下是一种可能的方法。当内容提供商将自己的网站地址告诉 CDN 时, CDN 对每一个网页进行预处理,将网页中的所有 URL 替换为指向 CDN 服务器的 URL ,修改后的网页仍然存回到内容提供商的 Web 服务器上。这种修改基于这样的假设,即内容提供商的服务器中存放的网页大都很小,只包含 HTML 文本,但其中的链接通常指向很大的文件,如图像、音频、视频等。这些包含文本的网页(通常是一些内容选择菜单)仍然放在内容提供商的服务器上,并按正常方式访问,而图像、音频、视频等内容放到了 CDN 的服务器上。
       当用户输入内容提供商的网址时,取回被 CDN 修改后的网页,当用户点击其中的链接时,用户的请求会被重定向到 CDN 服务器上。 CDN 服务器并不包含任何内容,它只是一个伪 HTTP 服务器,它检查文件名和服务器名以确定请求的是哪个内容提供商的哪一个网页,它也检查输入请求的 IP 地址并查找数据库,确定用户大概在什么位置。有了这些信息后,它就可以决定使用哪一个 CDN 内容服务器为用户服务最合适,当然这个决定是很困难的,因为地理位置上最近的服务器不一定在网络拓扑结构上也是最近的,而网络拓扑上最近的服务器可能当前非常繁忙。当做出了这样的决定后,服务器会向客户返回一个带有 Location 头的响应消息,给出距用户最近的 CDN 内容服务器上文件的 URL ,这样客户的请求就被重定向到了距用户最近的 CDN 内容服务器。这些过程可见图 7-47 所示的例子。
       通常,伪 HTTP 服务器会将客户的请求重定向到距客户最近的 CDN 代理, CDN 代理拥有一个很大的缓存,里面预先下载了最重要的内容,当缓存中没有所要求的内容时, CDN 代理再从真正的 CDN 内容服务器去取,并放到自己的缓存中。
 
5.        多媒体应用
       从 字面上说,多媒体就是两种或两种以上的媒体。按照这个意义,同时包含了文字和图形的书就可称为是多媒体读物。但文字和图形混排早在“多媒体”这个术语问世 前就已经存在了,显然它不是通常意义上所说的多媒体技术。文字和图形称为是时间独立的(或称离散的)媒体,因为它们不包含任何时间因素。音乐和电影是时间 依赖的(或称连续的)媒体,它们包含的信息必须随着时间的流动才能显现出来。我们通常所说的多媒体应用至少必须包含一种连续的媒体,而连续媒体通常就是指 音频或视频。
最近几年,通过因特网发送和接收音 / 视频的网络应用呈现出爆炸式增长的趋势,如网上音乐中心、 IP 电 话、视频点播、视频会议、交互式游戏、虚拟世界、远程医疗、远程教育等等。这些应用的服务需求明显不同于我们前面介绍的弹性应用(如电子邮件、万维网、文 件传输等)。对于弹性应用来说,最重要的是数据完整,延时当然是越小越好,但长延时也是可以忍受的。相反,许多多媒体应用是高度时延敏感的,但它们却能容 忍少量的丢包,因为偶尔的丢包只会在音 / 视频回放时出现一些干扰,而这些干扰常常可以被部分或全部隐藏。
 
(1)     多媒体应用的分类
       多媒体应用可以被分成三种类型:流式存储音 / 视频,流式实况音 / 视频,实时交互音 / 视频。我们在此不讨论下载播放应用,例如在回放一部电影前,先通过文件传输将电影下载到本地磁盘中,然后进行回放。这类应用属于没有任何特殊时延要求的弹性应用。
       在流式存储音 / 视频应用中,压缩的音频或视频文件已经预先存储在服务器上,用户下载这些文件进行播放。在这里需要注意的是,客户机通常从服务器接收文件几秒后就开始播放,这意味着当客户机从文件的一个位置开始播放音 / 视频时,还在从服务器中接收文件的后续部分。这个技术称为流( streaming ), 它避免了在开始播放之前必须下载整个文件(这可能引起较长的延时)。一旦多媒体内容开始播放,它就应该根据最初记录的时序进行,这就对数据的传输时延提出 了严格的限制,因为客户机必须从服务器中及时接收数据。由于多媒体的内容已经预先录制并存储在服务器上,因此一个用户可以暂停、倒退、快进或者检索多媒体 内容。从一个客户机提出这种请求到该动作在客户机中表现出来,这期间可接受的响应时间应该为 1~10 秒。目前已有很多流式多媒体产品,如 RealPlayer Windows Media QuickTime 等。
       流式实况音 / 视频应用类似于传统的电台广播和电视,只是它通过因特网来传输,这类应用允许用户接收来自世界任何角落的实况广播和电视传输。它和流式存储多媒体应用一样要求连续播放,但由于流式实况音 / 视频不是已存储的数据,客户机不能实现快进。从用户请求一个实况播放到播放开始可以容忍的时延最多为几十秒。与流式存储多媒体应用通常是点对点传输不同,实况广播类的应用经常有很多客户机接收同样的音 / 视频节目,因此使用 IP 多播技术能够有效地向多个接收方分发多媒体数据。
       实时交互音 / 视频应用允许人们使用音 / 视频进行实时通信,这类应用包括因特网电话、视频会议等。这类应用对端到端延时的要求最高。用户可以在任何时刻说话或者移动,多个交谈者之间可以交互谈话,从一个用户说话或者移动到某个动作到在接收主机上呈现的时延应该小于几百毫秒。对于语音,小于 150 毫秒的延时不会被听者觉察, 150~400 毫秒的时延能够接受,当时延超过 400 毫秒时,即使不会使对话变得完全无法理解,也会对语音对话造成损害。目前较著名的因特网电话包括 Skype MSN Messenger Yahoo Messenger 等,可用的实时视频会议产品包括微软的 NetMeeting 等。
 
(2)     因特网广播的实现
       虽然从理论上说因特网广播( Internet Radio )宜采用 IP 多播实现,但在实际的实现中却是每个客户与电台建立一条单独的 TCP 连接,然后在 TCP 连接上传输音频数据。
       在因特网广播中采用 TCP 单播而不是更好的 RTP 多播,主要有三个方面的原因:( 1 )许多 ISP 不支持多播;( 2 TCP 已被广泛应用并被所有的软件包支持, RTP 却是陌生得多;( 3 )许多用户在工作时收听因特网广播,但大多数系统管理员在配置系统的防火墙时仅允许某些熟知端口的 TCP 包和 UDP 包通过(如 SMTP DNS HTTP 报文),其它所有数据包均会被过滤掉(包括携带 RTP 报文的 UDP 包)。因此,因特网广播穿过防火墙的唯一办法是让提供电台广播服务的服务器看起来像一个 HTTP 服务器,用户与服务器建立 TCP 连接,并在其上运行 HTTP 协议。
 
(3)     流式音 / 视频应用的实现
       在流式存储音 / 视频应用中,客户机请求存储在服务器上的音 / 视频文件。这些服务器可能是普通的 Web 服务器,也可能是为音 / 视频流应用定制的特殊流式服务器。收到客户机的请求后,服务器通过将文件发送到一个套接字来将音 / 视频文件发送给客户机, TCP UDP 的套接字在实际中都有使用。在向网络发送音 / 视频文件之前,文件被分段,这些报文段通常用适合音 / 视频流的特殊头部进行封装,实时传输协议( Real-time Transfer Protocol RTP )是封装这种报文段的一个公共域标准。当请求的音 / 视频文件到达之后,客户机通常在几秒之内开始播放这个文件。大多数现有的产品也为用户提供交互功能,例如暂停 / 继续、快进和快退等。这种交互性也要求有一个客户 / 服务器协议,实时流协议( Real-Time Streaming Protocol RTSP )就是为用户提供交互性的一个公共域协议。音 / 视频流需要一个称为媒体播放器的应用程序来播放。
       当音 / 视频文件存储在 Web 服务器上时,音 / 视频流的实现通常采用下图的结构。当用户点击音 / 视频文件的超级链接时,该超级链接没有直接指向音 / 视频文件,而是指向一个元文件,这个元文件包括了实际音 / 视频文件的 URL Web 服务器将元文件封装在 HTTP 响应报文中发送给用户的 Web 浏览器,响应头中的 Content-type 行指示特定的音 / 视频应用。浏览器分析响应头中的 Content-type 行,调用相关的媒体播放器,并将元文件传递给媒体播放器。媒体播放器与 Web 服务器建立 TCP 连接,在该连接上发送一个请求该音 / 视频文件的 HTTP 请求报文。音 / 视频文件通过 HTTP 响应报文发送给媒体播放器,媒体播放器以流的形式进行播放。
在上面的结构中,媒体播放器和服务器通过 HTTP 通信,因而也通过 TCP 通信。通常 HTTP 被认为不足以使用户和服务器进行满意地交互,特别是 HTTP 不易让用户(通过媒体播放器)向服务器发送暂停 / 继续、快进和时间跳跃命令,因而许多销售流式音 / 视频产品的公司不推荐这种体系结构。为了绕开 HTTP / TCP ,音 / 视频文件通常存储在流式服务器( streaming server )上,并直接向媒体播放器发送。这种体系结构需要两台服务器,如下图所示。一台服务器是 Web 服务器,用于 Web 页服务(包括元文件);另一台服务器是流式服务器,用于音 / 视频文件服务。这两台服务器能够运行在同一个端系统内或者两个不同的端系统中。 Web 浏览器仍然使用 HTTP Web 服务器获得元文件,然后调用相应的媒体播放器,将元文件传递给媒体播放器。媒体播放器和流式服务器通过自己的协议进行交互,如使用 RTP 传输音 / 视频数据,使用 RTSP 进行交互控制等。 RTSP 规范允许 RTSP 报文通过 TCP UDP 发送,使用的端口为 544
 
(4)     实时交互式音 / 视频应用的实现
       在实时交互式音 / 视 频应用中,需要有一个会话控制协议,负责在会话的双方之间建立、管理和终止呼叫连接。比如,会话开始时允许呼叫者通知被叫者它要开始一个呼叫并协商媒体编 码类型,在呼叫持续阶段允许增加新的媒体流、改变编码、邀请新的参与者、呼叫转移和呼叫保持等,最后允许参与者结束呼叫。 SIP Session Initiation Protocol )和 H.323 就是这样的两个协议,其中 SIP 来源于 IETF ,而 H.323 来源于国际电信联盟 ITU
       在上图的例子中,假设 Alice Bob PC 机都安装了基于 SIP 的软件, Alice 知道 Bob PC 机的 IP 地址,并想向 Bob 发起呼叫。当 Alice Bob 发送一个 INVITE 报文(类似于 HTTP 请求报文)时, SIP 会话开始。 INVITE 报文通过 UDP (也可以通过 TCP )发送给 Bob 5060 端口( SIP 的熟知端口),该报文包括 Bob 的标识( bob@193.64.210.89 )、 Alice IP 地址、 Alice 准备接收音频文件的端口( 38060 )、可接受的音频编码格式( AVP 0 )、音频文件的传输协议( RTP )等。 Bob 发送一个同意报文(类似于 HTTP 响应)到 Alice 5060 端口,响应报文包括他的 IP 地址、可接受的音频编码格式( AVP 3 )、准备接收音频文件的端口( 48753 )、音频文件的分组化方法( RTP )等。 Alice Bob 发送确认报文后,双方就可以开始交谈了。 Bob Alice 发送的音频文件是 AVP 0 编码格式的,而 Alice Bob 发送的音频文件是 AVP 3 编码格式的。在这个例子中,如果 Bob 没有 AVP 0 编码器,则 Bob 可以发送一个不可接受的响应,并在报文中列出他能够支持的所有编码格式;然后 Alice 从中选择一种编码格式,并发送另一个 INVITE 报文,以此通知已选择的编码格式。 Bob 也可以发送某个拒绝代码(如 busy gone forbidden 等)来直接拒绝该呼叫。

文章来源:http://yyhome.blog.51cto.com/378350/124362
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值