目录
前言:网络应用是计算机网络存在的理由,这些应用在应用层为用户提供服务,满足我们日常需求的网络程序, 都是在应用层
1. 网络应用体系结构
应用层的体系结构和之前讨论过的网络的体系结构有所不同,网络的体系结构是固定的,而应用程序体系结构(application architecture)由应用程序开发者设计,规定了如何在各种端系统上组织该应用程序
目前主流的应用程序体系结构有三种:
- 客户-服务器体系结构(client-server, C/S)
- 点对点结构(Peer-to-peer, P2P)
- 混合结构(Hybrid)
1.1 客户机/服务器结构
- 客户机:向服务器请求服务的主机
- 服务器:一个总是打开的主机,服务其他称为客户 的主机的请求
客户-服务器模型的著名应用程序包括Web、FTP、Telnet和电子邮件,一个典型的例子是Web应用程序,其中总是打开的Web服务器服务于来自浏览器(运行在客户主机上)的请求
服务器的特点有:
- 7*24小时提供服务
- 永久性访问地址/域名
- 利用大量服务器实现可扩展性
客户机的特点有:
- 与服务器通信,使用服务器提供的服务
- 间歇性接入网络
- 可能使用动态IP地址
- 不会与其他客户机直接通信
通常而言,如果服务器的请求量过大,一台单独的服务器会不堪重负。为此,配备大量主机的数据中心 (data center) 常被用于创建强大的虚拟服务器。例如谷歌有分布于全世界的30~50个数据中心,而每个数据中心能够有数十万台服务器
1.2 P2P结构
P2P结构中,对于服务器的依赖减少,取而代之的是应用程序可以在主机之间直接通信,这些主机被称为对等方
许多目前流行的、流量密集型应用都是P2P体系结构的,包括文件共享(如BitTorrent)、对等方协助下载加速器(如迅雷)、因特网电话和视频会议(如Skype)
P2P的特点有:
- 没有永远在线的服务器
- 任意端系统/节点之间可以直接通讯
- 节点间歇性接入网络
- 节点可能改变IP地址
P2P体系结构的优点,也是最引人入胜的特性之一是它的自扩展性,在一个P2P文件共享应用中,尽管每个对等方都由于请求文件产生工作负载,但每个对等方通过向其他对等方分发文件也为系统增加服务能力
P2P体系结构的缺点是它难于管理
1.3 混合结构
综合C/S结构和P2P结构的特点,在充分利用各自的优点且规避缺点的基础上诞生了混合结构
典型的例子是Napster,它是一款可以在网络中下载自己想要的MP3文件的软件。它同时能够让自己的机器也成为一台服务器,为其它用户提供下载
Napster的特点是:
- 文件传输使用P2P结构
- 文件搜索采用C/S结构——集中式(每个节点向*服务器登记自己的内容,每个节点向*服务器提交查询请求,查找感兴趣的内容)
2. 进程通信
2.1 标识进程通信
用操作系统的术语来说,应用程序之间的通信实际上是进程之间的通信,进程也就是主机上运行的程序
同一主机上运行的进程之间可以通过进程间通信机制和操作系统来实现进程通信
不同主机上运行的进程间主要通过消息交换来实现进程通信
在一个客户-服务器结构中
客户机进程: 发起通信的进程
服务器进程: 等待通信请求的进程
在一个P2P文件共享结构中
下载文件的对等方标识为客户
上传文件的对等方标识为服务器
2.2 套接字(socket)
多数应用程序是由通信进程对组成,每队中的两个进程互相发送报文。进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接受报文
进程间通信利用socket发送/接收消息实现,这一过程类似于寄信
- 发送方将消息送到门外邮箱 (这里的门就相当于套接字)
- 发送方依赖(门外的)传输基础设施将消息传到接收方所在主机,并送到接收方的门外
- 接收方从门外获取消息
为了实现不同主机上的进程间通信,每个进程必须拥有标识符,每台主机有一个唯一的IP地址,但这不足以唯一确定一个进程(一台主机上可以有多个进程需要通信),我们为主机上每个需要通信的进程分配一个端口号,采用IP地址+端口号来标识一个进程
IP地址:主机的标识,一个IP地址可唯一标识一台主机
端口号:主机上进程的标识,一个端口号可唯一标识主机上的一个进程,典型的如:
HTTP Server:80
Mail Server:25
3. 网络应用的服务需求
计算机网络是分层结构,下层为上层提供服务,而这种服务通过接口来实现
在我们采用的五层参考模型中,应用层的下层是传输层,套接字是应用程序和传输层协议之间的接口,因此在设计应用程序时,往往会根据应用程序的要求来选择相应的传输层协议
从四个方面对应用程序的服务要求进行分类:可靠数据传输、吞吐量、定时和安全性
3.1 可靠数据传输
之前已经讨论过,分组在计算机网络中可能丢失——路由器缓存溢出、分组比特损坏后被丢弃。而某些应用程序对于数据丢失是不可容忍的,例如电子邮件、文件传输、远程主机访问、Web文档传输以及金融应用等
为了支持这些应用,必须做一些工作以确保由应用程序的一端发送的数据正确、完全地交付给应用程序的另一端
如果一个协议提供了确保数据交付的服务,就认为提供了可靠传输机制
当一个传输层协议提供可靠数据传输时,发送进程只要将其数据传递进套接字,就可以完全相信该数据能无差错地到达接收进程
有一些应用对数据的丢失并不敏感,这类应用称为容忍丢失的应用(loss-tolerant applications),最常见的是多媒体应用,如交谈式音频/视频,它们能够承受一定量的数据丢失
3.2 吞吐量
可用吞吐量是指发送进程能够向接收进程交付比特的速率
两个进程之间的通信往往依赖于某条网络路径,而这条路径的带宽会被别的会话所共享,随着会话的到达和离开,可用吞吐量会产生波动
对于一些应用程序而言,传输层协议必须保证能够以某种特定的速率提供确保的可用吞吐量
例如因特网电话应用程序对语音以32kbps的速率进行编码,那么它需要以这个速率向网络发送数据,并以该速率向接收应用程序交付数据,如果协议不能提供这种吞吐量,这个应用程序就必须以较低速率进行编码或放弃发送,这种具有吞吐量要求的应用程序被称为带宽敏感的应用(bandwidth-sensitive applications)
像电子邮件、文件传输以及Web传送这种能够根据可用带宽或多或少地利用可供使用吞吐量的应用称为弹性应用(elastic applications)
3.3 定时
传输层协议也能提供定时保证,例如:发送方注入进套接字中的每个比特到达接收方的套接字不迟于100ms
这种服务将对交互式实时应用程序有吸引力,如因特网电话、虚拟环境、电话会议和多方游戏,所有这些服务为了有效性而要求数据交付有严格的时间限制
打电话和多人游戏时,这种服务能保证时延在一定范围内,满足通话或游戏实时性
3.4 安全性
传输层协议也能为应用程序提供一种或多种安全性服务。这种服务能够在发送和接收进程之间提供机密性,以防止该数据以某种方式在这两个进程之间被观察到
例如:在发送主机中,传输层协议能够加密由发送进程传输的所有数据,在接收主机中,传输层协议能够在数据交付给接收进程之前解密这些数据
3.5 常见网络应用的要求
应用 | 数据丢失 | 带宽 | 时间敏感 |
文件传输 | 不能丢失 | 弹性 | 不 |
电子邮件 | 不能丢失 | 弹性 | 不 |
Web文档 | 不能丢失 | 弹性(几kbps) | 不 |
因特网电话/视频会议 | 容忍丢失 | 音频(几kbps~1Mbps) 视频(10kbps~5Mbps) |
是,100ms |
流式存储音频/视频 | 容忍丢失 | 同上 | 是,几秒 |
交互式游戏 | 容忍丢失 | 几kbps~10kbps | 是,100ms |
智能手机讯息 | 不能丢失 | 弹性 | 是和不是 |
4. 因特网提供的传输服务
因特网(更一般的是TCP/IP网络)为应用程序提供两个传输层协议——TCP和UDP,作为一个软件开发者,为因特网创建一个新的应用时,首先要做出的决定是,选择UDP还是TCP
4.1 TCP服务
TCP服务模型包括面向连接服务和可靠数据传输服务
面向连接
- 在应用层数据报文开始流动之前,TCP让客户和服务器互相交换传输层控制信息,这就是所谓的"握手"
- “握手”之后,一个TCP连接就在两个进程的套接字之间建立了,这条连接是全双工的
- 应用程序结束报文发送,必须拆除该连接
可靠数据传输
- 通信进程能够依靠TCP,无差错、按适当顺序交付所发送的数据
- TCP的数据交付是基于字节流的
另外,无论是TCP还是UDP都没有提供任何的加密机制,为了保证安全性,因特网界已经研制了TCP的加强版——安全套接字层( Secure Sockets Layer, SSL ),提供了进程到进程间的安全性服务,包括加密、数据完整性和端点鉴别
4.2 UDP服务
UDP是无连接的,它提供不可靠数据传输服务,是一种尽最大努力向上层交付数据的协议(言外之意是不能确保数据交付的准确性)
当一个进程将一个报文发送进UDP套接字时,UDP协议并不保证该报文将到达接收进程。不仅如此,到达接受进程的报文也可能是乱序到达的
我们将在传输层详细介绍TCP和UDP的相关知识
5. 应用层协议
现在我们知道了应用是如何将报文发送进套接字并实现网络进程通信的,接下来要面临的问题是如何规定应用层协议
网络应用需遵循应用层协议,它定义了运行在不同端系统上的应用进程如何让相互传递报文。有些应用层协议是公开的,这些协议
- 由RFC(Request For Comments)定义
- 允许互操作
- HTTP, SMTP, ……
有一些应用层协议是私有的,
- 多数P2P文件共享应用
应用层协议的内容主要有
- 消息的类型(type) —— 请求消息、响应消息
- 消息的语法(syntax)/格式 —— 消息中有哪些字段、每个字段如何描述
- 字段的语义(semantics) —— 字段中信息的含义
- 规则(rules) —— 进程何时发送/响应消息、进程如何发送/响应消息