一、网络应用程序体系结构
a.客户—服务器体系结构
具有固定IP地址的服务器总是开启以服务许多相互之间不直接通信的客户。大型站点需要配备大量数据中心以满足大量请求
b.对等(P2P)体系结构
在该体系中,对位于数据中心的专用服务器有最小的(或者没有)依赖。对等方可以直接通信。
自扩展性:每个对等方都可以和其他对等方相互请求和分发文件,增加系统的服务能力。
二、进程通信
在两个不同端系统上的进程,通过跨越计算机网络交换报文而相互通信。
a.客户和服务器进程
网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。在给定的一对进程之间的通信会话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户,在会话开始时等待联系的进程时服务器。
b.进程与计算机网络之间的接口
进程通过一个称为套接字的软件接口向网络发送报文和从网络接收报文。套接字是同一台主机内应用层与运输层之间的接口
c.进程寻址
接收进程需要有一个地址才可以接收分组。为了标识接收进程,需要定义两种信息:
(1)主机的地址—IP地址
(2)定义在目的主机中的接收进程的标识符—端口号
三、可供应用程序使用的运输服务
通过研究可用的运输层协议所提供的服务,选择满足应用需求的协议
常见网络应用服务要求
a.可靠数据传输
数据能无差错地到达接收进程。满足电子邮件、文件传输等应用。
b.吞吐量
以某种特定的速率提供确保的可用吞吐量。满足带宽敏感应用。
c.定时定时保证
满足为了有效性而要求数据交付有严格的时间限制的应用。
d.安全性
在发送和接收进程之间提供机密性,数据完整性和端点鉴别。
四、因特网提供的运输服务
a.TCP服务
TCP服务包括面向连接的服务和可靠数据传输服务
面向连接的服务
在应用层数据报文开始流动之前,TCP让客户和服务器互相交换运输层控制信息即握手过程。报文发送结束后会拆除连接。
可靠数据传输服务
通信进程能够依靠TCP,无差错、按适当顺序交付所有发送的数据。
拥塞控制机制
网络拥塞时抑制发送进程,缓解网络的压力
b.UDP服务
轻量级运输协议,仅提供最小服务。无连接、不可靠数据传送、无拥塞控制。
五、应用层协议
定义运行在不同端系统上的应用程序进程如何相互传递报文。公共的应用层协议由RFC文档定义,也有专用的应用层协议。
其定义了:
1.交换的报文类型,例如请求报文和响应报文
2.各种报文类型的语法,例如报文中的各个字段及这些字段是如何描述的
3.字段的语义,即这些字段中包含的信息的含义
4.一个进程何时以及如何发送报文,对报文进行响应的规则
1、HTTP
HTTP是HyperText Transfer Protocol即超文本传输协议的缩写,是Web应用层协议之一。
HTTP协议由两部分程序实现:一个客户机程序和一个服务器程序,它们运行在不同的端系统中,通过交换HTTP报文运行会话。HTTP定义了Web客户机是如何向Web服务器请求Web页面,以及服务器如何将Web页面传送给客户机的。
HTTP使用TCP作为它的支撑运输协议。HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器(客户机)和服务器进程就可以通过套接字接口访问TCP。使用TCP作为其支撑的HTTP协议不用担心数据丢失,也不用担心TCP是如何从网络的数据丢失和乱序故障中恢复的,因为那是TCP以及协议栈底层协议的工作。
HTTP是一个无状态协议,所以服务器向客户机发送被请求的文件时,并不存储任何关于该客户机的状态信息。举个例子来说,就是假如某个特定的客户机在短短几秒内两次请求同一个对象,服务器并不会因为刚刚为该用户提供了该对象而不做出反应,而是重新发送该对象,就好像服务器已经完全忘记了之前所做的事一样。
最后补充一下,我们平时上网请求的Web页面是由对象组成的。对象,简单点来说就是文件,如HTML文件、jpg图片、视频等文件,这些文件可通过一个URL地址寻址。当我们请求一个页面时,我们通常会得到一个HTML文件和几个引用对象,然后再根据HTML文件中对象的URL地址来加载对象。
非持久连接和持久连接
当客户机/服务器的交互运行于TCP协议上时,应用程序的每个请求/响应对是经一个单独的TCP连接,则该应用程序使用非持久连接,而当应用程序的每个请求/响应对是经相同的TCP连接发送,则该应用程序使用持久连接。
非持久连接
在非持久连接的情况下,服务器在发送响应后,关闭TCP连接。我们定义往返时间RTT为一个小分组从客户机到服务器再回到客户所花费的时间。所以RTT包括分组传播时延、排列时延以及分组处理时延。
在非持久连接的情况下,访问一个网页(假设该网页中还有引用了其他静态资源,如css,js,img等等)会经过下面几个步骤:
【1】 HTTP客户机进程发起一个到服务器的TCP连接。客户机和服务器上分别有一个socket与该连接相关联。
【2】 HTTP客户机经它的套接字向服务器发送一个HTTP请求报文。
【3】 HTTP服务器进程经它的套接字接受该请求报文,从其存储器中检索出请求对象,在一个HTTP相应报文中封装对象,并通过其套接字向客户机发送响应报文。
【4】 HTTP服务器进程通知TCP断开该TCP连接(直到TCP确认客户机已经完整地接受到响应报文为止,它才会真正中断连接)。
【5】 HTTP客户机接受响应报文,TCP连接关闭。
【6】 对其他资源都重复前面几个步骤
HTTP协议基于TCP协议作为运输层,使用HTTP与服务器之间建立一个连接,则要发起一个到服务器的TCP连接,而TCP建立连接涉及一个“三次握手”的过程。完成了三次握手的前两部分后,客户机将三次握手的第三部分(确认)与一个HTTP请求报文结合起来发送到该TCP连接。一旦请求报文到达服务器,服务器向该TCP连接发送HTML文件。从上面的描述,可以知道,对于一个非持久连接,请求一个HTTP请求/响应需要的总时间为两个RTT+服务器传输HTML文件的时间。
持久连接
在持久连接的情况下,服务器在发送响应后,保持该TCP连接打开。在相同的客户机与服务器之间的后续请求和响应报文通过相同的连接进行传送。特别是一个完整的Web页面(包括多个对象)可以使用单个持久TCP连接进行传送。如果一个连接经过一定时间间隔仍未被使用,HTTP服务器就关闭该连接。
位于同一台服务器的多个Web页面在从该服务器发送给同一个客户机时,可以在单个持久TCP连接上进行,这样对象请求可一个接一个地发出,而不必等待未决请求的回答,这种方式叫做流水线式的持久连接,它是HTTP默认使用的持久连接。
非持久连接的缺点
首先,非持久连接必须为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户机和服务器都要分配TCP的缓冲区和变量,从而给服务器带来了严重的负担。其次,每一个对象的传输时延为两个RTT,即一个RTT用于建立TCP,另一个RTT用于请求和接收一个对象。
2、HTTP报文格式
HTTP的请求报文格式,如下图所示:
第一行是请求行,请求行有3个字段,方法字段、URL字段和HTTP版本字段。方法字段可以取值GET、POST、HEAD、PUT和DELETE等,绝大多数请求使用GET方法。
其后继行叫做首部行。
当使用GET方法时,实体主体通常为空,而当使用POST方法时,实体主体通常为需要POST给服务器的内容,例如,我们在网页上输入的数据。
下面,给出一个真正的HTTP请求报文,如下:
GET /xxx/page.html HTTP/1.1
Host: www.xxx.com
Connection: close
User-agent:Mozilla/4.0
Accept-language: fr
跟上图对应,这个报文第一行表示请求行,浏览器向服务器请求一个对象,使用了GET方法,它的地址在URL字段中,为/xxx/page.html,所使用的HTTP版本为1.1。其余的行为首部行,冒号前的是首部字段名,后面是字段的值。
Host: www.xxx.com 定义了目标所在的主机,首部行提供的信息是Web代理高速缓存所要求的。
Connection: close 它告诉服务器不希望使用持久连接,它要求服务器在发送完被请求的对象后就关闭连接。
User-agent:Mozilla/4.0 用来定义用户代理,即向服务器发送请求的浏览器类型,这里为Netscape浏览器。
Accept-language: fr 表示用户想得到该对象的法语版本。
HTTP响应报文格式如下图所示:
我们可以看到它同样由三部分组成,第一行为状态行,其后的为首部行,最后的为要发送的实体主体。实体主体部分是报文的主体,即它包含了所请求的对象本身。
下面来看看一个真实的HTTP响应报文,如下:
首先看一看第一行,它对应上图中的状态行,在该报文中,状态行指示服务器使用的协议是HTTP/1.1,状态码为200,短语为OK,表示一切正常,信息包含在返回的响应报文中。
HTTP/1.1 200 OK
Connection: close
Data: Thu, 03, Jul, 2013 00:00:00 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Sun, 6, May 2007 09:23:24 GMT
Content-Type: text/html
(data ... data ...)
第2到5行为首部行,
Connection: close 告诉客户机在报文发送完后关闭该TCP连接。
Data 首部行指示服务器产生并发送该响应报文的日期和时间,它是服务器从它的文件系统中检索到该对象,插入到响应报文的时间。
Server 首部行表明该报文是由一个Apache Web服务器产生的,它类似于请求报文中的User-agent首部行。
Last-Modified 首部行指示了该对象创建或者最后修改的时间和日期。
Content-Type 首部行指示了实体主体中的对象的文件类型,对象类型应该正式地使用该首部行而不是用文件扩展名来指示,因为在某些系统(如Linux),文件的类型并不是用扩展名为区分的。
Content-Length 首部行表明了被发送对象的字节数。
自顶向下---应用层