王道立心 2019-06-28
HTTP服务器存储了因特网中的数据,如果客户端发出请求的话,它们会提供数据。客户端向服务器发送一条HTTP请求,服务器会去寻找所期望的对象,如果成功,就将对象、对象类型、对象长度、以及其他一些信息放在HTTP响应中发送给客户端。
Web服务器是Web资源(resource)的宿主,Web资源是Web内容的源头。最简单的Web资源就是Web服务器文件系统中的静态文件;资源还可以是根据需要生成内容的软件程序,这些动态内容资源可以根据你的身份、所请求的信息或每天的不同时段来产生内容。
因特网上有数千种不同的数据类型,HTTP仔细地给每种要通过Web传输的对象都打上了名为MIME类型(MIME Type)的数据格式标签。Web服务器会在所有HTTP对象数据附加一个MIME类型,当Web浏览器从服务器中取回一个对象时,会去查看相关的MIME类型,看看它是否知道应该如何处理这个对象。
MIME类型是一种文本标记,表示一种主要的对象类型和一个特定的子类型。最初设计MIME(Multipurpose Internet Mail Extensions,多用途互联网邮件扩展)是为了解决在不同的电子邮件之间搬移报文时存在的问题。
每个Web服务器资源都有一个名字,服务器资源名被成为URI(Uniform Resource Identifier,统一资源标识符)。URI就像因特网上的邮政地址一样,在世界范围内唯一标识并定位信息资源。给定了URI,HTTP就可以解析出对象。URI有两种形式,分别称为URL和URN。
URL(Uniform Resource Locator,统一资源定位符)是资源标识符最常见的形式。URL描述了一台特定服务器上某资源的特定位置,它们可以明确说明如何从一个精确、固定的位置获取资源。大部分URL都遵循一种标准格式,这种格式包含三个部分。现在,几乎所有的URI都是URL。
一个HTTP事务是由一条请求命令(从客户端发往服务器)和一个响应结果(从服务器发回客户端)组成,这种通信是通过名为HTTP报文(HTTP message)的格式化数据块进行的。应用程序完成一项任务时通常会发布多个HTTP事务。
HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method)。每条HTTP请求报文都包含一个方法,这个方法会告诉服务器要执行什么动作。
每条HTTP响应报文返回时都会携带一个状态码,状态码是一个三位数字的代码,告知客户端请求是否成功,或者是否需要采取其他动作。伴随着每个数字状态吗,HTTP还会发送一条解释性的“原因短语”文本
HTTP报文是由一行一行的简单字符串组成的,HTTP报文是纯文本,不是二进制代码,所以可以方便地对其进行读写。从Web客户端发往Web服务器的HTTP报文称为请求报文(request message)。从服务器发往客户端的报文称为响应报文(response message),此外没有其他类型的HTTP报文。HTTP请求和响应报文的格式很类似。
# 请求报文 GET /test/hi-there.txt HTTP/1.0 (起始行) ------------------------------- Accept: text/* (首部) Accept-Language: en, fr -------------------------------
# 响应报文 HTTP/1.0 200 OK (起始行) ------------------------------- Content-type: text/plain (首部) Content-length: 19 ------------------------------- Hi! I'm a message! (主体)
报文包括以下三个部分:
HTTP报文是通过TCP(Transmission Control Protocol,传输控制协议)连接从一个地方搬移到另一个地方去的。HTTP是个应用层协议,HTTP无需操心网络通信的具体细节;把联网的细节都交给了通用、可靠的因特网传输协议TCP/IP。只要建立了TCP连接,客户端和服务器之间的报文交换就不会丢失、不会被破坏,也不会在接收时出现错序了。
TCP提供了:
在HTTP客户端向服务器发送报文之前,需要通过IP(Internet Protocol,网际协议)地址和端口号在客户端和服务器之间建立一条TCP/IP连接。在TCP中,需要知道服务器的IP地址,以及与服务器上运行的特定软件相关的TCP端口号。主机名就是P地址比较人性化的别称,可以通过一种称为DNS(Domain Name Service,域名服务)的机制方便地将主机名转换为IP地址。HTTP的URL中没有端口号时,可以假设默认端口号是80。
步骤如下:
现在使用的HTTP协议有几个版本。HTTP应用程序要尽量强健地处理各种不同的HTTP协议变体。目前仍在使用的版本如下。
位于客户端和服务器之间的HTTP中间实体。代理位于客户端和服务器之间,接收所有客户端的HTTP请求,并将这些请求转发给服务器(可能会对请求进行修改后转发)。代理还可以对请求和响应进行过滤。
HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。Web缓存(Web cache)或代理缓存(proxy cache)是一种特殊的HTTP代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。客户端从附近的缓存下载文档会比从远程Web服务器下载快的多。HTTP定义了很多功能,使得缓存更加高效,并规范了文档的新鲜度和缓存内容的隐私性。
连接其他应用程序的特殊Web服务器。网关(Gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将HTTP流量转换成其他的协议。网关接受请求时就好像自己是资源的源端服务器一样。客户端可能并不知道自己正在与一个网关进行通信。
<p>例如,一个HTTP/FTP网关会通过HTTP请求接收对FTP URI的请求,但通过FTP协议来获取文档。得到的文档会被封装成一条HTTP报文,发送给客户端</p>
对HTTP通信报文进行盲转发的特殊代理。隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的HTTP应用程序。HTTP隧道通常用来在一条或多条HTTP连接上转发非HTTP数据,转发时不会窥探数据。
HTTP隧道的一种常见用途是通过HTTP连接承载SSL加密的SSL(Secure Sockets Layer,安全套接字层)流量,这样SSL流量就可以穿过只允许Web流量通过的防火墙了。HTTP/SSL隧道收到一条HTTP请求,要求建立一条到目的地址和端口的输出连接,然后在HTTP信道上通过隧道传输加密的SSL流量,这样就可以将其盲转发到目的服务器上去了。
发起自动HTTP请求的半智能Web客户端。用户Agent代理(或者简称为Agent代理)是代表用户发起HTTP请求的客户端程序。所有发布Web请求的应用程序都是HTTP Agent代理。例如:Web浏览器。
有些自己会在Web上闲逛的自动用户Agent代理,可以在无人监视的情况下发布HTTP事务并获取内容。这些自动代理的名字通常都很生动,比如"网络蜘蛛"(spiders)或者"Web机器人"(Web robots)。网络蜘蛛会在Web上闲逛,搜集信息以构建有效的Web内容档案,比如一个搜索引擎的数据库或者为比较购物机器人生成的产品目录。