前端之HTTP协议

1. HTTP协议概述

  • HTTP是一种能够获取如 HTML 这样的网络资源的通讯协议。它是在 Web 上进行数据交换的基础,是一种 client-server 协议。一个完整的Web文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。
    前端之HTTP协议

  • HTTP协议,全称Hyper Text Transfer Protocol(超文本传输协议)。

  • HTTP协议是用于从(WWW:World Wide Web,简万维网 )服务器传输超文本到本地浏览器的传送协议。

  • HTTP协议工作于B/S架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送请求Request。Web服务器根据接收到的请求后,向客户端发送响应信息Response。

  • HTTP协议是基于TCP/IP通信协议来传递数据的(HTML 文件, 图片文件等)。
    前端之HTTP协议

2. HTTP协议历史发展

迄今为止,HTTP协议的发展经历了4个版本的演化。

2.1 HTTP/0.9

  • 第一个HTTP协议诞生于1989年3月,已过时。它拥有以下特点:
    • 组成简单:它的组成极其简单:它只允许客户端发送GET这一种请求;不支持请求头;由于没有请求头,造成了HTTP 0.9协议只支持一种内容,即纯文本。不过网页仍然支持用HTML语言格式化,同时无法插入图片。
    • 无状态性:HTTP 0.9具有典型的无状态性,每个事务独立进行处理,事务结束时就释放这个连接。也就是说,一次HTTP 0.9的传输首先要建立一个由客户端到Web服务器的TCP连接,由客户端发起一个请求,然后由Web服务器返回页面内容,然后连接会关闭。如果请求的页面不存在,也不会返回任何错误码。由此可见,HTTP协议的无状态特点在其第一个版本0.9中已经成型。

2.2 HTTP/1.0

  • HTTP/1.0是HTTP协议的第二个版本,至今仍被广泛采用。首次在通讯中指定版本号。相对于HTTP 0.9 增加了如下主要特性:
    • 支持请求头与响应头;
    • Response响应以一个响应状态行开始;
    • Response包含的内容不只限于超文本;
    • 开始支持客户端通过POST方法向Web服务器提交数据,并支持GET、HEAD、POST方法;
    • 支持长连接Keepalive(但默认还是使用短连接);
    • 缓存机制以及身份认证。

2.3 HTTP/1.1

  • HTTP/1.1是HTTP协议的第三个版本,是目前主流的HTTP协议版本

  • HTTP 1.1引入了许多关键性能优化:keepalive连接,请求流水线,chunked编码传输,字节范围请求等。

    • keepalive连接(长连接)。它允许HTTP设备在事务处理结束之后将TCP连接保持在打开的状态,以便未来的HTTP请求重用现在的连接,直到客户端或服务器端决定将其关闭为止。
      前端之HTTP协议
    • Pipelining(请求流水线)。支持持久连接的客户端可以“流水线”它的请求(即,发送多个请求而无需等待每个响应)。服务器必须按照与收到请求的相同顺序来向这些请求发送响应。

2.4 HTTP/2.0

  • HTTP 2.0是下一代HTTP协议,目前应用还非常少。主要特点有:
    • 多路复用(二进制分帧):HTTP 2.0最大的特点:便是不会改动HTTP 的语义。HTTP 方法、状态码、URI 及首部字段,等等这些核心概念上一如往常,却能致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。而之所以叫2.0,是在于新增的二进制分帧层。在二进制分帧层上, HTTP 2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中HTTP1.x的首部信息会被封装到Headers帧,而我们的request body则封装到Data帧里面。
      HTTP 2.0 通信都在一个连接上完成,这个连接可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。
    • 头部压缩:当一个客户端向相同服务器请求许多资源时,像来自同一个网页的图像,将会有大量的请求看上去几乎同样的,这就需要压缩技术对付这种几乎相同的信息。
    • 随时复位:HTTP1.1一个缺点是当HTTP信息有一定长度大小数据传输时,你不能方便地随时停止它,中断TCP连接的代价是昂贵的。使用HTTP2的RST_STREAM将能方便停止一个信息传输,启动新的信息,在不中断连接的情况下提高带宽利用效率。
    • 服务器端推流(Server Push):客户端请求一个资源X,服务器端判断也许客户端还需要资源Z,在无需事先询问客户端情况下将资源Z推送到客户端,客户端接受到后,可以缓存起来以备后用。
    • 优先权和依赖:每个流都有自己的优先级别,会表明哪个流是最重要的,客户端会指定哪个流是最重要的,有一些依赖参数,这样一个流可以依赖另外一个流。优先级别可以在运行时动态改变,当用户滚动页面时,可以告诉浏览器哪个图像是最重要的,你也可以在一组流中进行优先筛选,能够突然抓住重点流。

