HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等
主要特点:
- 简单快速
- 灵活(不同数据传输)
- 无连接(不保持连接)
- 无状态(无法区分请求属于谁)
报文组成
- 请求报文
客户端发送一个HTTP请求到服务器的请求消息内容包括:- 请求行(方法,页面地址、http协议、版本)
- 请求头
- 空行
- 请求体
- 响应报文
服务器响应消息内容:- 状态行
- 响应头
- 空行
- 响应体
http请求方法
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
方法介绍
- GET 请求指定的页面信息,并返回实体主体
- POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
- HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
- PUT 从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE 请求服务器删除指定的页面。
- CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS 允许客户端查看服务器的性能。
- TRACE 回显服务器收到的请求,主要用于测试或诊断。
POST、GET区别
- 回退时Get无害、Post会再次提交
- Get产生url地址可收藏、 Post不可
- Get请求会被主动缓存、Post请求不会(可收到设置)
- Get请求参数会被完整保留到浏览器历史记录里、Post参数不会被保留
- Get请求url参数有长度限制、Post没有
- Get通过url传参,Post参数放在request Body中
本质上都是基于tcp/ip
- get header data 放在一起发生tcp数据包
- post 发送两次数据包 header 服务器返回100continue dat 服务器返回200成功
http状态码
- 1xx 指示信息
- 2xx 成功
- 200 成功
- 206 range头请求,服务器完成了(请求大视音频)
- 3xx 重定向
- 301 页面转移url
- 302 临时转移url
- 304 客户端有缓存文件可用
- 4xx 客户端错误
- 400 客户端语法错误
- 401 请求未授权
- 403 请求被禁止
- 404 资源未找到
- 5xx 服务端错误
- 500 服务器错误、原来缓存文件可以继续使用
- 503 请求未完成
http持久连接
http请求是每次请求响应就建立一次连接然后断开;持久化即建立一次连接后可以接受多个http请求/响应
- 仅http1.1版本支持
http管线化
多个请求打包 、响应打包
- 通过持久连接完成,所以仅http/1.1支持
- GET HEAD请求可以管线化
- POST管线化有限制
- 初次创建连接时不应启动管线机制,服务端不一定支持http/1.1
http2.0
特点
- 二进制格式
把原来的“Header+Body”的消息“打散”为数个小片的二进制“帧”(Frame),用“HEADERS”帧存放头数据、“DATA”帧存放实体数据。数据分帧
后“Header+Body”的报文结构就完全消失了,协议看到的只是一个个的“碎片”。 - 多路复用-多个往返通信都复用一个连接来处理
消息的“碎片”到达目的地后应该怎么组装起来呢?HTTP/2为此定义了一个“流”(Stream)的概念,它是二进制帧的双向传输序列,同一个消息往返的帧会分配一个唯一的流ID。这些数据帧按照次序组装起来就是HTTP/1里的请求报文和响应报文。因为“流”是虚拟的,实际上并不存在,所以HTTP/2就可以在一个TCP连接上用“流”同时发送多个“碎片化”的消息,这就是常说的多路复用
( Multiplexing) - header压缩 通讯双方各自cache一份header fields表
在客戶端和服务器两端建立“字典”,用索引号表示重复的字符串,还釆用哈夫曼编码来压缩整数和字符串,可以达到50%~90%的高压缩率。 - 服务端推送
服务端可以新建“流”主动向客戶端发送消息。比如,在浏览器刚请求HTML的时候就提前把可能会用到的JS、CSS文 件发给客戶端,减少等待的延迟,这被称为“服务器推送”(Server Push,也叫Cache Push)。
建立连接
- http请求时
与 WebSocket 协议 [RFC 6455] 类似, HTTP/2 使用 Upgrade 的头部字段来探测对方是否支持 HTTP/2 协议GET / HTTP/1.1 Host: server.example.com Connection: Upgrade, HTTP2-Settings Upgrade: h2c HTTP2-Settings: <base64url encoding of HTTP/2 SETTINGS payload>
- https请求时
双方在 TLS 握手阶段, 通过 ALPN 拓展字段已经协商好了双方使用的应用层协议, 因此当 TLS 握手完成后便可以进行 HTTP/2 的通信交互