网络应用程序体系结构
网络体系结构是固定的,这些固定的体系结构为应用程序提供了特定的服务集合,数据在网络中传输都会使用固定的体系结构。目前比较主流的体系结构有:C/S体系结构和P2P体系结构。
C/S体系结构
C/S体系结构全称client-server-architecture,翻译过来就是“客户端-服务端体系结构”。在C/S体系结构中,有一个总是打开的端系统(主机)称为服务端,它服务来自许多其它端系统即客户端的请求,服务端的ip地址是固定并且暴露的。很多应用程序都是基于这个体系结构的,比如一个Web应用,客户端通过浏览器输入一个http请求地址,然后就可以访问服务端的资源了,因此,服务端会接收大量的客户端请求,所以对服务端的性能要求也是比较高的,同样地需要配备大量的数据中心来存放客户端的数据。
P2P体系结构
P2P模式指的是应用程序在间断连接的端系统之间使用直接通信,这些主机对被称为对等方,在P2P模式中,对位于数据中心的专用服务器有最小甚至没有依赖。一些流量密集型的数据传输就是使用P2P对等模式,比如:文件共享(BitTorrent)、对等方协助下载器(迅雷)、因特网电话和视频会议(Skype)。在P2P模式中,可以没有服务器。如果有服务器,也只会做一些辅助操作,比如:跟踪用户的ip地址,但用户之间传输报文是不需要经过服务器的。
进程通信
一个进程可以被认为是运行在端系统中的一个应用程序,当多个进程运行在相同的端系统上面时,他们会由操作系统完成进程间的通信,但是进程运行在不同的端系统上面,他们之间的通信就需要借助计算机网络来进行,两个不同端系统上的进制之间传输的数据叫做报文。
客户和服务器进程
不同端系统上面的两个进程间的通信,我们习惯将其中一个进程标识为客户,另一个进程标识为服务器。通常,将发起通信的进程标识为客户,等待联系的进程是服务器。对于Web应用而言,浏览器就是客户,而Web应用所在的进程就是服务器;对于P2P文件共享而言,下载文件的对等发被标识为客户,而上传文件的对等方被标识为服务器。
说明: 尽管在P2P体系结构中,并没有客户端和服务端的说法,但是还是习惯这样标识。
进程与计算机网络之间的接口
多数应用程序是由通信进程对组成,每对中的两个进程互相发送报文。从一个进程向另一个进程发送的报文必须通过网络。进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接收报文。套接字也被称为应用程序编程接口,是同一台主机内应用层和传输层之间的接口,应用程序开发者可以控制套接字在应用层的一切,但是对传输层几乎没有控制权。开发者对传输层的控制仅限于下面两点:
- 选择传输层协议
- 设置几个传输层参数,比如:最大缓存、最大报文长度
进程寻找
像其它端系统进程发送报文肯定需要这个端系统进程的地址,一般使用下面两个参数标志接收方的端系统进程:
- 主机的ip地址
在接收方主机中指定接收进程的标识符,这个标识符可以是端口号,也可以是进程号,只要能标识接收方进程即可
可供应用程序使用的运输服务
应用程序需要的服务通常需要四个分类:可靠数据传输、吞吐量、定时和安全性。
可靠数据传输
如果由应用程序的一端发送的数据正确、完全地交付给该应用程序的另一端,就认为这个协议提供了可靠数据传输。当一个运输层协议不提供可靠数据传输时,由发送进程发送的某些数据可能到达不了接收进程。这可能被容忍丢失的应用(loss-tolerant application)所接受,最值得注意的是多媒体应用,如交谈式音频/视频,它们能够承受一定量的数据丢失,在这些多媒体应用中,丢失的数据引起播放的音频/视频出现小干扰,而不是致命的损伤,但是对可靠数据传输要求比较高的数据则无法接收。
吞吐量
具有吞吐量要求的应用程序被称为带宽敏感的应用(bandwidth-sensitive application),许多当前的多媒体应用是带宽敏感的,尽管某些多媒体应用程序可能采用自适应编码技术对数字语音或视频以与当前可用带宽相匹配的速率进行编码。带宽敏感的应用具有特定的吞吐量要求,而弹性应用(elastic application)能够根据当时可用的带宽或多或少地利用可供使用的吞吐量。电子邮件、文件传输以及Web传送都属于弹性应用。当然,对于任意数据的传输吞吐量是越多越好。
定时
传输层协议也能提供定时保证,如同具有吞吐量保证那样,定时保证能够以多种形式实现。一些在线游戏就需要运输层提高定时保证,在线游戏不允许有很大的延迟。
安全性
运输协议能够为应用程序提供一种或多种安全性服务。例如,在发送主机中,运输协议能够加密由发送进程传输的所有数据,在接收主机中,运输层协议能够在将数据交付给接收进程之前解密这些数据。这种服务将在发送和接收进程之间提供机密性,以防该数据以某种方式在这两个进程之间被观察到。
因特网提供的运输服务
因特网(更一般的是TCP/IP网络)为应用程序提供两个运输层协议,即UDP和TCP。当你(作为一个软件开发者)为因特网创建一个新的应用时,首先要做出的决定是,选UDP还是选TCP。每个协议为调用它们的应用程序提供了不同的服务集合。
TCP服务
TCP服务模型包括面向连接服务和可靠数据传输服务,当某个应用程序调用TCP作为其运输协议时,该应用程序就能获得来自TCP的这两种服务。
面向连接的服务:在应用层数据报文开始流动之前,TCP让客户和服务器互相交换运输层控制信息,即握手。这个所谓的握手过程提醒客户和服务器,让它们为大量分组的到来做好准备。在握手阶段后,一个TCP连接(TCP connection)就在两个进程的套接字之间建立了。这条连接是全双工的,即连接双方的进程可以在此连接上同时进行报文收发。当应用程序结束报文发送时,必须拆除该连接。
- 可靠的数据传送服务:通信进程能够依靠TCP无差错、按适当顺序交付所有发送的数据。当应用程序的一端将字节流传进套接字时,它能够依靠TCP将相同的字节流交付给接收方的套接字,而没有字节的丢失和冗余。
TCP协议还具有拥塞控制机制,这种服务不一定能为通信进程带来直接好处,但能为因特网带来整体好处。当发送和接收方之间的网络出现拥塞时,TCP的拥塞控制机制会抑制发送进程。
UDP服务
UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。UDP是无连接的,因此在两个进程通信前没有握手过程。UDP协议提供一种不可靠数据传送服务,也就是说,当进程将一个报文发送进UDP套接字时,UDP协议并不保证该报文将到达接收进程。不仅如此,到达接收进程的报文也可能是乱序到达的。UDP没有包括拥塞控制机制,所以UDP的发送端可以用它选定的任何速率向其下层(网络层)注入数据。
