HTTP 协议(HyperText Transfer Protocol,超文本传输协议)是客户端请求服务器资源的一种通信规范。通常是以 Web 浏览器作为客户端请求互联网上各种各样的服务器资源。
URI 统一资源标识符
HTTP 协议是通过 URI 定位到互联网上的资源的。正是因为 URI 的特定功能,在互联网上任意位置的资源都能访问到。
URI 是 Uniform Resource Identifier 的缩写。通过使用某种协议类型表示资源的标识符。这里 URI 用字符串标识某一互联网资源,而 URL(Uniform Resource Locator,统一资源定位符)表示资源的地点,也就是说,不仅能标识某一互联网资源,而且还告诉你通过 URL 能访问到该资源。可见 URL 是 URI 的子集。
URI 格式,包括协议方案名、登陆信息(可选)、服务器地址、服务器端口号(缺省使用默认值)、带层次的文件路径、查询字符串(可选)、片段标识符(可选)。例如:1
http://user:pass@www.baidu.com:80/path/to/index.html?uid=1#ch1
HTTP 报文
用于 HTTP 协议交互的信息被称为 HTTP 报文。请求端(客户端)的 HTTP 报文叫请求报文,响应端(服务器端)的叫响应报文。HTTP 报文本身是由多行数据构成的字符串文本,大致可分为报文首部和报文主体。报文首部在 HTTP 协议进行通信过程中起到传递额外重要信息的作用。
这里又可以将首部字段分为 4 种类型:
- 通用首部字段:请求报文和响应报文两方都会使用的首部
- 请求首部字段:从客户端向服务器端发送请求报文时使用的首部
- 响应首部字段:从服务器端向客户端返回响应报文时使用的首部
- 实体首部字段:针对请求报文和响应报文的实体部分使用的首部
请求 https://www.baidu.com/img/baidu_jgylogo3.gif
的示例如下:
请求报文首部(请求头)
1
2
3
4
5
6
7
8
9GET https://www.baidu.com/img/baidu_jgylogo3.gif HTTP/1.1
Host: www.baidu.com
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7,zh-TW;q=0.6响应报文首部(响应头)
1
2
3
4
5
6
7
8
9
10
11
12
13HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=315360000
Connection: Keep-Alive
Content-Length: 705
Content-Type: image/gif
Date: Sun, 01 Apr 2018 14:15:07 GMT
Etag: "2c1-4a6473f6030c0"
Expires: Wed, 29 Mar 2028 14:15:07 GMT
Last-Modified: Wed, 22 Jun 2011 06:40:43 GMT
P3p: CP=" OTI DSP COR IVA OUR IND COM "
Server: Apache
Set-Cookie: BAIDUID=8F8D85A445CB4D5A66DD793257DCEE25:FG=1; expires=Mon, 01-Apr-19 14:15:07 GMT; max-age=31536000; path=/; domain=.baidu.com; version=1
常见的首部字段及其含义如下:
- 通用首部字段
首部字段名 | 含义 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
- 请求首部字段(部分)
首部字段名 | 含义 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言(自然语言 ) |
Authorization | Web 认证信息 |
Except | 期望服务器的特定行为 |
Host | 请求资源所在服务器 |
Referer | 对请求中 URI 的原始获取方 |
User-Agent | HTTP 客户端程序的信息 |
- 响应首部字段
首部字段名 | 含义 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过的时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定 URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP 服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
- 实体首部字段
首部字段名 | 含义 |
---|---|
Allow | 资源可支持的 HTTP 方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的 URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期日期时间 |
Last-Modified | 资源最后修改日期时间 |
- 非正式 HTTP/1.1 首部字段
除了在 HTTP/1.1 规范 RFC2616 中定义了 47 种首部字段,还有定义在 RFC4229 中的非正式首部字段,包括使用频率很高的 Cookie、Set-Cookie 和 Content-Disposition。
HTTP状态码
当客户端向服务端发送请求时,服务端返回给客户端的响应报文的首部中包含有状态行,包括 HTTP 版本、状态码、原因短语。其中状态码和原因短语描述了返回结果状态以及出现该状态的原因。总体可分为以下五大类。
状态码 | 类别 | 原因短语 |
---|---|---|
1XX | Informational(信息性状态码) | 接收的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
- 2XX 成功
状态码 | 原因短语 | 说明 |
---|---|---|
200 | OK | 服务端正常处理客户端请求 |
204 | No Content | 服务端正常处理,返回的响应报文中不含实体的主体部分 |
206 | Partial Content | 客户端进行范围请求,服务端正常处理这部分请求 |
- 3XX 重定向
状态码 | 原因短语 | 说明 |
---|---|---|
301 | Moved Permanently | 永久性重定向。请求的资源已被分配新的URI,需用新URI访问 |
302 | Found | 临时性重定向。请求的资源已被分配新的URI,暂时用新URI访问 |
303 | See Other | 请求的资源存在另一个URI,需用GET方法定向请求资源 |
304 | Not Modified | 服务端资源未改变,可直接使用客户端未过期的缓存 |
307 | Temporary Redirect | 临时重定向,和 302 相同 |
- 4XX 客户端错误
状态码 | 原因短语 | 说明 |
---|---|---|
400 | Bad Request | 请求报文中存在语法错误 |
401 | Unauthorized | 认证失败,需要 HTTP 认证信息 |
403 | Forbidden | 服务器拒接请求资源访问 |
404 | Not Found | 服务器上不存在请求的资源 |
- 5XX 服务器错误
状态码 | 原因短语 | 说明 |
---|---|---|
500 | Internal Server Error | 服务器在执行请求时发生错误 |
503 | Service Unavailable | 服务器暂时处于超负荷或正在停机维护,现在无法处理 |