定义
HTTP 协议是超文本传输协议
协议历史
HTTP 0.9 => HTTP 1.0 => HTTP 1.1 => HTTP 2.0 => HTTP 3.0
HTTP 0.9
- 只能支持 get 请求, 由于不支持其他请求方式, 所以不能向服务端传输太多信息
- 没有请求头概念, 服务端也只能返回 html 字符串
- 服务端响应后, 会自己断开连接
HTTP 1.0
增加项:
- 增加了 get, post 等请求方式
- 增加了请求头(request Header), 响应头(response Header)等概念
- 传输的数据不仅限于文本(增加了视频, 音频, 图片, 二进制等格式)
http 1.0 请求头 及响应头
// 请求头
GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
Accept: */*
// 响应头
HTTP/1.0 200 OK
Content-Type: text/plain
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
// 这是一个空行
...数据内容
缺陷:
- 无状态: 服务器不跟踪不记录请求过的状态: 可以借助 cookie/session 机制做身份认证和状态记录
- 无连接:
- 无法复用连接, 每次都需要进行三次握手, 四次挥手, 浪费网络资源
- 队头阻塞: HTTP1.0 规定, 在前一个响应完成后, 下一次请求才能发出, 如果前一个阻塞, 后面的请求也阻塞了
HTTP 1.1
增加项
- 新增 connection 字段, 设置为 keep-alive, 一次请求完成后, tcp 连接不会断开;
- 增加了 delete, put 等请求方式;
- 请求管道化, 请求可以同时发出;
- 增加缓存字段, cache-control;
- 断点续传, 允许相应数据分块传输, 利于大文件传输
管道化传输方式
请求1 --> 请求2 --> 请求3 > 响应1 --> 响应2 --> 响应3
- 虽然发送请求时不会阻塞, 但是响应时, 依旧是按顺序返回, 无法解决队头阻塞问题
HTTP 2
增加项
- 二进制分帧
- HTTP1.x 的解析都是基于文本, HTTP 2 之后把所有的消息分成了更小的消息和帧, 采用二进制格式, 提高传输效率
- 多路复用
- 所有的请求和响应, 共享同一个 TCP 连接, 每一个连接都有一个独立的标识, 基于二进制分帧, 所有的请求乱序发送, 服务端根据标识和首部将消息重新组装起来
- 首部压缩
- 由于 HTTP 是无状态的, 每次发送请求都要携带首部字段, 造成大量的资源浪费. HTTP2 使用 encoder 来减少传输的大小, 通讯双方各自维护一份首部字典, 进行差量更新
- 服务端推送
- 服务端可以推送消息给客户端
HTTP 常见状态码
1XX 表示通知信息, 如请求收到了或正在处理中, 需要请求者继续执行操作 2xx 表示成功,如接受或知道了。 3xx 表示重定向,表示要完成请求还必须采取进一步的行动。 4xx 表示客户的差错,如请求中有错误的语法或不能完成。 5xx 表示服务器的差错,如服务器失效无法完成请求。
204
- 请求受理但是没有资源返回
206
- 请求已成功, 并且包含所请求的数据范围
301
- 永久重定向
302
- 临时重定向
304 not Modified
- 协商缓存状态码, 请求头 if-none-match/响应头 etag, 请求头 if-modified-since/响应头 last-modified
401 Unauthorized
- 用户认证信息缺失或不正确
403 Forbidden
- 服务器理解请求, 但是没有权限
500 Internal Server Error
- 服务端内部错误
502 Bad Gateway
- 代理服务器无法获取到合法响应
503 Service Unavailable
- 服务器资源尚未准备好处理当前请求