在我们日常使用中,会访问网页,而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 报文大致可分为报文首部和报文主体两块。两者由最初出现的空行来划分。通常,并不一定要有报文主体。
在请求的报文首部,主要包括请求行、请求首部字段、通用首部字段、实体首部字段和其他。而在响应保卫的首部,主要包含状态行、响应首部字段、通用首部字段、实体首部字段和其他。
- 请求行:包含用于请求的方法,如请求 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=DATE | Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止) |
| 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。