http 协议是超文本传输协议(HyperText Transfer Protocol)的缩写,是用于从WWW服务器请求数据所使用的一种协议。
HTTP协议具有以下4个特点
- 简单快捷: 是指如果我们想访问一个资源,那么直接输入资源所对应的URI(统一资源标识符)即可,方便快捷
- 灵活: 是指在每个http请求中,它都有一个数据类型(Content-Type),并且它支持多种数据类型,通过一个http协议就可以完成不同类型的数据传输
- 无连接: 是指每次请求都会建立一次连接,请求结束后就会断掉这个连接,不会保持。
- 无状态:HTTP协议是无状态的,不会记录每次连接的状态,所以单从http协议上是无法区分后续连接和之前的连接之间的关系,那么要想获取之间的关系,就要借助其他手段来满足,单从http协议的无状态的特点上,是无法区分的。
HTTP报文的组成部分
由2部分组成:请求报文 和 响应报文
请求报文分为4部分:
- 请求行:3部分组成 请求方法+URI+协议版本
- 请求头:比如我们常见的Request Headers中的那一部分数据,Host,Accept,User-Agent,Accept-Encoding等
- 空行:紧跟在请求头后面的一个空行,是为来分割请求头和请求体的
- 请求体: 我们自定义的一些传输数据
响应报文分为以下4部分组成:
- 响应行: 协议版本+状态码+状态码对应的描述
- 响应头: 比如常见的Response Headers中的数据,包括Conten-Type,Content-Length等
- 空行:紧跟在响应头后面的一个空行,为来分割响应头和响应题
- 响应体:这个是服务器返回过来的的东西,具体是什么要看服务器返回的是什么
HTTP协议所支持的方法
- GET - 获取资源
- POST - 传输资源
- PUT - 更新资源
- DELETE - 删除资源
- HEAD - 获取报文的首部
虽然HTTP支持上面的这5种方法,但现实工作中我们比较常用的只有GET和POST,其余的几个都不常用到。
GET 和 POST的 区别
- GET在浏览器回退的时候不会重复提交,但是POST 会重复提交。
- GET请求会被浏览器主动缓存,POST不会。
- GET的参数会被保留在浏览器的历史记录中,而POST中的参数不会保留。
- GET的请求长度是有限制的,POST没有限制,GET太长,会被浏览器截断,如果被截断的话,服务器端获取到的数据就会不完整。
- GET参数是暴露在URL上的,所以敏感信息不能传递敏感信息。
- GET参数是通过URL传递的,POST是RequestBody中。
HTTP状态码
- 1XX: 指示信息 - 表明请求已经接收,继续处理
- 2XX: 成功 - 表示请求已被成功接收
- 3XX: 重定向 - 要完成请求必须要进行更进一步的才行
- 4XX:客户端错误 - 请求有语法错误或者请求无法时间
- 5XX: 服务器错误 - 服务器未能实现合法的请求
比较常见的状态码
- 200:客户端请求成功
- 206:客户端发送了一个带有Range头的GET请求,服务器完成了它
- 301:永久重定向,所请求的页面已经转移到新的url
- 302: 临时重定向,所请求的也没已经临时转移到新的url
- 304: 资源为更改,客户端有缓存的文档并发出来一个条件性的请求,服务器告诉客户端,所请求的文件未修改,可以使用原来的缓存数据
- 400: 客户端请求存在语法错误,不能服务器端所理解
- 401: 请求未经授权
- 403: 请求的页面被禁止,权限不够
- 404: 请求的资源不存在
- 500: 服务器故障
- 503: 服务器处于超负载或正在停机维护
持久连接
HTTP 协议采用请求-应答的模式,即非Keep-Alive模式,每次请求客户端都要和读武器端重新建立一次连接,完成之后就断开这个连接(HTTP协议为无连接的协议)
当使用Keep-Alive模式时,就可以重复利用连接,不是每次请求都重新建立连接,而是连接可以重复利用
HTTP是支持持久连接的,这个连接是HTTP1.1开始的才支持的
管线化
在持久连接的情况下,某个连接上消息的传递类似于
请求1 -> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3
管线化的是指,把多个的请求一次打包,服务器端一次返回
请求1-> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3
管线化的特点
- 管线化机制是通过持久连接来完成,只有http1.1支持这个技术
- 只有GET和HEAD请求可以进行管线化,POST会有所限制
- 初次连接时不应该启动管线化,因为服务器不一定支持
- 管线化不会影响响应的到来顺序
- HTTP1.1要求服务器端支持管线化,但并不要求服务器端也对响应进行管线化处理,只是要求对于管线化的请求不失败就行
- 由于上面提到的服务端的问题,开启管线化很可能并不会带来性能的大幅度的提升,而且很多服务器和代理程序对管线话的支持并不是很好,因此现代浏览器Chrome和Firefox默认并未开启管线化的支持