HTTP小记

102 阅读7分钟

在我们日常使用中,会访问网页,而Web浏览器使用 HTTP(HyperText Transfer Protocol,超文本传输协议)作为规范,完成了客户端到服务器端的一系列操作。

HTTP的历史

  • HTTP/0.9:HTTP 于 1990 年问世。那时的 HTTP 并没有作为正式的标准被建立。这时的 HTTP 其实含有 HTTP/1.0 之前版本的意思,因此被称为 HTTP/0.9。这个版本的 HTTP 只有一个请求行。
  • HTTP/1.0:HTTP 正式作为标准被公布是在 1996 年的 5 月,版本被命名为 HTTP/1.0此时的 HTTP 可以携带多种格式的文本(HTML、CSS等)。
  • HTTP/1.1:1997 年 1 月公布的 HTTP/1.1 是目前主流的 HTTP 协议版本。该版本是使用最久的版本。出现了缓存、安全性等策略。
  • HTTP/2.0:该标准于2015年5月以RFC 7540正式发表。使 HTTP 更稳定、快速、可靠了。也支持了服务器端推送等操作。

HTTP报文

用于 HTTP 协议交互的信息被称为 HTTP 报文。客户端的 HTTP 报文叫做请求报文,服务器端的叫做响应报文。HTTP 报文本身是由多行数据构成的字符串文本。

HTTP 报文大致可分为报文首部和报文主体两块。两者由最初出现的空行来划分。通常,并不一定要有报文主体。

image.png

在请求的报文首部,主要包括请求行、请求首部字段、通用首部字段、实体首部字段和其他。而在响应保卫的首部,主要包含状态行、响应首部字段、通用首部字段、实体首部字段和其他。

  • 请求行:包含用于请求的方法,如请求 URI 和 HTTP 版本。
  • 状态行:表示响应结果的状态码,原因短语和 HTTP 版本。
  • 首部字段:包含了请求和响应的各种条件和属性的各类字段。
  • 其他:包含了 HTTP 标准中未定义的首部(Cookie等)。

常见的 HTTP 首部

通用首部字段

  • Cache-Control:控制缓存的行为
  • Connection:逐跳首部、连接的管理

请求首部字段

  • Accept:用户代理可处理的媒体类型
  • Accept-Charset:优先的字符集
  • Accept-Encoding:优先的内容编码
  • Accept-Language:优先的语言(自然语言)
  • Authorization:Web 认证信息
  • Host:请求资源所在服务器
  • If-Match:比较实体标记(ETag)
  • If-Modified-Since:比较资源的更新时间
  • If-None-Match:比较实体标记(与If-Match相反)
  • If-Range:资源未更新时发送实体Byte的范围请求
  • If-Unmodified-Since:比较资源的更新时间(与If-Modified-Since相反)
  • Range:实体的字节范围请求
  • Referer:对请求中URI的原始获取方
  • User-Agent:HTTP客户端程序的信息

响应首部字段

  • Accept-Ranges:是否接受字节范围请求
  • Age:推算资源创建经过时间
  • ETag:资源的匹配信息
  • Location:令客户端重定向至指定 URI

实体首部字段

  • Allow:资源可支持的 HTTP 方法
  • Content-Encoding:实体主体适用的编码方式
  • Content-Language:实体主体的自然语言
  • Content-Length:实体主体的大小(单位 :字节)
  • Content-Location:替代对应资源的URI
  • Content-MD5:实体主体的报文摘要
  • Content-Range:实体主体的位置范围
  • Content-Type:实体主体的媒体类型
  • Expires:实体主体过期的日期时间
  • Last-Modified:资源的最后修改日期时间

Cookie 首部字段

HTTP是无状态的协议,如果要记录服务器和客户端之间的状态,那么服务器端可以通过 Set-Cookie 字段,来向客户端设置状态管理所使用的Cookie信息。客户端可以通过 Cookie 字段传递给服务器状态信息。

属性名说明
NAME=VALUE赋予 Cookie 的名称和其值(必需项)
expires=DATECookie 的有效期(若不明确指定则默认为浏览器关闭前为止)
path=PATH将服务器上的文件目录作为 Cookie 的适用对象(若不指定则默认为文档所在的文件目录)
domain=域名作为Cookie适用对象的域名 (若不指定则默认为创建 Cookie 的服务器的域名)
Secure仅在 HTTPS 安全通信时才会发送 Cookie
HttpOnly加以限制,使 Cookie 不能被 JavaScript 脚本访问

HTTP状态码

HTTP 状态码由 3 位数字组成。

  • 1XX:信息性状态码,表示接收的请求正在处理;
  • 2XX:成功状态码:请求正常处理完毕;
  • 3XX:重定向状态码:需要进行附加操作以完成请求;
  • 4XX:客户端错误状态码:服务器无法处理请求,如客户端URI、参数不正确;
  • 5XX:服务器端错误状态码:服务器处理请求错误。

2XX

2XX 的响应结果表明请求被正常处理了。

  • 200:OK,请求被正确地处理了,对应的请求资源会被返回;
  • 204:No content,请求被正确地处理了,但没有响应体;
  • 206:Partial Content,该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求。响应报文中包含由 Content-Range 指定范围的实体内容。

3XX

3XX 响应结果表明浏览器需要执行某些特殊的处理以正确处理请求。

  • 301:Moved Permanently,永久性重定向。该状态码表示请求的资源已被分配了新的 URI,以后应使用资源现在所指的 URI。
  • 302:Found,临时性重定向。该状态码表示请求的资源已被分配了新的 URI,希望用户(本次)能使用新的 URI 访问。
  • 303:See Other,该状态码表示由于请求对应的资源存在着另一个 URI,应使用 GET 方法定向获取请求的资源。303 状态码和 302 Found 状态码有着相同的功能,但 303 状态码明确表示客户端应当采用 GET 方法获取资源,这点与 302 状态码有区别。
  • 304:Not Modified,该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但因发生请求未满足条件的情况后,直接返回 304(服务器端资源未改变,可直接使用客户端未过期的缓存)。

4XX

4XX 的响应结果表明客户端是发生错误的原因所在。

  • 400:Bad Request,错误请求。该状态码表示请求报文中存在语法错误。另外,浏览器会像 200 一样对待该状态码。
  • 401:Unauthorized,该状态码表示发送的请求需要有通过 HTTP 的认证信息。
  • 403:Forbidden,该状态码表明对请求资源的访问被服务器拒绝了。
  • 404:Not Found,该状态码表明服务器上无法找到请求的资源。

HTTPS

到现在为止,我们已了解到 HTTP 具有相当优秀和方便的一面,然而 HTTP 并非只有好的一面,事物皆具两面性,它也是有不足之处的。

HTTP 主要有这些不足,例举如下:

  • 通信使用明文(不加密),内容可能会被窃听
  • 不验证通信方的身份,因此有可能遭遇伪装
  • 无法证明报文的完整性,所以有可能已遭篡改

HTTP 协议中没有加密机制,但可以通过和 SSL(Secure Socket Layer,安全套接层)或 TLS(Transport Layer Security,安全传输层协议)的组合使用,加密 HTTP 的通信内容。

用 SSL 建立安全通信线路之后,就可以在这条线路上进行 HTTP 通信了。与 SSL 组合使用的 HTTP 被称为 HTTPS(HTTP Secure,超文本传输安全协议)或 HTTP over SSL。

image.png