应用层协议
应用层协议 (application-layer protocol) 定义了运行在不同端系统上的应用程序进程如何相互传递报文,特别是应用层协议定义了:
- 交换的报文类型,例如请求报文和响应报文
- 各种报文类型的语法,如报文中的各个字段及这些字段是如何描述的
- 字段的语义,即这些字段中包含的信息的含义
- 一个进程何时以及如何发送报文,对报文进行响应的规则。
在本文中主要是讲5种重要的应用: Web 、文件传输、电子邮件、目录服务和P2P,我们首先讨论 Web应用,不仅因为它是极为流行的应用,而且因为它的应用层协议 HTTP 相对比较简单并且易于理解。讨论完 Web ,我们简要地讨论FTP,因为它与 HTTP 形成了很好的对照 我们接下来讨论电子邮件应用,这是因特网上最早的招人喜爱的应用程序。说电子邮件比 Web更复杂,是因为它使用了多个而不是一个应用层协议。在电子邮件之后,我们讨论DNS它为因特网提供目录服务,大多数用户不直接与 DNS 打交道,而是通过其他的应用(包括Web 、文件传输和电子邮件)间接使用它,DNS 很好地说明了一种核心的网络功能(网络名字到网络地址的转换)是怎样在因特网的应用层实现的。
HTTP概况
Web 的应用层协议是超文本传输协议 (HyperText Transfer Protocol , HTTP) ,它是Web的核心,HTTP 由两个程序实现:一个客户程序和一个服务器程序。客户程序和服务器程序运行在不同的端系统中,通过交换HTTP报文进行会话。 HTTP 定义了这些报文的结构以及客户和服务器进行报文交换的方式。HTTP使用TCP作为它的支撑运输协议(而不是在 UDP 上运行)。HTTP 客户首先发起一个与服务器的TCP连接,一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问TCP。 **注意:**服务器向客户发送被请求的文件,而不存储任何关于该客户的状态信息,假如某个特定的客户在短短的几秒钟内两次请求同一个对象,服务器并不会因为刚刚为该客户提供了该对象就不再做出反应,而是重新发送该对象,就像服务器已经完全忘记不久之前所做过的事一样,因为 HTTP 服务器并不保存关于客户的任何信息,所以我们说HTTP是一个无状态协议 (stateless protocol)
非持续连接和持续连接
在许多因特网应用程序中,客户和服务器在一个相当长的时间范围内通信,其中客户发出一系列请求并且服务器对每个请求进行响应 依据应用程序以及该应用程序的使用方式,这一系列请求可以以规则的间隔周期性地或者间断性地一个接一个发出。当这种客户-服务器的交互是经TCP进行的,应用程序的研制者就需要做一个重要决定,即每个请求/响应对是经一个单独的 TCP 连接发送,还是所有的请求及其响应经相同的TCP连接发送呢?采用前一种方法,该应用程序被称为使用非持续连接( non- persistent connection) ;采用后一种方法,该应用程序被称为使用持续连接( persistent connection)。尽管 HTTP在其默认方式下使用持续连接, HTTP 客户和服务器也能配置成使用非持续连接。 非持续连接有一些缺点:首先,必须为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户和服务器巾都要分配 TCP 的缓冲区和保持 TCP 变量。这给 Web 服务器带来了严重的负担,因为一台 Web 服务器可能同时服务于数以百计不同的客户的请求。第二,每一个对象经受两倍 RTT 的交付时延,即一个RTT 用于创建 TCP ,另一个 RTT 用于请求和接收一个对象。在采用持续连接的情况下,服务器在发送响应后保持该 TCP 连接打开。在相同的客户与服务器之间的后续请求和响应报文能够通过相同的连接进行传送
HTTP报文格式
- 请求报文
GET /somedir/page.html HTTP/l.l
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
我们看到该报文由5行组成,每行由一个回车和换行符结束。最后一行后再附加一个回车换行。虽然这个特定的报文仅有5行,但一个请求报文能够具有更多的行或者至少为一行。HTTP 请求报文的第一行叫做请求行 (request line) ,其后继的行叫做首部行( headerline)。请求行有3个字段:方法字段、URL字段和HTTP版本字段。方法宇段可以取几种不同的值,包括 GET、POST、HEAD、PUT和DELETE。绝大部分的 HTTP 请求报文使用GET方法,当浏览器请求一个对象时,使用 GET 方法,在 URL 字段带有请求对象的标识。在本例中,该浏览器正在请求对象/somedirl page. html 其版本字段是自解释的;在本例中,浏览器实现的是 HTTP/ l. 版本。 现在我们看看本例的首部行:首部行 Host: www. someschool. edu 指明了对象所在的主机。你也许认为该首部行是不必要的,因为在该主机中已经有一条 TCP 连接存在了,但是,该首部行提供的信息是 Web 代理高速缓存所要求的,通过包含 Connection: close 首部行,该浏览器告诉服务器不希望麻烦地使用持续连接,它要求服务器在发送完被请求的对象后就关闭这条连接。User- agent: 首部行用来指明用户代理,即向服务器发送请求的浏览器的类型。这里浏览器类型是 Mozilla/5. 0,即Firefox 浏览器,这个首部行是有用的,因为服务器可以有效地为不同类型的用户代理,实际发送相同对象的不同版本 (每个版本都由相同的URL寻址)。最后Accept-language:首部行表示用户想得到该对象的法语版本(如果服务器中有这样的对象的话);否则,服务器应当发送它的默认版本 Accept -language:首部行仅是 HTTP 中可用的众多内容协商首部之一。
HEAD方法类似于GET方法,当服务器收到使用HEAD方法的请求时,将会用一个HTTP报文进行响应,但是并不返回请求对象,应用程序开发者常用HEAD方法进行调试,跟踪PUT方法常与Web发行工具联合使用,它允许用户上传对象到指定的 Web 服务器上指定的路径(目录)。PUT方法也被那些需要向 Web 服务器上传对象的应用程序使用。DELETE 方法允许用户或者应用程序删除 Web 服务器上的对象
- HTTP响应报文 下面我们提供了一条典型的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 ...)
我们仔细看一下这个响应报文 它有三个部分:一个初始状态行 (sLatus line) ,6个首部行 (header 1ine) ,然后是实体体 (enLity body) 实体体部分是报文的主要部分,即它包含了所请求的对象本身(表示为 dala dala data data …)。 状态行有3个字段:协议版本字段、状态码和相应状态信息。在这个例子中,状态行指示服务器正在使用 HTTP/l.1,并且一切正常(即服务器已经找到并正在发送所请求的对象)。 我们现在来看看首部行。服务器用 Connection: close 首部行告诉客户,发送完报文后将关闭该 TCP 连接。Date: 首部行指示服务器产生并发送该响应报文的日期和时间。值得一提的是,这个时间不是指对象创建或者最后修改的时间;而是服务器从它的文件系统中检索到该对象,插入到响应报文,并发送该响应报文的时间。Server: 首部行指示该报文是由一台 Apache Web 服务器产生的,它类似于 HTTP 请求报文中的 User- agent 首部行。Last- Modified: 首部行指示了对象创建或者最后修改的日期和时间。Lasl-Modified: 首部行对既可能在本地客户也可能在网络缓存服务器上的对象缓存来说非常重要。下面将会介绍缓存服务器(也叫代理服务器)。Content- Length: 首部行指示了被发送对象中的字节数;Conlent- Type: 首部行指示了实体体中的对象是 HTML 文本 (该对象类型应该正式地由 Conlent- Type: 首部行而不是用文件扩展名来指示。
Web 缓存
Web缓存器 (Web cache)也叫代理服务器 (proxy server),它是能够代表初始 Web 服务器来满足 HTTP 请求的网络实体。Web 缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本 如图 2-11 所示,可以配置用户的浏览器,使得用户的所有 HTTP请求首先指向 Web 缓存器。一旦某浏览器被配置,每个对某对象的浏览器请求首先被定向到该 Web 缓存器。举例来说,假设浏览器正在请求对象 http://www.someschool. edu/ campus.giI.将会发生如下情况:
- 浏览器建立一个到Web缓存器的TCP连接,并向 Web 缓存器中的对象发送一个HTTP请求
- Web 缓存器进行检查,看看本地是否存储了该对象副本 如果有, Web 缓存器就向客户浏览器用 HTTP 响应报文返回该对象
- 如果 Web 缓存器中没有该对象,它就打开一个与该对象的初始服务器(如www. someschool. edu),TCP 连接 Web 缓存器则在这个缓存器到服务器的TCP连接上发送一个对该对象的 HTTP 请求,在收到该请求后,初始服务器向该 Web缓存器发送具有该对象的 HTTP响应
- 当 Web 缓存器接收到该对象时,它在本地存储空间存储一份副本,并向客户的浏览器用盯TP 响应报文发送该副本(通过现有的客户浏览器和 Web 缓存器之间的TCP连接)
DHCP协议
DHCP(Dynamic Host Configuration Protocol: 动态主机设置协议,DHCP是一个局域网协议,DHCP是应用UDP协议的应用层协议。使用UDP协议工作,主要有两个用途:给内部网络或网络服务供应商自动分配IP地址,给用户或者内部网络管理员作为对所有计算机作中央管理的手段。 对于一个 临时设备,是如何知道自己的IP地址的? DHCP服务器监听默认端口:67,主机使用UDP协议广播DHCP发现报文,DHCP服务器发出DHCP提供报文,主机向DHCP服务器发出DHCP请求报文,DHCP服务器回应并提供IP地址。
HTTPS
由于HTTP是明文传输的,则HTTPS(Secure)是安全的HTTP协议,默认端口为443,http(s): //<主机>:<端口>/<路径>
- A、B是拥有一定数学关系的一组秘钥
- 私钥:私钥自己使用,不对外公开
- 公钥:公钥给大家使用,对外公开
- 使用公钥加密,使用私钥解密。
- 数字证书是可信任组织颁发给特定对象的认证
证书格式、版本号 |
证书序列号 |
签名算法 |
有效期 |
对象名称 |
对象公开秘钥 |
... |
- SSL(Secure Sockets Layer: 安全套接层)
- 数据安全和数据完整
- 对传输层数据进行加密后传输
HTTPS 原理
- 客户端将它所支持的算法列表和一个用作产生密钥的随机数发送给服务器 ;
- 服务器从算法列表中选择一种加密算法,并将它和一份包含服务器公用密钥的证书发送给客户端;该证书还包含了用于认证目的的服务器标识,服务器同时还提供了一个用作产生密钥的随机数;
- 客户端对服务器的证书进行验证(有关验证证书,可以参考数字签名),并抽取服务器的公用密钥;然后,再产生一个称作 pre_master_secret 的随机密码串,并使用服务器的公用密钥对其进行加密(参考非对称加 / 解密),并将加密后的信息发送给服务器 ;
- 客户端与服务器端根据 pre_master_secret 以及客户端与服务器的随机数值独立计算出加密和 MAC密钥(参考 DH密钥交换算法);
- 客户端将所有握手消息的 MAC 值发送给服务器;
- 服务器将所有握手消息的 MAC 值发送给客户端
文件传输协议:FTP
在一个典型的FTP会话中,用户坐在一台主机(本地主机)前面,向一台远程主机传输(或接收来自远程主机的)文件 为使用户能访问它的远程账户,用户必须提供一个用户标识和口令 在提供了这种授权信息后,用户就能从本地文件系统向远程主机文件系统传送文件,反之亦然 如图 2-14 所示,用户通过一个FTP用户代理与FTP交互。该用户首先提供远程主机的主机名,使本地主机的FTP客户进程建立一个到远程主机FTP服务器进程的 TCP 连接。该用户接着提供用户标识和口令,作为 FTP 命令的一部分在该 TCP连接上传送。一旦该服务器向该用户授权,用户可以将存放在本地文件系统中的一个或者多个文件复制到远程文件系统(反之亦然)。
HTTP和FTP 都是文件传输协议,并且有很多共同的特点,例如,它们都运行在 TCP上,然而,这两个应用层协议也有一些重要的区别 其中最显著的就是FTP 使用了两个并行的 TCP 连接来传输文件,一个是控制连接 (control connection) ,一个是数据连接( data connection) 。控制连接用于在两主机之间传输控制信息,如用户标识、口令、改变远程目录的命令以及"存放 (put) "和"获取 (get)"文件的命令。数据连接用于实际发送一个文件,因为FTP协议使用一个独立的控制连接,所以我们也称FTP的控制信息是带外(out-of-band)传送的。如你所知,HTTP协议是在传输文件的同一个 TCP 连接中发送请求和响应首部行的 因此,HTTP也可以说是带内 (in-band) 发送控制信息的。FTP协议的控制连接和数据连接如图二 15 所示:
当用户主机与远程主机开始一个FTP会话时,FTP的客户(用户)端首先在服务器21号端口与服务器(远程主机)端发起一个用于控制的 TCP 连接。FTP的客户端也通过该控制连接发送用户的标识和口令,发送改变远程目录的命令,当FTP的服务器端从该连接上收到一个文件传输的命令后(无论是向还是来自远程主机) ,就发起一个到客户端的 TCP 数据连接 FTP 在该数据连接上准确地传送一个文件,然后关闭该连接。在同一个会话期间,如果用户还需要传输另一个文件,FTP则打开另一个数据连接,因而对FTP传输而言,控制连接贯穿了整个用户会话期间,但是对会话中的每一次文件传输都需要建立一个新的数据连接(即数据连接是非持续的)。 FTP服务器必须在整个会话期间保留用户的状态(state) 特别是,服务器必须把特定的用户账户与控制连接联系起来,随着用户在远程目录树上徘徊,服务器必须追踪用户在远程目录树上的当前位置,对每个进行中的用户会话的状态信息进行追踪,大大限制了FTP同时维持的会话总数。而另一方面,前面讲过 HTTP 是无状态的,即它不必对任何用户状态进行追踪。
因特网中的电子邮件
图2-16 给出了因特网电子邮件系统的总体情况,从该图中我们可以看到它有3个主要组成部分: 用户代理( user agenl) 、邮件服务器 (mail server) 简单邮件传输协议(Simple Mai] Transfer Prolocol , SMTP) 。
SMTP 是因特网电子邮件中主要的应用层协议,它使用 TCP 可靠数据传输服务,从发送方的邮件服务器向接收方的邮件服务器发送邮件,像大多数应用层协议一样, SMTP有两个部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端,每台邮件服务器上既运行 SMTP 的客户端也运行 SMTP 的服务器端 。当一个邮件服务器向其他邮件服务器发送邮件时,它就表现为 SMTP 的客户;当邮件服务器从其他邮件服务器上接收邮件时,它就表现为SMTP的服务器。目前有一些流行的邮件访问协议,包括第三版的邮局协议 (POSl OfficeProtocol-Version 3 , POP3)、因特网邮件访问协议 (Intemet Mail Access Protocol , IMAP)以及 HTTP。 总结:应用层为操作系统或网络应用程序提供访问网络服务的接口。数据传输基本单位为报文;包含的主要协议:FTP(文件传送协议)、Telnet(远程登录协议)、DNS(域名解析协议)、SMTP(邮件传送协议),POP3协议(邮局协议),HTTP协议(Hyper Text Transfer Protocol)。