详解HTTP超文本传送协议

简介

HTTP协议定义了客户端怎么向服务器请求万维网文档,以及服务器怎么把文档传送到客户端。从层次的角度看,HTTP是面向事务(一系列的信息交换,而这一系列的信息交换是不可分割的,要么所有信息交换都完成,要么一次交换都不进行)的应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。

工作过程

万维网的工作过程如图:

每个万维网网点都有一个服务器进程,它不断地监听TCP的80端口,以便发现是否有客户端向他发出建立连接请求。一旦监听到连接请求并建立了TCP连接后,客户端就向服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应。最后,TCP连接被释放了。

在客户端和服务器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则。这个格式和规则就是超文本传送协议HTTP。

HTTP规定在客户端和服务器之间的每次交互,都由一个ASCII码串构成的请求和一个类似的通用因特网邮件扩充,即”类MIME(MIME-like)”的响应组成。

实例分析

用户浏览页面的方式有2种:一种是在浏览器的地址窗口中键入所要找的页面的URL。另一种是在某一个页面中用鼠标点击一个可选部分,这时浏览器会自动跳转在因特网上找到所要链接的页面。

假定上图中的用户用鼠标点击了屏幕上的一个可选部分。它使用的链接指向了一个URLhttp:///www.tsinghua.edu.cn/chn/yxsz/index.html,下面我们用HTTTP/1.0更具体地说明在用户点击鼠标后所发生的几件事件:

  1. 浏览器分析链接指向页面的URL;
  2. 浏览器向DNS请求解析www.tsinghua.edu.cn的IP地址;
  3. 域名系统DNS解析出清华大学服务器的IP是166.111.4.100;
  4. 浏览器与服务器建立TCP连接(在服务器端IP是166.111.4.100,端口是80);
  5. 浏览器发出取文件命令:GET /chn/yxsz/index.html;
  6. 服务器www.tsinghua.edu.cn给出响应,把文件index.html发送给浏览器;
  7. 释放TCP连接;
  8. 浏览器显示文件index.html中所有的文本。

浏览器在下载文件时,可以设置为只下载其中的文本部分。这样可以使得下载的速度加快。在这种情况下,文件中原来嵌入的图像或者音频的地方只用一个小图标来显示。用户若要下载这些图像或音频,可用鼠标再分别点击这些图标。每点击一次鼠标,就重复执行一次类似与上面的8个步骤。也就是先建立TCP连接,再使用TCP连接传送命令和传送文件,最后释放TCP连接。

特性

HTTP通常使用TCP连接传送。HTTP使用了面向连接的TCP作为传输层协议,保证了数据的可靠传输。HTTP不必考虑数据在传输过程中被丢弃后又怎样被重传。但是,HTTP协议本身是无连接的。这就是说,虽然HTTP使用了TCP连接,但通信的双方在交换HTTP报文之前不需要先建立HTTP连接。

HTTP协议是无状态的(stateless)。也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时的相同(假定现在服务器还没有把页面更新),因为服务器并不记得曾经访问过的客户,也不记得为该客户服务过多少次。HTTP的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的HTTP请求。

请求一个文档所需时间

下面我们粗略估算一下,从浏览器请求一个万维网文档到收到整个文档所需要的时间。如下图。用户在点击鼠标链接某个万维网文档时,HTTP协议首先要和服务器建立TCP连接。这需要使用三次握手。当三次握手的前两部分完成后(即经过一个RTT时间后),万维网客户就把HTTP请求报文作为第三次握手的第三个报文的数据发送到服务器(第三次握手可以携带数据,但需要消耗一个序号)。服务器收到请求报文后,就把所请求的文档作为响应报文返回给客户

从上图可看出,请求一个万维网文档所需要的时间是该文档的传输时间(与文档大小成正比)加上两倍往返时间RTT(一个RTT用于TCP连接,另一个RTT用于请求和接收文档。这里TCP建立连接的三次握手的第三个报文段捎带了客户对万维网文档的请求)。

请求文档时间 = 2 * RTT + 文档传输时间

不足与解决方案

HTTP/1.0 的主要缺点,就是每请求一个文档就要有两倍RTT的开销。若一个主页上有很多链接的对象(如图片等),那么每一次链接下载都导致2RTT的开销。特别是万维网服务器往往要同时服务于大量的客户请求,所以这种 *非持续性连接 会使万维网服务器的负担很重。好在浏览器都提供了能够打开5~10个并行的TCP连接,而每一个TCP连接处理客户的一个请求。因此,使用并行的TCP连接可以缩短响应时间(然而服务端的负担没有任何减轻)。

HTTP/1.1 协议较好地解决了这个问题,它使用持续连接(persistent connection)。所谓持续连接就是万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。这并不局限于传送同一个页面上链接的文档,而是只要这些文档在同一个服务器上就行了。目前大部分浏览器的默认设置就是使用HTTP/1.1.

HTTP/1.1协议的持续连接有2中工作方式:非流水线方式(without pipelining)和流水线方式(with pipelining)

非流水线方式的特点,是客户在收到前一个响应后才能发出下一个请求。因此,在TCP连接已经建立后,客户每访问一次对象都要用去一个往返时间RTT。这比非持续性连接要用去2个RTT时间,节省了建立TCP连接的一个RTT时间。但非流水方式还是有缺点的,因为服务器在发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。

流水线方式的特点,是客户在收到HTTP的响应报文之前就能够接着发送新的请求报文。于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。因此,使用流水线方式时,客户访问所有的对象只需要花费一个RTT时间。流水线工作方式使TCP连接中的空闲时间减少,提高了下载文档的效率。

HTTP请求报文的常用方法

方法 含义
GET 请求读取由URL所标识的信息
POST 给服务器发送信息
OPTION 请求一些选项信息
HEAD 请求读取由URL所标识的信息的首部
PUT 在指明的URL中存储一个文档
DELETE 删除指明URL所标识的资源
TRACE 用来进行环回测试的请求报文
CONNECT 用于代理服务器

状态码

  • 1xx消息——请求已被服务器接收,继续处理
  • 2xx成功——请求已成功被服务器接收、理解、并接受
  • 3xx重定向——需要后续操作才能完成这一请求
    • 301:重定向,资源永久移动,客户端不应该再继续通过该 url 访问该资源
    • 302:重定向,资源临时移动,以后可能仍然使用该 url
    • 304:not modified,浏览器可以使用本地缓存
  • 4xx请求错误——请求含有词法错误或者无法被执行
    • 400:bad request,客户发送的请求不能理解
    • 403:forbidden,无权限,服务器拒绝提供服务
    • 404:not found,没找到资源
  • 5xx服务器错误——服务器在处理某个正确请求时发生错误
    • 500:internal server error,服务器内部错误
    • 502 – 网关错误。常见的情况是反向代理后端的服务器(比如resin或tomcat)没有启动。
    • 503:server unavaliable,服务暂不可用
    • 504 – 网关超时。比如请求时长超出了服务器的响应时间限制

参考文档