HTTP 协议

内容列表

随着 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 请求的功能。

相关

一些互联网名词

互联网时代是个新概念频出的时代,每年有相当多的新名词诞生,而诸多与商业活动紧密相关的词汇了解一下有助于我们熟悉日常工作中接触的东西。

了解更多

JavaScript 异步编程

JavaScript 作为一门在 Web 开发中的主流语言,常常涉及到交互事件方面的应用,这不可避免的用到了异步编程的方法,而它本身则是单线程运行的。在以往的开发中,异步编程正变得越来越难管理,新的 Promise 标准 API 将使得异步编程更加方便、安全。

了解更多

使用 npm

npm 是 Node.js 的一个包管理器,Web 前端工程师也经常利用它来简化开发流程,看看如何愉快的使用 npm ,并且发布自己的包,让 npm 成为我们的开发利器。

了解更多