网络应用程序的两种主流体系结构
1、客户-服务器
例子:Web、FTP、Telnet、电子邮件等。
这种体系结构中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。在Web应用程序的例子中,总是打开的Web服务器服务于来自浏览器(运行在客户主机上)的请求。
这种体系结构,客户相互之间不直接通信。如,在Web应用中两个浏览器并不直接通信。
在客户-服务器应用中,常常会出现一台单独的服务器主机跟不上它所有客户请求的情况。例如,一个流行的社交网络站点如果仅有一台服务器来处理所有请求,很快就会变得不堪重负。为此,配备大量主机的数据中心常被用于创建强大的虚拟服务器。最为流行的因特网服务——如搜索引擎(Google和Bing)、因特网商务(亚马逊和e-Bay)、基于Web的电子邮件(如Gmail何雅虎邮件)、社交网络(Facebook和Twitter)等,就应用了一个或多个数据中心。
2、对等(P2P)
例子:文件共享(BitTorrent)、对等方协助下载加速器(迅雷)、因特网电话(Skype)、IPTV(迅雷看看、PPstream)。
应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方。因为这种对等方通信不必通过专门的服务器,所以被称为对等方到对等方的。目前许多流行的、流量密集型应用都是P2P体系结构。如上面列出的一些例子。
某些应用具有以上两者混合的结构体系。如即时讯息应用,服务器被用于跟踪用户的IP地址,但用户到用户的报文在用户主机之间(无需通过中间服务器)直接发送。
进程通信
进行通信的主体实际上是进程,而不是程序。
- 运行在同一个端系统中的进程间通信,其规则由该端系统上的操作系统确定。
- 运行在不同端系统中(可能这些端系统还是不同的操作系统)的进程间通信,其规则由网络协议确定。
客户和服务器进程
网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。
在给定的一对进行之间的通信会话场景中,发起通信的进程被标识为客户,在会话开始时等待联系的进程是服务器。
套接字(socket)
�进程与套接字关系的类比:进程是一座房子,它的套接字是它的门。
套接字是同一台主机内应用层与运输层之间的接口。由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口(Application Programming Interface,API)
应用程序开发者可以控制套接字在应用层端的一切,但是对该套接字的运输层端几乎没有控制权。应用程序开发者对运输层的控制仅限于
1、 选择运输层协议
2、设定几个运输层参数,如最大缓存和最大报文段长度
进程寻址
在一台主机上运行的进程为了可以向在另一台主机上运行的进程发送分组,接收进程需要有一个地址。为了标识接收进程,需要定义2种信息
1、 目的主机的地址(IP地址)
2、 定义在目的主机中的接收进程的标识符(端口号)
因为一台主机能够运行许多网络应用,我要知道是这台主机的哪个应用程序需要接收信息,端口号就是用来区分应用程序的。类比于送信,收件地址(家庭住址)相当于目的主机的IP地址,收件人相当于端口号(一个家里面往往不止一个人)。
因特网提供的运输层服务
1、 TCP服务
- 面向连接的服务:需要执行“3次握手”建立两个进程的套接字之间的TCP连接。这条连接是全双工的,即连接双方的进程可以在此连接上同时进行报文收发。当应用程序结束报文发送时,必须拆除该连接。
- 可靠的数据传送服务:通信进程能依靠TCP,无差错、按适当顺序交付所有发送的数据,没有字节的丢失和冗余。
- 拥塞控制机制:为因特网带来整体好处。当发送方和接收方之间的网络出现拥塞时,TCP拥塞控制机制会抑制发送进程。该机制也会试图限制每个TCP连接,使它们达到公平共享网络带宽的目的。
2、 UDP服务
- 无连接的服务:进程通信前不需要建立连接
- 不可靠的数据传送服务:当进程将一个报文发送进UDP套接字时,UDP协议不保证该报文将到达接收进程,而且到达接收进程的报文也可能是乱序到达的。
- 没有拥塞控制机制:所以UDP的发送端可以用它选定的任何速率向其下层(网络层)注入数据。(实际端到端吞吐量可能小于这种速率,可能是因为中间链路的带宽受限或因为拥塞而造成。)
不同网络应用对因特网的运输层服务的要求
- 不能丢失的数据要采用可靠数据传输,即要用TCP协议;容忍丢失的可采用UDP协议。
- 带宽是弹性的,表明是弹性应用,它能够根据情况或多或少利用可供使用的吞吐量;非弹性的应用——带宽敏感应用,对吞吐量会有一定要求。
- 时间敏感的应用,要求时延较低。
流行的因特网应用及其应用层协议和支撑的运输层协议
</br>
安全套接字层(Secure Sockets Layer,SSL)
被称为TCP的加强版,能做TCP所能做的一切,还提供了进程到进程的安全性服务,包括加密、数据完整性和端点鉴别。
1、SSL不是与TCP和UDP在相同层次上的第三种因特网运输层协议,而是一种对TCP的加强,这种强化是在应用层上实现的。
2、SSL有自己的套接字API,区别于TCP的套接字API。
</br>
应用层协议
应用层协议定义了运行在不同端系统上的应用程序进程如何相互传递报文。应用层协议定义了:
- 交换的报文类型,如请求报文和响应报文
- 各种报文类型的语法,如报文中的各个字段及这些字段是如何描述的
- 字段的语义,即这些字段中包含的信息的含义
- 一个进程何时以及如何发送报文,对报文进行响应的规则
应用层协议是网络应用的重要组成部分。
Web应用的应用层协议是HTTP
HTTP服务器不保存关于客户的任何信息,所以说HTTP是一个无状态协议。
非持续连接:每个请求/响应对是经一个单独的TCP连接发送。
持续连接:所有请求及其响应经相同的TCP连接发送。
HTTP可以采用非持续连接和持续连接,默认情况下使用持续连接,性能更好。
HTTP使用非持续连接的缺点
- 需要为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户和服务器中都要分配TCP的缓冲区和保持TCP变量,这给Web服务器带来严重负担。
- 每一个对象要经受两倍的RTT(往返时间,Round-Trip Time)交付延迟。
HTTP请求报文的通用格式
- 方法:可填入GET、POST、HEAD、PUT、DELETE等,绝大部分HTTP请求报文使用GET方法
- URL:如www.baidu.com
- 版本:HTTP版本
- 首部字段名:有好几种首部字段名,如Host、Connection、User-agent
- 值:首部字段名对应的值
- sp:空格
- cr:回车(carriage return)
- lf:换行(line feed)
(关于回车和换行的区别,不�太清楚的同学请点击回车与换行的区别) - 实体主体:使用GET方法时,实体主体为空;使用POST方法才会有实体主体。
一个使用GET方法的HTTP请求报文:
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
</br>
HTTP响应报文的通用格式
- 版本:HTTP版本
- 状态码:
200(OK,请求成功,信息在返回的响应报文中)
301(Moved Permanently,请求对象已被永久转移,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL——自动跳转到新URL)
400(Bad Request,一个通用差错代码,指示该请求不能被服务器理解)
404(Not Found,被请求的文档不在服务器上)
505(HTTP Version Not Supported,服务器不支持请求使用的HTTP协议版本) - 短语:提示信息
上一例中,使用GET方法的HTTP请求报文的响应报文:
HTTP/1.1 200 OK
Connection: close
Date: Tue, 09 Aug 2011 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tue, 09 Aug 2011 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ...)
</br>
Cookie
前文说HTTP服务器是无状态的,不保存客户信息。但是有时候一个Web站点希望能够识别用户,可能是出于服务器希望限制用户的访问,或者是出于希望把内容与用户身份联系起来。
为此HTTP可以使用cookie。它允许站点对用户进行跟踪。目前大多数商务Web站点都使用了cookie。
cookie技术的4个组件
- 在HTTP响应报文中的一个cookie首部行。如Set-cookie: 1678
- 在HTTP请求报文中的一个cookie首部行。如Cookie: 1678
- 在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理
- 位于Web站点的一个后端数据库。用于保存cookie。
Web缓存器 = 代理服务器
顾名思义就是服务器的代理了,它同样可以处理客户发送的HTTP请求报文,如果它缓存着请求报文所需对象的副本的话。如果没有,Web缓存器会先向本体Web服务器获取所需对象的副本,再提供服务给客户。
通过“条件GET方法”,保证缓存器的对象是最新的。
采用Web缓存器的好处
- 大大减少对客户请求的响应时间
- 大大减少一个机构的接入链路到因特网的通信量。通过减少通信量,该机构就不必急于增加带宽,从而降低费用
- 能从整体上大大减低因特网上的Web流量,从而改善所有应用的性能
</br>
文件传输协议 FTP
事实上,HTTP和FTP都属于文件传输协议,所以有许多共同特点。如都运行在TCP上。
最显著的区别是FTP使用两个并行的TCP连接来传输文件,一个是控制连接,一个是数据连接。所以也需要两个端口。
1、 控制连接用于在两主机之间传输控制信息。
2、 数据连接用于实际发送一个文件
先建立控制连接,再建立数据连接。
在同一个会话期间,如果用户还需要传输另一个文件,FTP则打开另一个数据连接(TCP连接)。所以对FTP而言,控制连接贯穿了整个用户会话期间,但是对会话中的每一次文件传输都需要建立一个新的数据连接,所以FTP的数据连接是非持续连接。
FTP服务器必须在整个会话期间保留用户的状态,对每个进行中的用户会话的状态信息进行追踪,大大限制了FTP同时维持的会话总数。
</br>
简单邮件协议 SMTP
电子邮件系统的3个主要组成部分
- 用户代理
- 邮件服务器
- STMP
STMP是运用在邮件服务器之间传输的协议。
用户代理负责把用户发送的报文发送给邮件服务器,以及接收邮件服务器发送给用户的报文。
STMP一般不适用中间邮件服务器发送邮件,即使这两个邮件服务器位于地球的两端。如Alice的邮件服务器在中国香港,而Bob的服务器在美国圣路易斯,那么这个TCP连接也是从香港服务器到圣路易斯服务器之间的直接相连。特别是,如果Bob的邮件服务器没有开机,该报文会保留在Alice的邮件服务器上并等待进行新的尝试,这意味着邮件并不在中间的某个邮件服务器存留。
SMTP与HTTP的对比
1、两者都用于从一台主机向另一台主机传送文件,都使用持续连接。HTTP从Web服务器向Web客户传送文件;SMTP从一个邮件服务器向另一个邮件服务器传送文件。
2、HTTP是一个拉协议(pull protocol)。即在方便时,用户使用HTTP从服务器拉取信息;SMTP是一个推协议(push protocol),发送邮件服务器把文件推向接收邮件服务器。
3、SMTP要求每个报文(包括它们的体)使用7比特ASCII码格式。如果报文包含非7比特ASCII字符(如有重音的法文字符)或二进制数据(如图形文件),则报文必须按照7特比ASCII码进行编码。HTTP数据不受这种限制。
4、处理一个既包含文本又包含图形的文档的方式不同。SMTP把所有报文对象放在一个报文中;HTTP把每个对象封装到它自己的HTTP响应报文中。
</br>
DNS协议
因特网上的主机的标识有2种方式
1、 主机名,如www.baidu.com
2、 IP地址,如xxx.xxx.xxx.xxx
这两种标识其实指代的是同一样东西,就如你父亲叫你全名和叫你儿子是一样的一个道理。那为什么需要2种标识呢?
因为我们人类喜欢主机名这种便于记忆的标识,而对路由器来说,它更喜欢定长的、有层次结构的IP地址。我们在浏览器的地址上输入网址时都是输入其主机号。
所以我们需要一种能进行主机名到IP地址转换的服务,也就是域名系统(Domain Name System,DNS)。DNS协议运行在UDP上,使用53号端口。
DNS也是应用层协议,它通常会被其他应用层协议所使用,包括HTTP、SMTP和FTP。
DNS除了将主机名转换为IP地址,还有以下服务
1、识别主机别名(用于HTTP、FTP)
2、识别邮件服务器别名(用于SMTP)
3、负载分配
DNS服务器采用分布式、层次数据库
DNS缓存
与Web缓存器一样,DNS服务器同样有缓存器。
P2P体系结构
相比于客户-服务器体系结构,P2P具有自扩展性,表现在对等方N越大,最小分发时间也趋于平缓。这种自扩展性的直接成因是:对等方除了是比特的消费者外还是它们的重新分发者。