http

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
    9
    GET 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
    13
    HTTP/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 服务器暂时处于超负荷或正在停机维护,现在无法处理