所有的网络应用都是基于相同的基本编程模型(客户端-服务器编程模型),有着相似的整体逻辑结构,并且依赖相同的编程接口。
客户端-服务器编程模型
每个网络应用都是基于客户端-服务器模型的。采用这个模型,一个应用是由一个服务器进程和一个或者多个客户端进程组成。服务器管理某种资源,并且通过操作这种资源来为它的客户端提供某种服务。例如,一个Web服务器管理着一组磁盘文件,它会代表客户端进行检索和执行。
客户端-服务器模型中的基本操作是事务(transaction)。一个客户端-服务器事务由以下四步组成。
- 当一个客户端需要服务时,它向服务器发送一个请求,发起一个事务。例如,当Web浏览器需要一个文件时,它就发送一个请求给Web服务器。
- 服务器收到请求后,解释它,并以适当的方式操作它的资源。例如,Web服务器收到浏览器发出的请求后,它就读一个磁盘文件。
- 服务器给客户端发送一个响应,并等待下一个请求。例如,Web服务器将文件发送回客户端。
- 客户端收到响应并处理它。例如,当Web浏览器收到来自服务器的一页后,就在屏幕上显示此页。
客户端和服务器是进程,而不是常提到的机器或者主机。
客户端-服务器事务不是数据库事务,没有数据库事务的任何特性,例如原子性。在我们的上下文中,事务仅仅是客户端和服务器执行的一系列步骤。
网络
客户端和服务器通常运行在不同的主机上,并且通过计算机网络的硬件和软件资源来通信。
对主机而言,网络只是右一种I/O设备,是数据源和数据接收方。
物理上而言,网络是一个按照地理远近组成的层次系统。最底层是LAN(Local Area Network,局域网)。
以太网
迄今为止,最流行的局域网技术就是以太网(Ethernet),它是由施乐公司帕洛阿尔托研究中心(Xerox PARC)在20世纪70年代中期提出来的。
一个以太网段(Ethernet segment)包括一些电缆(通常是双绞线)和一个叫做集线器的小盒子。
每根电缆都有相同的最大位带宽,通常是100Mb/s或者1Gb/s。电缆的一端连接到主机的适配器,而另一端则连接到集线器的一个端口上。
集线器不加分辨的将从一个端口上收到的每个位复制到其他所有的端口上。因此,每台主机都能看到每个位。
每个以太网适配器都有一个全球唯一的48位地址,它存储在这个适配器的非易失性存储器上。
一台主机可以发送一段位(称为帧(frame))到这个网段内的其他任何主机。每个帧包括一些固定数量的头部(header)位,用来标识此帧的源和目的地址以及此帧的长度,此后紧随的就是数据位的有效荷载(payload)。每个主机适配器都能看到这个帧,但是只有目的主机实际读取它。
桥接以太网
使用一些电缆和叫做网桥(bridge)的小盒子,多个以太网段可以连接成较大的局域网,称为桥接以太网(bridged Ethernet),如图11-4所示。
在一个桥接以太网里,一些电缆连接网桥与网桥,而另外一些连接网桥和集线器。这些电缆的带宽可以是不同的。
网桥比集线器更充分的利用了电缆带宽。利用一种聪明的分配算法,它们随着时间自动学习哪个主机可以通过哪个端口可达,然后只在有必要时,有选择的将帧从一个端口复制到另一个端口。例如,如果主机A发送一个帧到同网段上的主机B,当该帧到达网桥X的输入端口时,X就将丢弃此帧,因而节省了其它网段上的带宽。然而,如果主机A发送一个帧到一个不同网段上的主机C,那么网桥X只会把此帧复制到和网桥Y相连的端口上,网桥Y会只把此帧复制到与主机C的网段连接的端口。
互联网
在层次的更高级别中,多个不兼容的局域网可以通过叫做路由器(router)的特殊计算机连接起来,组成一个internet(互联网络)。
互联网络至关重要的特性是,它能由采用完全不同和不兼容技术的各种局域网和广域网组成。
解决互联网络某台源主机跨过所有这些不兼容的网络发送数据位到另一台目的主机的方法就是一层运行在每台主机和路由器上的协议软件,它消除了不同网络之间的差异。这个软件实现一种协议,这种协议控制主机和路由器如何协同工作来实现数据传输。这种协议必须提供两种基本能力:
- 命名机制。不同的局域网技术有不同和不兼容的方式来为主机分配地址。互联网络协议通过定义一种一致的主机地址格式消除了这些差异。每台主机会被分配至少一个这种互联网络地址(Internet address),这个地址唯一的标识了这台主机。
- 传送机制。在电缆上编码位和将这些位封装成帧方面,不同的联网技术有不同的和不兼容的方式。互联网络协议通过定义一种把数据位捆扎成不连续的片(称为包)的统一方式,从而消除了这些差异。一个包是由包头和有效载荷组成的,其中包头包括包的大小以及源主机和目的主机的地址,有效载荷包括从源主机发出的数据位。
全球IP因特网
全球IP因特网是最著名和最成功的互联网络实现。
因特网客户端-服务器应用程序的基本硬件和软件组织:
每台因特网主机都运行实现TCP/IP协议(Transmission Control Protocol/Internet Protocol,传输控制协议/互联网络协议)的软件,几乎每个现代计算机系统都支持这个协议。
因特网的客户端和服务器混合使用套接字接口函数和Unix I/O函数来进行通信。通常将套接字函数实现为系统调用,,这些系统调用会陷入内核,并调用各种内核模式的TCP/IP函数。
网路协议详见: