一、应用层协议原理

    1.网络应用程序体系结构

    应用程序的体系结构明显不同于网络的体系结构。从应用程序研发者的角度看,网络体系结构是固定的,并为应用程序提供了特定的服务集合。

    应用程序体系结构(application architecture)由应用程序研发者设计,规定了如何在各种端系统上组织该应用程序。

    现代网络应用程序的两种主流体系结构:客户机/服务器体系结构和对等(P2P)体系结构。

    客户机/服务器体系结构(client-sever architecture):有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户机的主机请求。客户机主机既可以有时打开,也可能总是打开。一个典型的例子是Web应用程序,其中总是打开的Web服务器服务于运行在客户机主机上的浏览器的请求。当Web服务器接收到来自某客户机对某对象的请求时,它向该客户机发送所请求的对象作为响应。注意到客户机/服务器体系结构中,客户机相互之间不能直接通信,例如,在Web应用中两个浏览器不能直接通信。客户机/服务器体系结构的另一个特征是服务器具有固定的、周知的地址,称为IP地址。因为服务器具有固定的、周知的地址,并且总是处于打开状态,所以客户机总是能够通过向该服务器的地址发送分组来与其联系。某些具有客户机/服务器体系结构的更为著名的应用程序包括Web、FTP、Telnet和电子邮件。

    在P2P体系结构(P2P architecture)中,对总是打开的基础设施服务器有最小的依赖。任意间断连接的主机对称为对等方,直接相互通信。对等方并不为服务提供商所有,而是为用户控制的桌面机和膝上机所有,大多数对等方驻留在家庭、大学和办公室。因为这种对等方通信不必通过专门的服务器所以体系结构被称为对等方到对等方(简称为对等)。目前,大多数流行的流量密集型应用程序都是P2P体系结构的,包括文件分发、文件搜索/共享、因特网电话和IPTV(PPLive).某些应用具有混合的体系结构,由客户机/服务器和P2P元素结合而成。例如,对于许多即时通讯而言,服务器场用于跟踪用户的IP地址,但用户到用户的报文在用户主机之间直接发送(无需通过中间服务器)。P2P体系结构的最突出特性之一是它的自扩展性(self-scalability)。例如,在一个P2P文件共享应用中,尽管每个对等方都由请求文件产生负载,但每个对等方向其他对等方分发文件也为系统增加了服务能力。P2P体系结构也是成本有效的,因为它们通常不需要庞大的服务器基础设施和服务器带宽。为了降低成本,服务提供商(MSN、Yahoo等)对于P2P体系结构用于系统的兴趣越来越大。另一方面,由于P2P应用程序具有高度分布和开放的性质,因此要格外关注系统的安全。

    2.进程通信

    2.1 客户机和服务器进程

    网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。例如,在Web应用程序中,一个客户机浏览器进程与一台Web服务器进程交换报文。在一个P2P文件共享系统中,文件从一个对等方中的进程传输到另一个对等方中的进程。对每对进程通信,通常将这两个进程之一表示为客户机(client),而另一个进程表示为服务器(server)。在Web中,浏览器是一个客户机进程,Web服务器是一个服务器进程。对于P2P文件共享,下载文件的对等方被标示为客户机,上载文件的对等方的对等方称为服务器。

    在给定的一对进程之间的通信会话中,发起通信的进程被标示为客户机,在会话开始时等待联系的进程是服务器

    2.2  进程与计算机网络之间的接口

    多数应用程序由通信进程对组成,每对中的两个进程互相发送报文。从一个进程向另一个进程发送的报文必须通过下面的网络。进程通过一个称为套接字(socket)的软件接口在网络上发送和接收报文。

    进程类比于一座房子,而它的套接字可以类比于它的门。当一个进程想向位于另外一台主机上的另一个进程发送报文时,它把报文推出门(socket)。该发送进程假定门到另一侧之间有运输的基础设施,该设施将把报文传送到目的进程的门口。一旦报文抵达目的主机,它通过报文接收进程的门(socket)传递,然后接收进程对报文进行相应的处理。

    由于套接字是在网络上建立网络应用程序的可编程接口,因此也将套接字称为应用程序和网络之间的应用程序编程接口(Application Programming Interface,API)。应用程序开发者可以控制套接字在应用层端的所有东西,但是对该套接字的运输层端几乎没有控制。

    应用程序开发者对运输层的控制仅限于:选择运输层协议 也许能设定及格运输层参数,如最大缓存、最大报文长度等。一旦应用程序开发者选择了一个运输层协议(若可供选择),则应用程序就建立在由该协议提供的运输层服务之上。

    2.3  可供应用程序使用的运输服务

    套接字是应用程序进程和运输层协议之间的接口。发送端的应用程序通过套接字发送报文。在套接字的另一侧,运输层协议负责将该报文传输到接收套接字的“门”中。

    可从四个方面对应用程序服务要求进行分类:可靠数据传输、吞吐量、定时和安全性。

    可靠数据传输(reliable data transfer):分组能在计算机网络中丢失。例如,分组能够使路由器中的缓存溢出,或者当分组中的某些比特损坏后可能被丢弃。像电子邮件、文件传输、远程主机访问、Web文档传输以及金融应用等应用,数据丢失可能会造成灾难性的后果。因此,对于这些应用,必须确保由应用程序的一端发送的数据正确地、完全地交付给该应用程序的另一端。如果一个协议提供了这样的确保数据交付服务,就提供了可靠数据传输(reliable data transfer)。运输层协议能够潜在地向应用程序提供的一个重要服务是进程到进程的可靠数据传输。当一个运输层协议提供这种服务时,发送进程只要将其数据传递到套接字,就可以相信该数据将能无差错地到达接收进程。

    吞吐量:两个进程在一条网络路径上进行通信会话时,可用吞吐量就是发送进程能够向接收进程交付比特的速率。因为其他会话将共享沿着该网络路径上的带宽,并且这些其他会话将会到达和离开,所以可用吞吐量将随时间波动。自然就有了另一种服务,即运输层协议能够以某种特定的速率提供确保的可用吞吐量。具有吞吐量要求的应用程序称为带宽敏感的应用(bandwidth-sensitive application)。

    定时:运输层协议可以提供定时保证。例如,在多方游戏和虚拟互动环境中,在做出动作及看到来自环境的响应之间,较长的时延会时游戏失去真实感。在非实时的应用中,较低的时延总要比较高的时延好,但对端到端的时延没有严格的约束。

    安全性:运输层协议能够为应用程序提供一种或多种安全性服务。例如,在发送主机中,运输层协议能够加密由发送进程传输的所有数据;在接收主机中,运输层协议能够在将数据交付给接收进程之前解密这些数据。这种服务将对发送进程和接收进程保密,以防发送进程和接收进程以某种方式观察到数据。运输层协议也提供除了机密性以外的其他安全性服务,包括数据完整性和端点鉴别。

    2.4  因特网提供的运输服务

    TCP服务:包括面向连接服务和可靠数据传输服务。

    面向连接服务:使用TCP协议时,在应用层数据报文开始流动之前,其客户机程序和服务器程序之间相互交换运输层控制信息。这个所谓的握手过程提示客户机和服务器做好传输分组的准备。在握手阶段后,就在两个进程的套接字之间建立了一个TCP连接(TCP connection)。这个连接是全双工的,即连接双方的进程可以在此连接上同时进行报文收发。当应用程序结束报文发送时,必须拆除该连接。之所以称之为“面向连接”的服务,而不是“连接”服务,是因为两个进程之间是以一种非常松散的方式进行连接的。

    可靠数据传输服务:进行通信的进程依靠TCP协议,无差错、按适当顺序交付发送的数据。当应用程序的一端通过套接字传送一个字节流时,它能够依靠TCP协议将相同的字节流交付给接收方的套接字,而没有字节的丢失和冗余。

    TCP协议还具有拥塞控制机制,这种服务不一定能为通信进程带来直接好处,但能为因特网带来整体好处。当发送方和接收方之间的网络出现拥塞时,TCP协议的拥塞控制机制会抑制发送进程(客户机或服务器)。TCP协议的拥塞控制试图限制每个TCP连接,使它们达到公平共享网络带宽的目的。对有最低要求带宽限制的实时音频/视频应用而言,抑制传输速率具有非常有害的影响。况且,实时应用是可以容忍数据丢失的,并不需要完全可靠的传输服务。出于这些原因,实时应用的开发者们通常将他们的应用放在UDP协议而不是TCP协议之上。

    UDP服务:UDP是一种不提供不必要服务的轻量级运输层协议,它仅提供最小服务。UDP是无连接的,因此在两个进程通信前没有握手过程。UDP协议提供的是不可靠数据传输服务,也就是说,当进程通过UDP套接字发送报文时,UDP协议并不保证该报文能够被接收进程接收到。不仅如此,接收进程收到的报文也可能是乱序到达的。

    UDP没有拥塞控制机制,所以发送端可以以任何速率向其下面的层(网络层)注入数据。

    因特网运输层协议所不提供的服务:可靠数据传输、吞吐量、定时和安全性是四种可能的运输层协议服务。TCP提供了可靠的端到端数据传输服务,并且TCP在应用层可以很容易通过SSL来提供安全服务。但在对TCP和UDP的描述中,缺少对吞吐量和定时保证的讨论,即目前的因特网运输层协议并没有提供这两种服务。但是这并不意味着因特网电话等时间敏感应用就不能运行在今天的因特网上了,因为在因特网上时间敏感应用已经存在多年了。这些应用运行的很好是因为设计时尽最大可能弥补了这些保证的缺乏。因特网通常能够为时间敏感应用提供使之满意的服务,但是不能提供任何有关定时或带宽的保证。

    进程寻址:两个进程之间进行通信时,一个发送进程为了识别特定接收进程,需要定义两种信息:该主机的名称或地址  用来指定目的主机上接收进程的标识。

    在因特网中,主机是用IP地址(IP address)进行标识的。IP地址是用来唯一标识主机的32比特数(然而,网络地址转换(NAT)的广泛部署意味着实际中32比特的IP地址不仅仅唯一地用于寻址一台主机)。

    除了知道报文去往目的主机的IP地址外,发送程序也必须识别运行在主机上的接收进程。之所以需要该信息,是因为通常在一台主机上能够运行许多网络应用程序。目的地端口(port number)就是服务于这个目的的。已经给流行的应用程序分配了特定的端口号。例如,Web服务进程用的是80号端口。邮件服务进程(使用SMTP协议)用的是25号端口。当开发者创建了一个新的网络应用时,必须为该应用程序分配一个新的端口号。

    2.5  应用层协议

    应用层协议(application-layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文。特别是应用层协议定义了:

    交换的报文类型,如请求报文和相应报文。

    各种报文类型的语法,如报文中的各个字段及其详细描述。

    字段的语义,即包含在字段中的信息的含义。

    进程何时、如何发送报文及对报文相应的规则

    注意区分网络应用和应用层协议。应用层协议知识网络应用的一部分。Web应用是一种客户机/服务器应用程序,它允许客户机按照需求从Web服务器获得文档。Web应用有很多组成部分,包括文档格式的标准(即HTML)、Web浏览器、Web服务器,以及一个应用层协议。Web的应用层协议是HTTP,它定义了在浏览器和Web服务器之间传输的报文格式和序列。因此,HTTP只是Web应用的一部分。


二、Web应用和HTTP协议

    1.HTTP概况

    Web的应用层协议是超文本传输协议(HyperText Transfer Protocol,HTTP),它是Web的核心。HTTP协议由两部分程序实现:一个客户机程序和一个服务器程序,它们运行在不同的端系统中,通过交换HTTP报文进行会话。HTTP定义了这些报文的格式以及客户机和服务器是如何进行报文交换的。

    一些Web中的常用术语:

    Web页面(Web page,也叫文档)是由对象组成的。对象(object)简单来说就是文件,如HTML文件,JPEG图形文件,Java小程序或视频片段文件,这些文件可通过一个URL地址寻址,多数Web页面含有一个基本HTML文件(base HTML file)以及几个引用对象。例如,如果一个Web页面包含HTML文本和5个JPEG图形文件,那么这个Web页面有6个对象:一个基本HTML文件加五个图形。在基本HTML文件中通过对象的URL地址对对象进行引用。每个URL地址由两部分组成:存放对象的服务器主机名和对象的路径名。例如,URL地址http://www.someSchool.edu/someDepartment/picture.gif中的www.someSchool.edu就是主机名,/someDepartment/picture.gif就是路径名。因为Web浏览器(Web Browser)实现了HTTP的客户机端,所以在Web环境中,我们经常交替使用“浏览器”和“客户机”这两个术语。Web服务器(Web server)用于存储Web对象,每个对象由URL寻址。Web服务器实现了HTTP服务器端。

    HTTP定义了Web客户机是如何向Web服务器请求Web页面,以及服务器如何将Web页面传送给客户机的。当用户请求一个Web页面时,浏览器向服务器发出对该页面中所包含对象的HTTP请求报文,服务器接受请求并用包含这些对象的HTTP响应报文进行响应。

    HTTP使用TCP(而不是UDP)作为它的支撑运输层协议。HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器和服务器进程就可以通过套接字接口访问TCP。客户机从套接字接口发送HTTP请求报文和接收HTTP响应报文。服务器从套接字接口接收HTTP请求报文和发送HTTP响应报文。一旦客户机发送了一个请求报文,该报文就“脱离客户机控制”并“进入TCP的控制”。TCP为HTTP提供可靠数据传输服务。这意味着,一个客户机进程发出的每个HTTP请求报文最终都能完整地到达服务器;服务器进程发出的每个HTTP响应报文最终也都能完整地到达客户机。

    注意到一个重要的现象:服务器向客户机发送被请求的文件时,并不存储任何关于该客户机的状态信息。假如某个特定的客户机在短短的几秒钟内两次请求同一个对象,服务器并不会因为刚刚为该用户提供了该对象就不再做出反应,而是重新发送该对象,就像该服务器已经完全忘记不久之前所做过的事一样。因为一个HTTP服务器并不保存关于客户机的任何信息,所以我们说HTTP是一个无状态协议(stateless protocol)。还注意到,Web使用了客户机/服务器应用程序体系结构。Web服务总是打开的,具有一个固定的IP地址,它服务于数以百万计的不同浏览器。

    2.非持久连接和持久连接

    在许多因特网应用中,客户机和服务器进行长时间通信,其中客户机发出一系列请求,服务器对每个请求进行响应。根据不同的应用程序以及应用程序使用的方式,这一系列请求可以一个接一个发出,也可以间断性地发出。当这种客户机/服务器的交互运行于TCP协议之上时,应用程序的研制者需要确定每个请求/响应对是经一个单独的TCP连接发送,还是所有的请求及响应经相同的TCP连接发送。如果采用前一种方法,该应用程序被称为使用非持久连接(non-persistent connection);如果采用后一种方法,该应用程序被称为使用持久连接(persistent connection)。HTTP既可以使用非持久连接,也可以使用持久连接,默认方式下HTTP使用持久连接。

    2.1  非持久连接

    在非持久连接的情况下,从服务器向客户机传送一个Web页面的步骤:

    假设该页面含有一个基本HTML文件和10个JPEG图形,并且这11个对象位于同一台服务器上。该HTML文件的URL为:http://www.someSchool.edu/someDepartment/home.index。  

    HTTP客户机进程在端口号80发起一个到服务器www.someSchool.edu的TCP连接,该端口号是HTTP的默认端口。客户机和服务器上分别有一个套接字与该连接相关联。

    HTTP客户机经它的套接字向服务器发送一个HTTP请求报文。请求报文中包含了路径名/someDepartment/home.index。

    HTTP服务器进程经它的套接字接收该请求报文,从其存储器中检索出对象someDepartment/home.index,在一个HTTP响应报文中封装对象,并通过其套接字向客户机发送响应报文。

    HTTP服务器进程通知TCP断开该TCP连接。(但是直到TCP确认客户机已经完整地收到响应报文为止,它才会真正中断连接。)

    HTTP客户机接收响应报文,TCP连接关闭。报文中指出封装的对象是一个HTML文件,客户机从响应报文中提取出该文件,检查该文件,得到对10个JPEG图形的引用。

    对每个引用的JPEG图形对象重复前四步。

    当浏览器收到Web页面后,把它显示给用户。两个不同的浏览器也许会以不同的方式解释该页面。HTTP协议并不管客户机如何解释一个Web页面。HTTP规约仅定义了在HTTP客户机程序与HTTP服务器程序之间的通信协议。

    每个TCP连接在服务器返回对象后关闭,该连接并不为其他的对象而持续下来。注意到每个TCP连接只传输一个请求报文和一个相应报文。因此在本例中,用户请求该Web页面,要建立11个TCP连接。

    在上面描述的步骤中,我们有意没有明确客户机获得这10个JPEG图形对象,是使用10个串行的TCP连接还是使用并行的TCP连接。事实上,用户可以设置浏览器以控制并行度。默认方式下,大部分浏览器打开5到10个并行的TCP连接,而每个连接处理一个请求-响应事务。还可以将最大并行连接数设置为1,这样10个连接就会以串行方式建立。使用并行连接将会大大缩短响应时间。

    往返时间(Round-Trip Time,RTT):一个小分组从客户机到服务器再回到客户机所花费的时间。

    RTT包括分组传播时延、分组在中间路由器和交换机上的排队时延以及分组处理时延。

    当用户点击超链接时,浏览器在浏览器和Web服务器之间发起一个TCP连接,这涉及一个“三次握手”的过程,即客户机向服务器发送一个小TCP报文段,服务器用一个小TCP报文段做出确认和响应,最后,客户机向服务器返回确认。一个RTT等于三次握手中前两个部分所耗的时间。完成了三次握手的前两个部分后,客户机将三次握手的第三部分(确认)与一个HTTP请求报文结合起来发送到该TCP连接。一旦请求报文到达服务器,服务器向该TCP连接发送HTML文件。该HTTP请求/响应又耗掉一个RTT。因此,粗略地讲,总的响应时间就是两个RTT加上服务器传输HTML文件的时间。

    2.2  持久连接

    非持久连接有一个缺点。首先,必须为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户机和服务器都要分配TCP的缓冲区和变量,这给服务器带来了严重的负担,因为一台Web服务器可能同时服务于数以百计的客户机请求。其次,就像我们刚描述的那样,每一个对象的传输时延为两个RTT,即一个RTT用于建立TCP,另一个RTT用于请求和接收一个对象。

    在持久连接的情况下,服务器在发送响应后保持该TCP连接打开。特别是一个完整的Web页面(如上例中的基本HTML文件加上10个图形)可以用单个持久TCP连接进行传送。更有甚者,位于同一台服务器的多个Web页面在从该服务器发送给同一个客户机时,可以在单个持久TCP连接上进行。可以在单个持久TCP连接上进行。对这些对象的请求可以一个接一个地发出,而不必等待未决请求的回答(流水线)。一般来说,如果一个连接经过一定时间间隔(一个可配置的超时间隔)仍未被使用,HTTP服务器就关闭该连接。HTTP默认模式使用了流水线方式的持久连接。


    3.HTTP报文格式

    HTTP规约包含了对HTTP报文格式的定义。HTTP报文有两种:请求报文和响应报文。

    3.1  HTTP请求报文

    一个典型的HTTP请求报文   

GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/4.0
Accept-language: fr

    首先,我们看到该报文是用普通的ASCII文本书写的,这样有一定计算机知识的人就能够阅读它。其次,我们看到该报文含有5行,每行用一个回车换行符结束,最后一行后跟有附加的回车换行符。该报文只有5行,而实际的请求报文可以有更多的行或仅有一行。HTTP请求报文的第一行叫做请求行(request line)。请求行有三个字段:方法字段、URL字段和HTTP协议版本字段。方法字段可以取值GET、POST、HEAD、和DELETE。绝大部分的HTTP请求报文使用GET方法。当浏览器请求一个对象时,使用GET方法,在URL字段填写该对象的URL地址。在本例中,浏览器请求对象/somedir/page.html。其版本字段是自解释的,在本例中,浏览器实现的是HTTP/1.1版本。

    首部行Host:www.someschool.edu定义了目标所在的主机。你也许认为该首部行是不必要的,因为在该主机中已经有一个TCP连接了。但是,该首部行提供的信息是Web代理高速缓存所要求的。通过包含Connection: colse 首部行,浏览器告诉服务器不希望麻烦地使用持久连接,它要求服务器在发送完请求的对象后就关闭连接。User-agent:首部行用来定义用户代理,即向服务器发送请求浏览器的类型。这里浏览器的类型是Mozilla/4.0,即Netscape浏览器。这个首部行是有用的,因为服务器可以正确地为不同类型的用户代理实际发送相同对象的不同版本。(每个版本都由相同的URL处理。)最后,Accept-language:首部行表示用户想得到对象的法语版本(如果服务器中有这样的对象),否则,使用服务器的默认版本。Accept-language:首部行仅是HTTP中众多可选内容协商首部之一。






    4.用户与服务器的交互:cookie

    5.Web缓存

    6.条件GET方法


三、文件传输协议:FTP

四、因特网中的电子邮件

五、DNS:因特网的目录服务

六、P2P应用

七、TCP套接字编程

八、UDP套接字编程