超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用层最为广泛的一种网络协议。
发展史
协议 | 发展 | 说明 |
---|---|---|
HTTP/0.9 | 1991年定稿最早的HTTP协议,没有作为正式标准 | 只有GET命令;没有请求头、请求体、返回头;服务器只能读取HTML文件以ASCII字符流返回给客户端;默认80端口 |
HTTP/1.0 | 1996年发布,正式作为标准 | 引入了POST、HEAD等命令、请求头、响应头、状态码;提供了缓存、多字符集支持、multi-part、authorization、内容编码等;默认不是持久连接 |
HTTP/1.1 | 1997年发布,2015年前使用最广 | 默认持久连接不必声明keep-alive;引入pipelining管道机制,同一TCP连接里同时发送多个请求,但服务器需按照请求顺序串行返回响应;请求头新增Host,使同一台物理服务器可以同时部署多个web服务 |
HTTPS | 互联网巨头大力推行 | 在传统HTTP协议的TCP与HTTP之间加入一层SSL/TLS;通过混合加密、摘要算法、数字证书来保证安全性;使用443端口 |
SPDY | 2009年由Google公开,不是标准已逐渐被HTTP/2取代 | 基于TLS,在HTTPS的SSL层与HTTP层之间增加一层SPDY层;支持多路复用,可在同一TCP连接并发处理多个HTTP请求;可以赋予请求的优先级顺序;支持请求头和响应头压缩;支持服务器向客户端主动推送、提示 |
HTTP/2 | 2015年发布,逐步覆盖市场 | 基于SPDY的标准化协议,可在TCP上使用不是必须在TLS上;HTTPS连接时使用了NPN的规范版ALPN;消息头的压缩算法采用新算法HPACK,而SPDY采用DEFLATE;依然没有解决TCP对头阻塞问题 |
QUIC/HTTP3 | 2012由Google提出,2015年提交给IETF,下一代互联网标准传输协议 | 不再是基于TCP而是通过UDP;使用 stream 进一步扩展了 HTTP/2 的多路复用;引入 Connection ID,使得 HTTP/3 支持连接迁移以及 NAT 的重绑定;含有一个包括验证、加密、数据及负载的 built-in 的TLS安全机制;将拥塞控制移出了内核,通过用户空间来实现;头部压缩更换成了兼容 HPACK的QPACK压缩方案 |
状态码
状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,共分为5种类型:
分类 | 说明 |
---|---|
1** | 表示请求已被接受,需要继续处理的临时响应 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
方法
方法的名称区分大小写,并且通常是一个简短的单词,由英文大写字母组成。
接收请求时,服务器尝试确定请求的方法,如果失败,则返回带有代码 501
和短语的响应消息 Not Implemented
。
方法 | 说明 | 1.0、1.1中支持的协议版本 |
---|---|---|
GET | 获取资源 | 1.0、1.1 |
POST | 传输实体主体 | 1.0、1.1 |
PUT | 传输文件 | 1.0、1.1 |
HEAD | 获得报文首部 | 1.0、1.1 |
DELETE | 删除资源 | 1.0、1.1 |
OPTIONS | 删除资源 | 1.0、1.1 |
TRACE | 追踪路径 | 1.1 |
CONNECT | 将服务器作为代理,让服务器代替用户去访问 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
首部
http首部主要分为五大部分:
- 通用首部:各种类型的报文(请求、响应报文)都可以使用,提供有关报文最基本的信息。
- 请求首部:专用于请求报文的首部,用于给服务器提供相关信息,告诉服务器客户端的期望和能力。
- 响应首部:专用于响应报文的首部,用于告诉客户端是谁在响应以及响应者的能力。
- 实体首部:用于描述http报文的负荷(主体),提供了有关实体及其内容的相关信息。
- 扩展首部:非标准首部,由应用开发者定义的首部。
(以下整理的首部并非完全按照这五类划分,部分扩展首部也按照功能划入了请求首部、响应首部等部分)
通用首部
字段名 | 说明 | 示例 |
---|---|---|
Cache-Control | 控制缓存的行为 | Cache-Control: no-cache |
Connection | 逐跳首部、连接的管理(HTTP/1.1默认持久连接) | Connection: close |
Date | 创建报文的日期时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT |
Pragma | HTTP/1.1之前版本的历史遗留字段,用来包含实现特定的指令 | Pragma: no-cache |
Trailer | 说明传输中分块编码的编码信息 | Trailer: Max-Forwards |
Transfer-Encoding | 逐跳首部,指定传输报文主体时使用的编码方式 | Transfer-Encoding: chunked |
Upgrade | 升级为其他协议 | Upgrade: HTTP/2.0, SHTTP/1.3, IRC |