应用层
本章学习网络应用的的原理和实现相关方面知识。
应用层协议原理
可用供应用程序使用的运输服务
英特网应用层提供不止一种运输协议,在选择可用协议时最好根据自身特色进行选择。大致可以将传输服务分为一下四类。
可靠数据传输
像电子邮件、文件共享、金融应用,必须要保证数据的完整性。如果一个传输服务提供了这样的保证数据交付的服务,就可以认为提供了可靠数据传输(reliable data transfer)。
吞吐量
可用吞吐量是指发送进程向接收进程传递比特的速率。例如:因特网电话应用程序对语音以 32kbps 的速率进行编码, 那么它也必须以这个速率向网络发送数据,并向接收应用程序交付数据。 具有吞吐量要求的应用程序被称为 **带宽敏感的应用 (bandwidth- sensitive applicaLion) 。
而弹性应用( elastic applicaLion) **能够根据 情况或多或少地利用可供使用的吞吐量。 电子邮件、文件传输以及 Web 传送都属于弹性应用。
定时
运输层协议也能提供定时保证,也就是所谓的低延迟。这点在网络游戏,视频电话中都比较重要。
安全性
最后,运输协议能够为应用程序提供一种或多种安全性服务。如数据在发送方加密,在接收方解密。
因特网提供的传输服务
因特网(更一般的是 TCP/IP 网络)为应用程序 提供两个运输层协议,即UDP和TCP。
TCP服务
- 面向连接的服务。
- 可靠的数据传输服务。
UDP服务
UPD服务是无连接的,因此在传输前,并没有握手的过程,因此UDP并不能保证该送的报文抵达服务端。
Web与HTTP
HTTP概况
Web的应用层协议是超文本传输协议(HyperText Transfer Protocol)。HTTP 由两个程序实现:一个客户程序(如:浏览器)和一个服务器程序。 这两个程序运行在不同的端系统中,并通过报文传递数据。
HTML 基本文件通 过对象的 URL 地址引用页面中的其他对象。 每个 URL 地址由两部分组成 :fr放对象的服 务器主机名和对象的路径名 。如http://anborong.top/a.pdf
,其中anborong.top
是主机名,/a.pdf
是路径名。
目前流行的HTTP客户程序有Chrome、Firefox、Inlernel Explorer等,而流行HTTP服务器有Apache、Nginx、 Microsoft Inlernel Information Server(IIS,微软互联网信息服务器)。
HTTP使用TCP作为它的支撑运输协议。
HTTP协议是无状态的协议。HTTP服务器并不会保存关于客户端的任何信息。
非持续连接和持续连接
每个请求/响应对是经一个单独的 TCP 连接发送,还是所有的请求及其响应经相同的 TCP 连接发送呢?采用前一种方法,该应用程序被称为使用非持续连接( non- persistent connection) ;采 用后一种方法,该应用程序被称为使用**持续连接( persistent connection) **。
HTTP既能够使用非持续连接,也能够使用持续连接。 尽管 HTTP 在其默认方式下使用持续连接, HTTP客户和服务器也能配置成使用非持续连接。
1. 使用非持续连接的HTTP请求
在非持续连接下,假设http://anborong.top/home/index.html
含有1个HTML文件,并且包含10个引用对象。 则HTTP请求流程如下:
- HTTP 客户进程在端口号 80 发起一个到服务器
anborong.top
的 TCP 连接,在客户和服务器上分别有一个套接字与该连接相关联。 - HTTP 客户经它的套接字向该服务器发送一个HTTP请求报文。 该报文中包含请求对象的路径。
- HTTP 服务器进程经它的套接字接收该请求报文,从其存储器 (RAM或磁盘)中检索到位于路径
/home/index.html
下的对象,并将其封装到回复报文中。 - HTTP服务器通知TCP断开此TCP连接(实际是在客户端完全接收完后才会断开)。
- HTTP 客户接收响应报文, TCP 连接关闭。 该报文指出封装的对象是一个 HTML 文 件,客户从响应报文中提取出该文件,检查该 HTML文件,得到对 10 个对象的引用。
- 对于这10个对象,重复上述步骤。
上面的步骤举例说明了非持续连接的使用,其中每个 TCP 连接在服务器发送一个对象后 关闭, ~Il该连接并不为其他的对象而持续下来。 值得注意的是每个 TCP 连接只传输一个请求 报文和一个响应报文。 因此在本例中,当用户请求该 Web 页面时,要产生 11 个 TCP 连接。
2. 使用持续连接的HTTP请求
非连续持续HTTP有两个缺点,第一:每次请求都需要重新建立新的HTTP请求,这给 Web 服务器带来了严重的负担。第二:因为重新建立连接,就必须重新握手,因此每此请求均需要多花费一倍的时间。
在采用持续连接的情况下,服务器在发送响应后保持该 TCP 连接打开。通过在http报文头部信息Keep-Alive
HTTP报文格式
HTTP请求报文
一个典型的HTTP请求报文如下所示:
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
Http请求的第一行称之为请求行(request line)
,其后继行称之为首部行(header line)
。
请求行由3部分组成,方法、URL、Http版本。在首部行中, ConnecLion: close告诉服务器不希望麻烦地使用持续连接,它要求服务器在发送完被请求的对象后就关闭这条连接。 User-agent: 首部行用来 指明用户代理,即向服务器发送请求的浏览器的类型。
Http响应报文
一个典型的HTTP响应报文如下所示:
HTTP/1. 1 200 OK /* 初始状态行*/
Connection: close /* 首部行开始 响应结束后关闭TCP连接*/
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 个字段:协议版本字段、状态码和相应状态信息。
下文给出一些常见的状态码:
200 OK: 请求成功
301 Moved Permanently:重定向
404 Not Found:未找到请求文档
500 Internal Server Error:服务器错误
Cookie
因为HTTP服务是无状态的,为了能更方便的识别用户,为此HTTP使用了Cookie,它允许站点对用户进行跟踪。如下图所示,整个Cookie技术包含四个组件。1. 在请求报文header内会有Cookie行。2. http响应报文header内会有Cookie行。3. 客户端保留一个Cookie文件,允许用户进行管理。4. 位于Web服务器后存在一台数据库。
Web缓存
使用Web缓存器可以大大减少请求的响应时间,同时使用Web缓存技术也会减少客户端之初始服务器之间的信息量,因此也会大量节约硬件成本。此外因为Web缓存能从整体上减少互联网的信息流量,因此也提高了所有应用性能。
而通过使用**内容分发网络(CDN),**CDN公司在英特网安装许多地理位置分散的缓存器,因而使大量流量本地化。
条件GET方法
尽管Web缓存可以大幅度提高HTTP请求的响应时间,但同时也带来了新的问题,我们无法确保请求到的内容是最新的。因此HTTP协议有一种机制,允许Web缓存器去验证它的对象是否是最新的,这种机制就是**条件GET(conditional GET)**方法。该机制生效需要两个条件:
- 必须使用GET方法
- 请求报文包含一个‘If-Modified -Since’的首部行
我们通过一组例子,了解条件GET方法如何工作。
- 首先一个代理服务器,代表一个浏览器,向某个Web服务器发出请求,报文如下:
GET /home/a.gif HTTP/1.1
host: www.anborong.top
- 其次Web服务器向代理服务器的请求报文做出响应,响应报文如下:
HTTP/ l. l 200 OK
Date: Sat, 8 Oct 2011 15:39:29
Server: Apache/1.3.0 (Unix)
Last-Modified: Wed , 7 Sep 2011 09:23:24
Content-Type: image/gif
(data data data data data …)
- 该代理服务器将请求到的数据保存至本地,并同时向浏览器的请求做出响应,发送Web服务器发送的数据。
- 假设一个星期后,某人再次请求代理服务器相同的资源。为了确保此时数据是最新的,代理服务器向Web服务器发出一个条件GET查询,仅指定在Wed , 7 Sep 2011 09:23:24后修改过,则发送最新对象,如果没有修改则会收到如下第五条报文, GET查询请求报文如下:
GET /home/a.gif HTTP/1.1
host: www.anborong.top
If-Modified-Since: Wed , 7 Sep 2011 09:23:24 /* 这里的日期为上次Web服务器的响应报文Last-Modified字段 */
- 如果Web服务器并没有修改对象,则会发送如下响应报文:
HTTP/1.1 304 Not Modified /* 注意状态 */
Date: Sat, 15 Oct 2011 15:39:29
Server: Apache/l.3.0 (Unix)
(empty entity body) /* 节约带宽 并没有发送重复数据 */
文件传输协议FTP
FTP与HTTP相同都是运行在TCP协议上且都是文件传输协议,但有两点不同:
- FTP是有状态的协议
FTP服务器必须在整个会话期间保存用户的状态,同别是FTP服务器需要把特定的用户账户与控制连接联系起来。随着用户在远程目录树上浏览徘徊,服务器必须跟踪用户在远程目录树上的当前位置。因需要对每一个会话进行跟踪,这也限制了FTP的最大访问连接数。
- FTP的控制信息是带外传播
FTP使用了两个并行的TCP连接来传输文件,一个是控制连接 (control connection),一个是数据连接( data
connection)。控制连接用于在两主机之间传输控制信息,如用户标识、口令、改变远程目
录的命令以及“存放 (pull)”和“获取 (get)” 文件的命令。数据连接用于实际发送一个文件。因为FTP协议使用一个独立的控制连接,所以我们也称FTP的控制信息是带外
( out-of-band) 传送的。如你所知, HTTP协议是在传输文件的同一个TCP连接中发送请求和响应首部行的。因此,HTTP也可以说是带内 (in-band) 发送控制信息的。