Web(World Wide Web)即全球广域网,也称为 万维网,它是一种基于超文本和 HTTP 的、全球性的、动态交互的、跨平台的分布式图形信息系统。
Web 页面(Web page)是由对象组成的。一个 对象(object)只是一个文件,如 HTML 文件、一个 JPEG 图形、一个 Java 小程序或一个视频文件等;多数 Web 页面含有一个 HTML 基本文件,它通过 对象的 URL 地址引用页面中的其他对象,即每个对象都通过其 URL 来寻址。对象的 URL(Uniform Resource Locator) 由两部分组成:存放对象的服务器主机名和对象的路径名。
Web 的应用层协议是超文本传输协议(HyperText Transfer Protocol, HTTP),它采用了 C/S 结构:
- 客户——Web 浏览器(Web browser):请求、接收、展示 Web 对象
- 服务器——Web 服务器(Web server):响应客户的请求,发送对象
HTTP 使用 TCP 传输服务:
- 服务器在 80 端口等待客户的请求;
- HTTP 客户首先发起一个与服务器的 TCP 连接(创建套接字 Socket),涉及“三次握手”过程。一旦连接建立,该浏览器和服务器就可以通过 Socket 接口访问 TCP;
- 客户向它的 Socket 接口发送 HTTP 请求报文并从它的 Socket 接口接收 HTTP 响应报文;
- 类似地,服务器从它的套接字接口接收 HTTP 请求报文和向它的套接字接口发送 HTTP 响应报文;
- 关闭 TCP 连接。
HTTP 协议是一个无状态协议(stateless protocol):服务器不维护任何有关客户端过去所发请求的信息。假如某个特定的客户在短短的几秒钟内两次请求同一个对象,服务器并不会因为刚刚为该客户提供了该对象就不再做出反应,而是重新发送该对象。
HTTP 连接类型
在许多 Web 应用程序中,客户和服务器在一个很长的时间范围内通信,其中客户发出一系列请求并且服务器对每个请求进行响应,这一系列请求可以以规则的间隔周期性地或者间断性地一个接一个发出,这就需要应用程序的开发者做出决定使用非持久性连接还是持久性连接。
定义往返时间(Round Trip Time, RTT) 为从客户端发送一个很小的数据包到服务器并返回所经历的时间。下面来简单估算一下从客户请求一个对象起到该客户收到整个文件为止所花费的时间:
- 首先需要建立客户与服务器间的 TCP 连接,这涉及“三次握手”过程,即客户向服务器发送一个小 TCP 报文段,服务器用一个小 TCP 报文段做出确认和响应,最后客户向服务器返回确认;
- 三次握手中前两个部分所耗费的时间占用了一个 RTT,然后客户结合三次握手的第三部分(确认)向该 TCP 连接发送一个 HTTP 请求报文;
- 一旦 HTTP 请求报文到达服务器,服务器就在该 TCP 连接上发送响应的对象,该 HTTP 请求 / 响应用去了另一个 RTT;
- 因此粗略地讲,总的响应时间就是两个 RTT 加上服务器传输对象的时间。
非持久性连接
每个 TCP 连接最多允许传输一个对象,HTTP 1.0 版本使用非持久性连接。
非持久性连接有一些缺点:
- 每一个对象都需要 2 个 RTT 的交付延迟;
- 必须为每一个请求的对象建立和维护一个全新的 TCP 连接,操作系统需要为每个 TCP 连接开销资源,浏览器可能打开多个并行的 TCP 连接以获取网页所需对象,给 Web 服务器带来了严重的负担。
持久性连接
每个 TCP 连接允许传输多个对象,HTTP 1.1 版本默认使用持久性连接。
发送响应后,服务器保持 TCP 连接的打开,后续的 HTTP 消息可以通过这个连接发送。
持久性连接又分为无流水的持久性连接和带有流水机制的持久性连接:
- 无流水的持久性连接:客户端只有收到前一个 HTTP 响应后才发送新的 HTTP 请求,每个被引用的对象耗时 1 个 RTT;
- 带有流水机制的持久性连接:HTTP 1.1 的默认选项,客户端只要遇到一个引用对象就尽快发出 HTTP 请求,理想情况下,收到所有的引用对象只需耗时约 1 个 RTT。
HTTP 报文格式
HTTP 报文有两种:请求报文和响应报文,报文通过 ASCII 文本书写。
HTTP 请求报文
下面提供一个典型的 HTTP 请求报文。
GET /somedir/page.html HTTP/1.1
Host: www.someschool.edu
User-agent: Mozilla/4.0
Connection: close
Accept-language:fr
HTTP 请求报文的第一行叫做请求行(request line),其后继的行叫做首部行(header line)。
请求行有 3 个字段:方法字段、URL 字段和 HTTP 版本字段,常用方法的类型:
- GET:请求指定的页面信息,并返回实体主体。使用 GET 方法时实体主体(Entity body,消息体)为空,客户输入信息通过请求行的 URL 字段上传。
www.somesite.com/animalsearch?monkeys&banana
- POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据被包含在消息体中。
- HEAD:类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头。
- PUT:将消息体中的文件上传到(替代) URL 字段所指定的路径。
- DELETE:请求服务器删除 URL 字段所指定的文件。
HTTP 响应报文
HTTP/1.1 200 OK
Connection: close
Date: Thu, 06 Aug 1998 12:00:15 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Mon, 22 Jun 1998 …...
Content-Length: 6821
Content-Type: text/html
data data data data data ...
HTTP 响应报文的第一行为状态行(status line),下面同样是首部行和消息体。
状态行有 3 个字段:协议版本字段、状态码和相应状态信息。常见的响应状态码如 “404 Not Found”。