概述
HTTP,超文本传输协议,HyperText Transfer Protocol
HTTP 1.0 1.1 2.0 对比
HTTP/1.0
浏览器与服务器只保持短暂的连接,每次请求都需要重新建立 TCP 连接,连接无法复用。
队头阻塞(head of line blocking),即前面阻塞的请求会影响后面的请求。
HTTP/1.1
-
持久连接:TCP 连接默认不关闭,多个请求复用,header 里面的 connection : Keep-Alive
-
管道机制:同一个 TCP 连接可以同时发送多个请求,但是也有限制
-
引入更多的缓存策略:Cache-Control、Etag/If-None-Match 等
-
范围请求:增加 header 增加 range 标记,返回码是 206(Partial Content)时可选择继续请求
-
Header 增加 Host:将请求发往同一服务器上面不同网站,虚拟主机的应用
-
新增请求方式:PUT,DELETE,OPTIONS,TRACE,CONNECT
缺点: 队头阻塞,服务器只能按次序处理请求
HTTP 2.0
以 Google 2005 年发布的 SPDY 为基础,只基于 HTTPS 环境。
- 多路复用
HTTP/1.1 协议中的客户端同一时间,同一域名请求有数量限制;HTTP/2 把通信单位缩小为帧,在同一个 TCP 连接上面双向交换消息。每个 request 都有 id 值对应
- 二进制分帧
在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层
在二进制分帧层中, HTTP/2 会将所有传输的信息分割为更小的消息和帧(frame),并对它们采用二进制格式的编码 ,其中 HTTP1.x 的首部信息会被封装到 HEADER frame,而相应的 Request Body 则封装到 DATA frame 里面
单连接 多资源的方式,基于 TCP 慢启动的特性,共用同一个连接可以有效使用 TCP 连接,吞吐量更大
- 首部压缩(Header Compression)
HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,以后就不发送同样字段了,只发送索引号,这样就提高速度
- 服务端推送
在 HTTP/2 中,服务器可以对客户端的一个请求发送多个响应
请求方式
GET,一般用于获取数据,幂等、可缓存
POST,一般用于提交数据,不幂等
GET 和 POST 到底有什么区别? - 大宽宽的回答 - 知乎
https://www.zhihu.com/question/28586791/answer/767316172
状态码
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
- 301,Moved Permanently,请求的资源已被永久的移动到新 URI,返回信息会包括新的 URI,浏览器会自动定向到新 URI。
- 302,Found,临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
报文格式
请求报文
- 请求行
- 请求方法:GET POST 等
- URL
- 协议版本
- 请求头部:多个 key-value 值组成
- User-Agent:产生请求的浏览器类型
- Accept:客户端可识别的内容类型列表
- Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
- 空行:将请求头部和请求数据分隔
- 请求数据:GET 方法没有携带数据,POST 会带一个 body
响应报文 - 状态行
- 协议版本:HTTP-Version 服务器HTTP协议的版本
- 状态码:Status-Code 响应状态代码
- 状态值:Reason-Phrase表示状态代码的文本描述
- 响应头
- 空行
- 响应体:响应数据
与 WebSocket 的联系与区别
在 WebSocket 出来之前,HTTP 协议是一个 请求-响应 的模式,如果需要实时与服务器进行通信,使用的是 js 脚本进行轮询,但是这样效率太慢。
WebSocket 是 HTML5 规范提出的协议,支持页面使用 Web Socket 协议与远程主机进行全双工通信,能够很好的节省服务器资源与带宽。
使用 ws:// wss:// 分别表示 WebSocket 和 安全的 WebSocket 连接。
几乎所有的实时应用程序都是用 WebSocket
相同点:
- 都是基于 TCP,可靠传输
- 都是应用层协议
差异:
-
WebSocket 是双向通信协议,可以双向发送或接收信息。HTTP 是单向的
-
WebSocket 需要浏览器与服务器握手建立连接(建立连接通过 HTTP,发送数据不需要),并且服务器可以主动向浏览器发送数据,可以不带有 head 部分信息。而 HTTP 是浏览器发起向服务器的连接,服务器预先不知道。
-
WebSocket 建立连接之后不会断开,除非其中一方主动关闭。