《计算机网络》 2.1应用层协议原理
研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序。
事实上,即使你要为网络核心设备写应用程序软件,也是做不到的,因为他们在网络层及以下层次起作用
这种基本设计,即将应用软件限制在端系统的方法,促进了大量网络应用程序的快速研发和部署。
2.1.1 网络应用程序体系结构
当进行软件编码之前,应当对应用程序有一个宽泛的体系结构计划。
请记住应用程序的体系结构明显不同与网络的体系结构,例如因特网体系结构等
从应用程序研发者的角度看,网络体系结构是固定的,并为应用程序提供了特定的服务集合
在另一方面,应用程序体系结构由应用程序研发者设计,规定了如何在各种端系统上组织该应用程序
在选择应用程序体系结构时,应用程序研发者很可能利用现代网络应用程序中所使用的两种主流体系结构之一
即 客户—服务器体系结构 或 对等(P2P)体系结构。下面我们来详细介绍一下这两种体系结构:
客户—服务器体系结构是常见的体系结构。例如在 Web 应用程序中,有两个相互通信的不同程序,
一个是运行在用户主机上的浏览器程序,另一个是在 Web 服务器主机上运行的 Web 服务器程序
用户主机不是唯一的,我们通常也称为客户主机。而总是打开的 Web 服务器主机服务于浏览器的请求
当 Web 服务器接受到来自某客户(通过浏览器)对某对象的请求时,它向该客户发送所请求的对象作为响应
值得注意的是利用客户—服务器,客户相互之间不直接通信。
客户—服务器体系结构的另一个特征是:该服务器具有固定的、周知的地址,该地址称为 IP 地址。
该特征使得客户总是能通过向该服务器的 IP 地址发送分组来与其联系。
具有客户—服务器体系结构的非常著名的应用程序包括 Web、FTP、Telnet 和电子邮件。
在一个客户—服务器应用中,常常会出现一台单独的服务器主机跟不上它所有的客户请求的情况
例如,一个流行的社交网络站点如果仅有一台服务器来处理所有请求,将很快变得不堪重负。
为此,配备大量主机的数据中心常被用于创建强大的虚拟服务器。
显然,数据中心可以有多个,并且一个数据中心可以有数十万台服务器,可以想象其互联和带宽费用的巨大。
在一个 P2P 体系结构 中,对位于数据中心的专用服务器有最小的(或者没有)依赖
相反,应用程序在间断连接的主机对之间使用直接通信,这些 主机对 被称为 对等方 。
这些对等方并不为服务提供商拥有,相反缺位用户控制的桌面机和膝上机 (laptop) 所有
因为这种对等方通信不必通过专门的服务器,所以该体系结构被称为对等方到对等方的。
许多目前流行的、流量密集型应用都是 P2P 体系结构的。
包括文件共享(如 BitTorrent )、对等方协助下载加速器(如迅雷)、因特网电话和视频会议(如 Skype)等
需要注意的是,某些应用具有混合的体系结构,它结合了客户—服务器和 P2P 的元素
例如,对于许多即时讯息应用而言,服务器被用于跟踪用户的 IP地址,
但用户到用户的报文在用户主机之间(无需通过中间服务器直接发送)
P2P 体系结构的最引人入胜的特性之一是它们的自扩展性。
例如,在一个 P2P 文件共享应用中,尽管每个对等方都由于请求文件产生工作负载,但每个对等方通过向其他对等方分发文件也为系统增加服务能力。
P2P 体系结构也是有成本效率的, 因为它们通常不需要庞大的服务器基础设施和服务器带宽(这与具有数据中心的客户—服务器设计形成鲜明对比)。
然而,末来 P2P 应用由于高度非集中式结构,面临安全性、性能和可靠性等挑战。
2.1.2 进程通信
用操作系统的术语来说,进行通信的实际上是进程而不是程序。
一个进程可以被认为是运行在端系统中的一个程序。
当多个进程运行在相同的端系统上时,它们使用进程间通信机制相互通信
此时进程间通信的规则由端系统上的操作系统决定,操作系统不同,通信规则可能不同
而这不是我们的关注点,本书&笔记仅考虑运行在不同端系统上的进程的通信。
在两个不同端系统的进程,通过跨越计算机网络 交换报文 而相互通信。
发送进程生成并向网络中发送报文,接收进程接收这些报文并可能通过回送报文进行响应。
1. 客户与服务器进程
网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。
例如,在 Web 应用程序中,一个客户浏览器进程与一台 Web 服务器进程交换报文。
在一个 P2P 文件共享系统中,文件从一个对等方中的进程传输到另一个对等方中的进程。
对每对通信进程,我们通常将这两个进程之一标识为客户,而另一个进程标识为服务器 。
对于 Web 而言,浏览器是一个客户进程,Web 服务器是一台服务器进程。
对于 P2P 文件共享,下载文件的对等方标识为客户,上载文件的对等方标识为服务器。
不难发现,在 P2P 文件共享的某些应用中,一个进程能够既是客户又是服务器。
在 P2P 文件共享系统中,一个进程的确既能上载文件又能下载文件。
无论如何,在任何给定的「一对进程之间的通信会话」场景中,
我们仍能将一个进程标识为客户,另一个进程标识为服务器。
一般地,我们定义客户和服务器进程如下:
在一对进程之间的通信会话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户,在会话开始时等待联系的进程是服务器。
在 Web 中一个浏览器进程向一台 Web 服务器进程发起联系
则该浏览器进程是客户,Web 服务器进程是进程。
在 P2P 文件共享中,当对等方 A 请求对等方 B 发送一个特定的文件时,
在这个特定的通信会话中对等方 A 是客户,而对等方 B 是服务器。
在不致混淆的情况下,我们有时也是用属于“应用程序的客户端和服务器端”。
2. 进程与计算机网络之间的接口
如上所述,多数应用程序是由通信进程对组成,每对中的两个进程相互发送报文。
从一个进程向另一个进程发送的报文必须通过下面的网络。
进程通过一个称为套接字的软件接口向网络发送报文和从网络接受报文。
打个比方,进程是一座房子,则套接字就是它的门。(注意,套接字是软件接口)
当一个进程想向位于另一台主机上的另一个进程发送报文时,它会把要发的报文推出该“门”。
该发送进程假定该门到另外一侧之间有运输的基础设施,该设施将把报文传送到目的进程的门口。
一旦该报文抵达目的主机,它通过接受进程的“门”传递,然后接收进程对该报文进行处理。
上图显示了两个经过因特网通信的进程之间的套接字通信(假定由该进程使用的下面运输层协议是 TCP 协议)
如图所示,套接字是同一台主机内应用层与运输层之间的接口,该套接字是建立网络应用程序的可编程接口。
因此套接字也称为应用程序与网络之间的应用程序编程接口(API)
应用程序开发者可以控制套接字在应用层端的一切,但是对该套接字的运输层端几乎没有控制权
应用程序开发者对于运输层的控制仅限于:
①选择运输层协议 ②设定几个运输层参数,如最大缓存和最大报文长度等