3. HTTP消息报文

  • Message:消息/报文,是在HTTP客户端和服务器之间传递的数据块。

  • HTTP协议规定,消息必须符合特定的格式才能被彼此理解。

  • HTTP消息是服务器和客户端之间交换数据的方式。有两种类型的消息︰

    • 请求(Request)–由客户端发送用来触发一个服务器上的动作。
    • 响应(Response)–来自服务器的应答。

3.1 请求(Request)

客户端发送一个HTTP请求到服务器的请求消息格式为:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。

前端之HTTP协议

  • 请求行(request line):请求行用来说明请求类型,要访问的资源以及所使用的HTTP版本。
  • 请求头部(header):从第二行起为请求头部,紧接着请求行(即第一行)之后,用来说明服务器要使用的附加信。
  • 空行:空行,请求头部后面的空行是必须的。即使第四部分的请求数据为空,也必须有空行。
  • 请求数据(from data):请求数据也叫主体,可以添加任意的其他数据。

3.2 响应(Response)

服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息Response。HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
前端之HTTP协议

  • 状态行:状态行由HTTP协议版本号, 状态码, 状态消息 三部分组成。
  • 消息报头:消息报头用来说明客户端要使用的一些附加信息。
  • 空行:消息报头后面的空行是必须的。
  • 响应正文:相应正文服务器返回给客户端的文本信息。

4. HTTP请求方法

请求方法 说明
GET GET方法请求一个指定资源的表示形式. 使用GET的请求应该只被用于获取数据
POST POST方法用于将实体提交到指定的资源,通常导致状态或服务器上的副作用的更改
PUT PUT方法用请求有效载荷替换目标资源的所有当前表示
PATCH PATCH方法用于对资源应用部分修改
DELETE DELETE方法删除指定的资源
HEAD HEAD方法请求一个与GET请求的响应相同的响应,但没有响应体
OPTIONS OPTIONS方法用于描述目标资源的通信选项
TRACE TRACE方法沿着到目标资源的路径执行一个消息环回测试
CONNECT CONNECT方法建立一个到由目标资源标识的服务器的隧道

5.HTTP状态码

  • 状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
    • 1xx:临时相应–表示请求已接收,继续处理;
    • 2xx:成功–表示请求已被成功接收、理解、接受;
    • 3xx:重定向–要完成请求必须进行更进一步的操作;
    • 4xx:客户端错误–请求有语法错误或请求无法实现;
    • 5xx:服务器端错误–服务器未能实现合法的请求。

6. Get和Post的区别

  • 参数的组织方式不同:
    • GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,且使用GET请求时没有请求数据(主体)。
    • POST方法是把提交的数据放在HTTP包的Body中。
  • 传输数据大小限制:
    • GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
  • 安全性:
    • POST的安全性要比GET的安全性高。

7. HTTPS

  • HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。

  • HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

  • HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全,为了保证这些隐私数据能加密传输,于是网景公司设计了SSL(Secure Sockets Layer)协议用于对HTTP协议传输的数据进行加密,从而就诞生了HTTPS。

    • 简单来说,HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。

    • 具体来说,就是当客户端发送请求消息时,会先在SSL层加密,而服务器接收加密文件时,会在SSL层解密,然后得到请求明文,再对请求进行处理。

      而当服务器发送响应消息时,会先在SSL层进行加密,然后再发送给客户端,当客户端接收加密文件时,要先在SSL层进行解密,才能得到响应明文,并解析相应内容。

  • HTTP与HTTPS的主要区别如下:

    • HTTPS协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
    • HTTP是超文本传输协议,信息是明文传输,HTTP则是具有安全性的ssl加密传输协议。
    • HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
    • HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。

8. HTTP协议完整工作流程

  • HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。以下是 HTTP 请求/响应的步骤:
    • 客户端连接到Web服务器;
    • 发送HTTP请求;
    • 服务器接受请求并返回HTTP响应;
    • 释放TCP连接;
    • 客户端浏览器解析HTML内容。