计算机网络应用层
应用层所讨论的对象可以简单理解为端系统上的网络应用程序。
因特网网络体系结构分为5层:应用层、传输层、网络层、链路层、物理层。应用程序体系结构由应用程序研发者设计,规定了如何在端系统上组织该应用程序。主流的体系结构有两种:客户-服务器体系结构和对等P2P体系结构。
客户-服务器体系结构:
在此体系结构里,有一个总是打开的主机称为服务器,它服务于其他称为客户的主机的请求。而一台单独的服务器可能没法承受来自太多客户的请求,所以采用配备了大量主机的数据中心(data center)提供虚拟服务器。
对等P2P体系结构:
对位于数据中心的专用服务器有几乎没有依赖,应用程序在间断连接的主机之间直接通信,这些主机对称为对等方。该体系结构的特性之一是自扩展性(self-scalability)。例如文件共享:BitTorrent。
进程通信:
在端系统中的每一个应用程序可以抽象为一个进程,不同端系统上的进程,通过跨越计算机网络交换报文(message)。
套接字:
每一个进程通过套接字(socket)与计算机网络交互,套接字是进程与计算机网络之间的接口,进程通过套接字软件接口向计算机网络发送报文。也就是同一台主机中应用层和传输层的接口。由于套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口(Application Programming Interface, API)。
进程寻址:
1.主机地址(IP);2.进程标识(port)
可供应用程序使用的传输服务分类:可靠数据传输、吞吐量、定时和安全性。也即是应用层程序对下一层服务的希望,而因特网能提供的传输层服务协议有两类:TCP和UDP。
TCP提供面向连接和可靠数据传输服务:
- 面向连接服务是指在应用层数据报文开始传输之前,TCP让客户和服务器互相交换传输层控制信息,即是所谓的握手过程。握手之后,一个TCP连接就在两个进程的套接字之间建立了。该连接是全双工的,即连接双方都可以在此连接上同时收发报文。当结束报文发送时,需要拆除连接。
- 可靠的数据传输服务:进程能够依赖TCP,无差错、按适当的顺序交付所有发送的数据,没有字节的丢失和冗余。
除此以外TCP协议还提供拥塞控制机制。当发送方和接收方之间的网络出现拥塞时,TCP的拥塞控制机制会抑制发送进程(拥塞窗口)。
TCP和UDP都没有提供任何加密机制,所以当前一般采用升级版TCP,称为安全套接字层(Secure Socket Layer,SSL)。升级后的TCP额外提供关键的进程到进程的安全性服务,包括加密、数据完整性和端点鉴别。SSL不是独立于TCP和UDP的第三个协议,而是TCP的改进版,是在应用层上实现的。如果一个应用程序想要使用SSL服务,需要在程序的客户端和服务器段包含SSL的代码。
UDP服务:
UDP服务时不提供不必要服务的轻量型传输层服务,UDP提供无连接和不可靠的数据传输服务。更加没有拥塞控制机制。
应用层协议:
应用层协议(application-layer protocol)定义了在不同端系统上的应用程序进程如何相互传递报文:
- 交换的报文类型
- 各种报文类型的语法
- 字段的语义
- 确定一个进程何时以及如何发送报文,对报文响应的规则
Web的应用层协议是HTTP(HyperText Transfer Protocol,超文本传输协议),定义了浏览器和Web服务器之间传输报文的格式和序列;电子邮件的注意应用层协议时SMTP(简单邮件传输协议)。
HTTP协议:
HTTP由两个程序实现,一个客户程序一个服务器程序。HTTP使用TCP作为它的传输层协议,HTTP客户首先发起一个与服务器的TCP连接,一旦连接建立,浏览器和服务器进程就可以通过套接字接口访问TCP了。在HTTP协议下,服务器向客户发送被请求文件,却不存储任何关于客户的状态信息,所以说HTTP时一个无状态协议(stateless protocol)。
当每个请求/响应对是经一个单独的TCP连接发送时,该应用程序被称为使用非持续连接(non-persistent connection);当所有的请求和响应经由相同的TCP连接发送时,称为使用持续连接(persistent connection)。默认使用持续连接。
- 非持续连接的缺点:必须为每一个请求对象建立和维护一个全新的TCP连接,需要分配TCP缓冲区和保持TCP变量,降低服务器性能;增加对象交付时延。
- 持续连接:同一台服务器的多个对象发送给客户时,可以在单个连接上处理,对象可以接连发送,不必等待未完成的请求的回答。如果一个连接经过一定时间未被使用,HTTP服务器将关闭连接。HTTP的默认模式是时延带流水线的持续连接。
HTTP报文:
请求报文:
GET /somedir/page.html HTTP/1.1 Host: www.someschool.edu Connection: close User-agent: Mozilla/5.0 Accept-language: fr
第一行称为请求行,后面称为首部行,请求行有三个字段:方法字段、URL字段和HTTP版本字段;首部行有多个取值。
请求报文的通用格式:
在首部行后面是实体体(entity body),使用GET请求,实体体为空,使用POST请求时才使用该实体体,例如提交表单。
响应报文:
HTTP/1.1 200 OK Connection: close Date: Tue, 18 Aug 2015 15:44:04 GMT Server: Apache/2.2.3 (CentOS) Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT Content-Length: 6821 Content-Type: text/html (data data data data data ...)
第一行称为状态行(status line),后面是首部行(header line),最后是实体体,实体体是报文的主要内容,即是请求对象本身。状态行有三个字段:协议版本字段、状态码和相应状态信息。首部行中的Last-Modified字段在使用缓存服务器(代理服务器)时会用到。
响应报文的通用格式:
状态码和相应的状态短语:
- 200 OK:请求成功,并在响应中返回信息。
- 301 Moved Permanently:请求的对象已被永久移动; 新 URL 在 Location: 响应消息的标头中指定。 客户端软件将自动检索新 URL。
- 400 Bad Request:这是一个通用错误代码,表示服务器无法理解该请求。
- 404 Not Found:请求的文档在此服务器上不存在。
- 505 HTTP Version Not Supported:服务器不支持请求的 HTTP 协议版本。
cookie
用户与服务器交互:cookie
HTTP服务器是无状态的,所以HTTP服务器使用cookie来识别来访用户。如图cookie技术有4个组件:
- 在HTTP响应报文中的一个cookie首部行
- 在HTTP请求报文中的一个cookie首部行
- 在用户端系统中的一个cookie文件,由用户浏览器管理
- 位于Web站点的后端数据库
cookie的使用过程如图所示。因此cookie可以在无状态的HTTP之上建立一个用户会话层。
Web缓存:
也叫代理服务器,能够代表初始Web服务器来服务HTTP请求的网络实体。Web缓存有自己的磁盘存储空间,并在存储空间中存储最近请求过的对象的副本。具体说来,步骤如下:
- 浏览器创建一个到Web缓存的TCP连接,并向Web缓存中的对象发送一个HTTP请求;
- Web缓存检查是否有该对象副本,如果有,就直接向客户浏览器用HTTP响应报文返回该对象;
- 如果Web缓存中没有对象副本,Web缓存就打开一个与该对象的初始服务器的TCP连接。Web缓存在当前的缓存服务器和服务器的TCP连接上发送一个对该对象的HTTP请求,收到该请求后,初始服务器向Web缓存发送具有该对象的HTTP响应;
- Web缓存收到该对象时,在本地存储空间存储一份副本,并向用户的浏览器用HTTP响应报文发送该副本;
条件GET方法
Web缓存的对象可能是旧的,HTTP协议的条件GET(conditional GET)方法,允许缓存更新自己的对象副本,使用方法是:
- 请求报文使用GET方法;
- 请求报文包含一个“If-Modified-Since:”首部行;
该HTTP请求报文就是一个条件GET请求报文。
举例:
GET /fruit/kiwi.gif HTTP/1.1 Host: www.exotiquecuisine.com If-modified-since: Wed, 9 Sep 2015 09:23:24
如果初始服务器中的对象在日期后修改过,才会发送该对象。
电子邮件:
电子邮件系统的主要组成部分:用户代理(user agent)、邮件服务器(mail server)、简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)。
邮件服务器形成了电子邮件系统结构的核心,每个接收方在一个邮件服务器上有一个邮箱(mailbox),邮箱管理和维护者发送给接收方的报文。一个典型的邮件发送过程是:从发送方的用户代理开始,用户代理传输邮件到发送方的邮件服务器,发送方的邮件服务器再传输到接收方的邮件服务器,然后在这里被分发给接收方的邮箱中。如果发送方的邮件服务器不能将邮件交付给接收方的邮件服务器,发送方在一个报文队列(message queue)中保持该报文并在以后再发送。
SMTP
SMTP过程如图:
SMTP一般不使用中间邮件服务器,而是直接连接接收方的邮件服务器。使用TCP提供的可靠数据传输将邮件无差错的投递到接收方邮件服务器。
举例一个SMTP客户和服务器之间交换报文的例子:
S: 220 hamburger.edu C: HELO crepes.fr S: 250 Hello crepes.fr, pleased to meet you C: MAIL FROM: <alice@crepes.fr> S: 250 alice@crepes.fr ... Sender ok C: RCPT TO: <bob@hamburger.edu> S: 250 bob@hamburger.edu ... Recipient ok C: DATA S: 354 Enter mail, end with ”.” on a line by itself C: Do you like ketchup? C: How about pickles? C: . S: 250 Message accepted for delivery C: QUIT S: 221 hamburger.edu closing connection
SMTP与HTTP对比:
文件传送时,两者都使用持续连接。
区别:
- HTTP是一个拉协议(pull protocol),用户使用HTTP从服务器拉取信息,TCP连接是由接收文件的主机发起的;
- SMTP基本上是一个推协议(push protocol),即发送邮件服务器将文件推向接收邮件服务器,TCP连接是由要发送该文件的主机发起的;
- SMTP要求每个报文,包括体,采用7比特ASCII码格式;
- 处理既包含文本又包含图像的文档,HTTP把每个对象封装到各自的HTTP响应报文里,SMTP将所有报文对象封装到一个报文中。
邮件报文格式:
上面交换报文的例子中的命令是SMTP握手协议的一部分,这里的则是邮件报文自身的一部分。
From: alice@crepes.fr To: bob@hamburger.edu Subject: Searching for the meaning of life.
报文首部之后,接着一个空白行,然后是以ACSII格式表示的报文文体。
邮件访问协议:
接收方的用户代理不能使用SMTP获取报文,因为取报文是一个拉操作,而SMTP是一个推协议,引入特殊的邮件访问协议:第三版的邮局协议(Post Office Protocol-Version 3,POP3)、因特网邮件访问协议(Internet Mail Access Protocol,IMAP)以及HTTP。
POP3
POP3是一个极为简单的邮件访问协议,随着TCP连接建立,POP3分阶段工作:特许(authorization)、事务处理和更新。
- 在特许阶段,用户代理发送用户名和口令鉴别用户;
- 事务处理阶段,用户代理取回报文,同时可以对报文做删除操作、获取邮件的统计信息;
- 更新阶段,出现在用户发送quit命令之后,目的是结束该POP3会话。此时,邮件服务器删除那些标记为删除的邮件。
在事务处理阶段,使用POP3的用户代理可以被配置为“下载并删除”或“下载并保留”方式。区别是邮件服务器是否删除原始邮件报文。
IMAP
POP3没有给用户提供任何创建远程文件夹并为报文指派文件夹的方法。IMAP服务器把每个报文与一个文件夹联系起来:当报文第一次到达邮件服务器时,与接收方的INBOX文件夹相连,用户可以随意移动该报文到其他文件夹,与POP3不同,IMAP服务器维护了IMAP会话的用户状态信息。