假定你对新型网络应用有了一些想法。也许这种应用将为人类提供一种伟大的服务。我们现在考察一下如何将你的想法转变为一种真实世界的网络应用。
研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序。例如,在Web应用程序中,有两个互相通信的不同的程序:一个是运行在用户主机上的浏览器程序;另一个是运行在Web服务器主机上的Web服务器程序。另一个例子是P2P在这种情况下,在参与文件共享的社区中的每台主机都有一个程序。在这种情况下,在各台主机中的这些程序可能都是类似的或相同的。
因此,当研发新应用程序时,你需要编写将多台端系统上运行的软件。还软件能够用如C、Java或Python来编写。重要的是,你不需要写在网络核心设备如路由器或链路层交换机上运行的软件。即时你要为网络核心设备写应用程序软件,你也不能做到这一点。如我们所知,网络核心设备并不在应用层上起作用,而仅在较低层起作用,特别是在网络层及下面层次起作用。
网络应用程序体系结构
当进行软件编码之前,应当对应用程序有一个宽泛的体系结构计划。记住应用程序的体系结构明显不同于网络的体系结构。从应用程序研发者的角度看,网络体系结构是固定的,并为应用程序提供了特定的服务集合。在另一方面,应用程序体系结构(application architecture) 由应用程序研发者设计,固定了如何在各种端系统上组织该应用程序。在选择应用程序体系结构时,应用程序研发者很可能利用现代网络应用程序中所使用的两种主流体系结构之一:客户-服务器体系结构或对等(P2P)体系结构。
在客户-服务器体系结构(client-server architecture)中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。一个典型的例子是Web应用程序,其中总是打开的Web服务器服务于来自浏览器的请求。当Web服务器接收到来自某客户对某对象的请求时,它向该客户发送所请求的对象作为响应。值得注意的是利用客户-服务器体系结构,客户互相之间不直接通信;客户-服务器体系结构的另一个特征是该服务器具有固定的,周知的地址,并且因为该服务器总是打开的,客户总是能通过向该服务器的IP地址发送分组来与其联系。具有客户-服务器体系结构的非常著名的应用程序包括Web、FTP、Telnet和电子邮件。
在一个客户-服务器应用中,常常会出现一台单独的服务器主机跟不上它所有客户请求的情况。例如,一个流行的社交网络站点如果仅有一台服务器来处理所有请求,将很快变得不堪重负。为此,配备大量主机的数据中心(data center)常被用于创建爱强大的虚拟服务器。
在一个P2P体系结构(P2P architecture)中,对位于数据中心的专用服务器有最小的依赖。相反,应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方。这些对等方并不为服务提供商所有,相反却为用户控制的桌面机和膝上机所有,大多数对等方驻留在家庭、大学和辨办公室。因为这种对等方通信不必通过专门的服务器,该体系结构被称为对等方到对等方的。许多目前流行的、流量密集型应用都是P2P体系结构的。这些应用包括文件共享(例如BitTorrent)、对等方协助下载加速器(迅雷)、因特网电话和视频会议(例如Skype)。
需要提及的是,某些应用具有混合的体系结构,它结合了客户-服务器和P2P的元素。例如,对于许多即时讯息应用而言,服务器被用于跟踪用户的IP地址,但用户到用户的报文在用户主机之间(无需通过中间服务器)直接发送。
进程通信
在构建网络应用程序前,还需要对运行在多个端系统上的程序是如何互相通信的情况有一个基本了解。用操作系统的术语来说,进行通信的实际上是进程(process)而不是程序。一个进程可以被认为是运行在端系统中的一个程序。当多个进程运行在相同的端系统上时,它们使用进程间通信机制互相通信。进程间通信的规则由端系统上的操作系统确定。我们并不特别关注同一台主机上的进程间的通信,而关注运行在不同端系统上的进程间的通信。
在两个不同端系统上的进程,通过跨越计算机网络交换报文(message)而互相通信。发送进程生成并向网络中发送报文;接受进程接收这些报文并可能通过回送报文进行响应。