HTTP协议知识

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。 HTTP/0.9:1991 年发布, 已过时。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由

目录
  1. 历史
  2. 工作原理
    1. 请求和响应步骤:
  3. 特点
  4. 请求和响应报文
  5. 请求方法
    1. GET 和 POST 的区别
  6. 响应状态码
    1. 常见状态码
  7. 持久连接
  8. 管道机制

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。

历史#

  • HTTP/0.9:1991 年发布, 已过时。只接受 GET 一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持 POST 方法,所以客户端无法向服务器传递太多信息。

  • HTTP/1.0:1996 年 5 月发布, 这是第一个在通讯中指定版本号的 HTTP 协议版本,至今仍被广泛采用,特别是在代理服务器中。

  • HTTP/1.1:1997 年 1 月发布,只比 1.0 版本晚了半年,当前主流版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。

  • HTTP/2.0:2015 年 5 月发布,页面更快更持久。

工作原理#

客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。

服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。

请求和响应步骤:#

  1. 客户端连接到 Web 服务器: 一个 HTTP 客户端,通常是浏览器,与 Web 服务器的 HTTP 端口(默认为 80)建立一个 TCP 套接字连接。例如:http://www.baidu.com
  2. 发送 HTTP 请求:通过 TCP 套接字,客户端向 Web 服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据 4 部分组成。
  3. 服务器接受请求并返回 HTTP 响应:Web 服务器解析请求,定位请求资源。服务器将资源复本写到 TCP 套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据 4 部分组成。
  4. 释放连接 TCP 连接: 若 connection 模式为 close,则服务器主动关闭 TCP 连接,客户端被动关闭连接,释放 TCP 连接。若 connection 模式为 keep-alive,则该连接会保持一段时间,在该时间内可以继续接收请求;
  5. 客户端浏览器解析 HTML 内容:客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的 HTML 文档和文档的字符集。客户端浏览器读取响应数据 HTML,根据 HTML 的语法对其进行格式化,并在浏览器窗口中显示。

特点#

  1. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。
  2. 灵活:HTTP 允许传输任意类型的数据对象。正在传输的类型由“Content-Type”加以标记。
  3. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  4. 无状态:HTTP 协议是无状态协议。协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。

请求和响应报文#

  • 请求报文
  1. 请求行:例如GET http://www.baidu.com/ HTTP/1.1
  2. 请求头:例如HOST:www.xxx.com/ User-Agent: Mozilla.../ Accept-Language: zh-EN /...
  3. 空行:必须要有,隔开请求头和请求体`
  4. 请求体:请求内容,例如:name=hale&gender=male,内容可以为空

image.png

  • 响应报文
  1. 状态行:例如HTTP/1.1 200 OK
  2. 响应头:例如Server:nginx/ Content-Type: text/html; charset=utf-8/...
  3. 空行:必须要有,隔开响应头和响应体
  4. 响应体:服务器返回的内容
<html>
  <body>
    Hello World
  </body>
</html>

image.png

请求方法#

  1. GET:获取资源(请求指定的页面信息,并返回实体主体)。
  2. POST:传输资源(向指定资源提交数据进行处理请求,数据被包含在请求体中)。
  3. PUT:更新资源(从客户端向服务器传送的数据取代指定的文档的内容)。
  4. DELETE:删除资源(请求服务器删除指定的资源)。
  5. HEAD:获取报文头部(类似于 get 请求,只不过返回的响应中没有具体的内容,用于获取报头)。

GET 和 POST 的区别#

  1. GET 产生的 URL 可以被收藏,而 POST 不可以。
  2. GET 请求只能进行 url 编码,而 POST 支持多种编码。
  3. GET 请求会被浏览器主动缓存,而 POST 不会,除非手动设置。
  4. GET 请求参数会被完整保留在浏览器历史记录里,而 POST 中的参数不会被保留。
  5. GET 参数通过 URL 传递, 而 POST 放在请求体中。
  6. GET 比 POST 更不安全,因为他的参数直接暴露在 URL 上, 所以不能用来传递敏感信息。

响应状态码#

  • 1xx:信息,服务器收到请求,需要请求者继续执行操作。
  • 2xx:成功,操作被成功接收并处理。
  • 3xx:重定向,需要进一步的操作以完成请求。
  • 4xx:客户端错误,请求包含语法错误或无法完成请求。
  • 5xx:服务器错误,服务器在处理请求的过程中发生了错误。

常见状态码#

  • 200 OK :请求成功。
  • 206 Partial Content:部分内容。服务器成功处理了部分 GET 请求。
  • 301 Moved Permanently:永久移动。请求的资源已被永久的移动到新 URI,返回信息会包括新的 URI,浏览器会自动定向到新 URI。
  • 302 Found:临时移动。与 301 类似,但资源只是临时被移动。客户端应继续使用原有 URI。
  • 304 Not Modified:未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。
  • 305 Use Proxy:使用代理。所请求的资源必须通过代理访问。
  • 400 Bad Request:客户端请求的语法错误,服务器无法理解。
  • 401 Unauthorized:请求要求用户的身份认证。
  • 403 Forbidden:服务器理解请求客户端的请求,但是拒绝执行此请求。
  • 404 Not Found:服务器无法根据客户端的请求找到资源(网页)。
  • 500 Internal Server Error:服务器内部错误,无法完成请求。
  • 503 Service Unavailable:由于超载或系统维护,服务器暂时的无法处理客户端的请求。
  • 504 Gateway Timeout:网关超时。

持久连接#

HTTP 1.1 引入持久连接(persistent connection), 即 TCP 连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive

当使用 keep-alive 时,客户端到服务端的连接持续有效。当出现对服务器的后继请求时,keep-alive 功能避免了建立和重新建立连接。

管道机制#

HTTP 1.1 还引入了管道机制(pipelining),即在同一个 TCP 连接里面,客户端可以同时发送多个请求。这样就进一步改进了 HTTP 协议的效率。

举例来说,客户端需要请求两个资源。

以前的做法是,在同一个 TCP 连接里面,先发送 A 请求,然后等待服务器做出回应,收到后再发出 B 请求。

请求 A -> 响应 A -> 请求 B -> 响应 B

管道机制则是允许浏览器同时发出 A 请求和 B 请求,但是服务器还是按照顺序,先回应 A 请求,完成后再回应 B 请求。

请求 A -> 请求 B -> 响应 A -> 响应 B

注意:初次创建连接时,不应该启动管线机制,因为服务器不一定支持 HTTP 1.1 协议。