START:
本章主要内容
- 定义关键的应用层概念:
- 应用程序所需要的网络服务。
- 客户和服务器。
- 进程。
- 运输层接口。
- 详细考察几种网络应用程序:
Web
- 电子邮件
- DNS
- 对等文件分发
- 视频流
- 开发运行在 TCP 和 UDP 上的网络应用程序。
- 特别是要学习套接字接口(socket)。
2.1 应用层协议原理
研发网络应用程序的核心是写出能够运行在不同端系统和通过网络彼此通信的程序。
有两种模式:
- 在
Web
应用程序中,有两个互相通信的不同程序:一个是运行在用户主机上的浏览器程序;另一个是运行在Web
服务器主机上的Web
服务器程序。 - P2P 文件共享系统。
- 在
在研发新应用程序的时候,你需要编写将在多台端系统上运行的软件。重要的是,你不需要、也不能写在网络核心设备(如路由器)或链路层交换机上运行的程序。因为网络核心设备并不在应用层上起作用,而只在较低层起作用,特别是在网络层及下面层次起作用。这种将应用软件限制在端系统的基本设计方法,促进了大量的网络应用程序的研发和部署。
我的理解是:在研发新应用程序时,只有应用层是对软件开发人员是可见的,其它层次是一种黑箱;或者说只需要考虑端到端之间的事情。而这种设计对于开发人员是种好事,因为不需要再去考虑应用层以下的事情了,将会大大降低代码的编写量。
2.1.1 网络应用程序体系结构
首先需要记住:应用程序的体系结构于网络的体系结构是明显不同的。
网络的体系结构是由:应用层、运输层、网络层、数据链路层、物理层构成的。
应用程序的体系结构(application architecture)有应用程序研发者设计,规定了如何再各种端系统上组织该程序。一般选择两种主流的体系:
客户 - 服务器体系结构。(client - server architecture)。
对等体系结构(P2P architecture)。
客户 - 服务器体系结构
有一个总是打开的主机称为服务器(server),它服务于来自于其他成为
客户
的主机的请求。Web
应用程序:其中,总是打开的Web
服务器服务来自浏览器(运行在客户主机上)的请求,它向该客户发送所请求的对象作为相应。
利用客户 - 服务器体系结构,客户之间不直接通信
该服务器具有固定的、周知的地址,该地址称为
IP 地址
。因为该服务器具有固定、周知的地址,并且该服务器一直打开,所以客户总是能够通过向该服务器的
IP地址
发送分组来与其联系。使用该结构的应用程序包括:
Web
ftp
Telnet
E-mail
在一个客户 - 服务器应用中,常常会出现一台单独的服务器主机跟不上它所有客户请求的情况,为此配备大量主机的数据中心(data center)常被用于创建强大的虚拟服务器。如:
- 搜索引擎。
- 因特网商务服务。
- 基于
Web
的电子邮件。 - 社交网络。
P2P 体系结构
对位于数据中心的专用服务器有最小的依赖,有的甚至没有依赖。
应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为
对等方
。- 这些对等方并不为
ISP
所有,相反却为用户控制的主机所有。 - 大多数对等方存在于:
- 家庭
- 大学
- 办公室
- 因为这些对等方通信不必通过专门的服务器体系结构,该体系结构被称为
对等方到对等方
。
- 这些对等方并不为
许多目前流行的、流量密集型的应用都是
P2P
体系结构的,包括:- 文件共享。
- 对等方协助下载加速器(如迅雷)。
- 因特网电话和视频会议(如
Skype
)。
P2P
体系结构最引人入胜的特性之一就是它们的自扩展性(self - scalability)。- 在一个
P2P
文件共享应用中,尽管每个对等方都由于请求文件产生工作负载,但每个对等放通过向其他对等方分发文件也为系统增加服务能力。
- 在一个
P2P
体系结构也是有成本效率的,因为它们通常不需要庞大的服务器基础设施和服务器带宽。- 这与具有数据中心的客户 - 服务器设计形成了鲜明的对比。
吐槽:迅雷算是
P2P
中的奇葩了,作为一个P2P
下载器,其拥有着大量的数据中心来供用户离线下载。而这些数据中心下载占用了整个体系结构的大量带宽;但是又不提供给非迅雷用户甚至不提供给迅雷的普通用户下载,导致不少BT下载站明确的提示不支持迅雷下载。未来的
P2P
应用由于高度非集中式结构,面临着安全性、性能、可靠性的挑战。
混合结构
某些应用具有混合的体系结构,服务器被用于跟踪用户的IP地址
,但用户到用户之间的报文在用户主机之间直接发送。
2.1.2 进程通信
在构建网络应用程序前,我们需要对运行在多个端系统的程序是如何互相通信的情况有个基本了解。
- 进行通信的实际上是进程(process)。
- 一个进程可以被认为是运行在端系统中的一个程序。
- 在同一个端系统的进程间通信机制
- 当多个进程运行在相同的端系统上时,它们使用进程间通信机制相互通信。
- 进程间通信规则由端系统上的操作系统确定。
在本书中并不特别关注同一台主机上的进程间的通信,而关注运行在不同端系统(可能具有不同的操作系统)上的进程间的通信。
- 在不同端系统进程间通信机制
- 通过跨越计算机网络交换报文(massage)而相互通信。
- 发送进程生成并向网络中发送报文。
- 接收进程接收这些报文并可能通过回送报文进行响应。
1. 客户和服务器进程
网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。
例如:
- 在
Web
应用程序中,一个客户浏览器进程与一台Web
服务器进程交换报文。 - 在一个
P2P
文件共享系统中,文件从一个对等方传输到另一个对等方。
- 在
对每对通信进程,通常将这两者,一者定义为客户(client),一者定义为服务器(server)。
发起通信的进程被标记为客户。
在会话开始后,等待联系的进程是服务器。
以女神和舔狗举例:舔狗问女神:”在吗?“,女神回复:”我去洗澡。”
在这之中,舔狗是客户,而女神是服务器。(大雾)
例如:
- 在
Web
中,浏览器是一个客户进程,Web
服务器是一个服务器进程。 - 在
P2P
中,下载文件的对等方标识为客户,上传文件的对等方标识为服务器。- 在这其中,我们可以发现,一个进程能够既是客户,又能是服务器。
- 在
在不致混淆的情况下,我们有时也使用术语:”应用程序的客户端和服务器端“。
2. 进程与计算机网络之间的接口
进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接收报文。
明明就是一个插座desi。
套接字是同一台主机内应用层与运输层的接口。
- 由于该套接字是建立在网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口(Application Programming Interface,API)。
- 应用程序开发者可以控制套接字在应用层的一切,但是对该套接字的运输层端近乎没有控制权。
- 应用程序开发者对与运输层几乎没有控制权。
- 能够设置的仅有:
- 选择运输层协议。
- 也许能设置几个运输层参数。
- 能够设置的仅有:
3. 进程寻址
在一台主机上运行的进程为了向另一台主机上运行的进程发送分组,接收进程需要有一个地址。
该地址由两部分组成:
- 主机的地址。
- 在目的主机中指定接收进程的标识符。
第一部分即IP地址
。此时,我们只需要知道,IP地址
是一个 32 比特的量,且能够唯一地标识该主机。
为知道发送进程在接收主机上的接收进程(即接收套接字),第二部分即为端口号。
- 已经为流行的应用分配了特定的端口号,如:
- 80 为
Web
服务器的标识。 - 25 为使用
SMTP
协议的邮箱服务器进程的标识。 - 相关周知的端口号都能够在端口号查询 找到。
- 80 为