HTTP -- 详解各版本之间的区别

615 阅读3分钟

定义

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

  • 服务器资源尚未准备好处理当前请求