跳到主要内容

HTTP 协议

· 阅读需 11 分钟

最后更新于 2018-05-27 17:45:00

随着 Internet 的发展,使用 Web 浏览器获取网络数据信息已经成为一种习惯标准,而 HTTP 协议也因此成为了网络体系中最重要的应用层协议。

HTTP

HTTP(HyperText Transfer Protocol,超文本传输协议)是一种通用的、无状态(Stateless)的、与传输数据无关的,应用于分布式、协同式、超媒体信息系统的应用层协议。除了应用于 WWW(World Wide Web,万维网)服务器与 Web 浏览器之间的超文本传输外,它也可以应用于像名称服务器和分布对象管理系统这样的系统。

HTTP 协议运行机制

HTTP 协议是基于 TCP 连接的,以请求/响应(Request/Response)模式来实现客户端(Web 浏览器)和服务器之间通信的。具体过程如下:

  1. 客户端和服务器建立 TCP 连接

    HTTP 服务器运行在某个端口(默认为 80)上进行侦听,等待连接请求。客户端打开一个套接字(Socket)向服务器发出连接请求。

  2. 客户端向服务器发送 HTTP 请求报文

    客户端与服务器建立 TCP 连接后,发送一个请求报文给服务器。请求报文包括请求方法、URI(统一资源标识符)和协议版本号,以及一个类 MIME 消息。这个类 MIME 消息又包括请求修饰符、客户端信息和可能的报文主体内容。

  3. 服务器向客户端发送 HTTP 响应报文

    服务器接收到客户端的请求报文后,向其返回响应报文。响应报文提供一个状态行和一个类 MIME 消息。状态行包含报文的协议版本号和成功、出错的状态码,类 MIME 消息包含服务器信息、实体元信息,以及可能的实体内容。

  4. 关闭 TCP 连接

    当服务器响应了客户端的请求后便会关闭 TCP 连接,直到接收到下一个请求后重新建立连接。我们现在使用的 1.1 版本的 HTTP 协议,可以在服务器响应过后,维持该连接一段时间,此时间段内客户端可以继续发送请求而不必重新建立连接。

HTTP 协议的主要特点

概述一下 HTTP 协议的主要特点:

  • 简单协议

    与其他协议相比,HTTP 协议更简单,它的通信速度很快,可以有效的处理大量请求。客户端与服务器建立连接后,HTTP 协议要求客户端必须传送的信息只是请求方法和路径。该协议虽然定义了多种请求方法,但是实际上常用的只有其中的三种:GET、HEAD 和 POST。

  • 无连接协议

    客户端与服务器间通信是基于 TCP 连接实现的,而且每次只处理一个请求,客户端收到服务器响应后会立即断开连接。1.1 版本的 HTTP 协议也只是短暂维持连接。

  • 无状态协议

    这种无状态性使得客户端与服务器连接通信运行速度非常快,但是无状态意味着对事务处理没有记忆,即每一次的请求都是独立的。

  • 基于元数据的协议

    HTTP 协议对所有事务处理都加了首部,即在主要数据前面加一部分信息,称之为元数据,即关于信息的数据。用户可以利用元数据进行有条件的请求,或者报告一次事务处理是否成功等。

统一资源标识符

URI(统一资源标识符)是统一资源定位符(URL)和统一资源名称(URN)的组合。就 HTTP 而言,统一资源标识符只是通过名称、地址或其他任何特征识别资源的格式化字符串。使用 URI 是为了唯一的标识网络上的某个目标资源;URL 就是我们通常所说的网页地址,它不仅提供了网络上目标资源的标识,而且也提供了我们访问该资源的方式。

请求方法

HTTP 协议定义了八种请求方法:

  • GET:获取由请求 URI 指定的信息。
  • HEAD:与 GET 方法一致,用来测试超文本链接的有效性、可访问性以及最近的改变。
  • POST:从客户端向服务器提交数据,例如表单信息。
  • PUT:请求服务器将包含的实体存储在请求 URI 所指示的资源中。
  • DELETE:请求源服务器删除请求 URI 制定的资源。
  • TRACE:用来进行对客户端请求的测试和调试。
  • CONNECT:保留给 SSL 隧道使用。
  • OPTIONS:表示请求由 URI 指定的请求/响应链上可得到的通信选项信息。

实际上,常用的只有其中三种方法:GET、HEAD 和 POST。

(响应)状态码

状态码(HTTP Status Code)是服务器针对客户端请求做出响应的由 3 位十进制数组成的结果码,其中第一位代表了响应类别。状态码有以下几种类别:

  • 1xx:表示信息,请求收到继续处理。
  • 2xx:表示成功,服务器对客户端发出请求的接受、理解和处理已成功完成。
  • 3xx:表示重定向,为完成请求所要求采取的操作,客户端需要重新提出请求。
  • 4xx:表示客户端错误,请求中有语法错误或不能被执行。
  • 5xx:表示服务器错误,服务器错误的执行了一个正确的请求。

大多数时候,我们客户端发出的请求都能被服务器成功处理,并返回 200(ok);当我们访问一个页面在地址栏输入网址时在末尾不加斜杠 /,服务器会有一次重定向行为并返回 301;当我们访问一个不存在的页面时,服务器则会返回 404。

Cookie、Session

由于 HTTP 协议是一个无状态的协议,每一次请求都是相互独立的,这就会导致一些资源会重复下载,因而造成性能严重下降以及其他问题。例如,当我们访问一个论坛时,登录信息若不能保存下来,我们的每次操作都要进行重复登录。而 Cookie 和 Session 这两种机制则是为了解决这个问题而引入的,他们都是用来保存客户端状态信息的。

通常,当客户端第一次发起请求时,服务器接收到请求后会在内存中创建一个 Session 对象,并利用响应头标识 Set-Cookie 来将 Sessionid(Session 对象的唯一标识)返回给客户端,并存储在 Cookie 中(域名与 sessionid 对应,确保不同域名之间 Session 相互独立)。随后,客户端再次发送请求时,浏览器默认会将 Cookie 中的信息附加到请求信息中,服务器就可以利用客户端发送来的 Cookie 信息判断是否已被服务器授权,以此来实现状态保持。

Cookie 与 Session 的区别:

  • Cookie 将状态保存在客户端;Session 将状态保存在服务器上。
  • Cookie 在客户端本地以文本形式存在,伴随每次请求发送给服务器;Session 则由服务器指定一个 SessionID 对每次请求进行验证。
  • Session 相对于 Cookie 来说较为安全一点。

HTTPS

HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的 HTTP 通道。它的实现是在 HTTP 与 TCP 之间加入 SSL(TSL)协议来进行加密认证,从而保证数据传输的安全性。

HTTP 与 HTTPS 的区别:

  • HTTPS 协议需要申请 SSL 证书,且需要一定的费用。
  • HTTP 是明文传输信息,而 HTTPS 则是加密传输信息。
  • HTTP 使用的端口号是 80,而 HTTPS 使用的端口号是 443。
  • HTTP 连接简单、快速,而 HTTPS 需要进行加密认证,会消耗一定时间。

结语

对于 HTTP 协议的报文格式、请求头、响应头,我们均可以使用 HttpWatch 插件(IE 浏览器),或者 Wireshark 软件来进行监测,会有一个直观地、全面地了解。现在的浏览器开发者工具中也带有检测 HTTP 请求的功能。