HTTP 协议介绍

211 阅读5分钟

http 协议是超文本传输协议(HyperText Transfer Protocol)的缩写,是用于从WWW服务器请求数据所使用的一种协议。

HTTP协议具有以下4个特点

  1. 简单快捷: 是指如果我们想访问一个资源,那么直接输入资源所对应的URI(统一资源标识符)即可,方便快捷
  2. 灵活: 是指在每个http请求中,它都有一个数据类型(Content-Type),并且它支持多种数据类型,通过一个http协议就可以完成不同类型的数据传输
  3. 无连接: 是指每次请求都会建立一次连接,请求结束后就会断掉这个连接,不会保持。
  4. 无状态:HTTP协议是无状态的,不会记录每次连接的状态,所以单从http协议上是无法区分后续连接和之前的连接之间的关系,那么要想获取之间的关系,就要借助其他手段来满足,单从http协议的无状态的特点上,是无法区分的。

HTTP报文的组成部分

由2部分组成:请求报文 和 响应报文

请求报文分为4部分:

  1. 请求行:3部分组成 请求方法+URI+协议版本
  2. 请求头:比如我们常见的Request Headers中的那一部分数据,Host,Accept,User-Agent,Accept-Encoding等
  3. 空行:紧跟在请求头后面的一个空行,是为来分割请求头和请求体的
  4. 请求体: 我们自定义的一些传输数据

响应报文分为以下4部分组成:

  1. 响应行: 协议版本+状态码+状态码对应的描述
  2. 响应头: 比如常见的Response Headers中的数据,包括Conten-Type,Content-Length等
  3. 空行:紧跟在响应头后面的一个空行,为来分割响应头和响应题
  4. 响应体:这个是服务器返回过来的的东西,具体是什么要看服务器返回的是什么

HTTP协议所支持的方法

  1. GET - 获取资源
  2. POST - 传输资源
  3. PUT - 更新资源
  4. DELETE - 删除资源
  5. HEAD - 获取报文的首部

虽然HTTP支持上面的这5种方法,但现实工作中我们比较常用的只有GET和POST,其余的几个都不常用到。

GET 和 POST的 区别

  1. GET在浏览器回退的时候不会重复提交,但是POST 会重复提交。
  2. GET请求会被浏览器主动缓存,POST不会。
  3. GET的参数会被保留在浏览器的历史记录中,而POST中的参数不会保留。
  4. GET的请求长度是有限制的,POST没有限制,GET太长,会被浏览器截断,如果被截断的话,服务器端获取到的数据就会不完整。
  5. GET参数是暴露在URL上的,所以敏感信息不能传递敏感信息。
  6. GET参数是通过URL传递的,POST是RequestBody中。

HTTP状态码

  1. 1XX: 指示信息 - 表明请求已经接收,继续处理
  2. 2XX: 成功 - 表示请求已被成功接收
  3. 3XX: 重定向 - 要完成请求必须要进行更进一步的才行
  4. 4XX:客户端错误 - 请求有语法错误或者请求无法时间
  5. 5XX: 服务器错误 - 服务器未能实现合法的请求

比较常见的状态码

  1. 200:客户端请求成功
  2. 206:客户端发送了一个带有Range头的GET请求,服务器完成了它
  3. 301:永久重定向,所请求的页面已经转移到新的url
  4. 302: 临时重定向,所请求的也没已经临时转移到新的url
  5. 304: 资源为更改,客户端有缓存的文档并发出来一个条件性的请求,服务器告诉客户端,所请求的文件未修改,可以使用原来的缓存数据
  6. 400: 客户端请求存在语法错误,不能服务器端所理解
  7. 401: 请求未经授权
  8. 403: 请求的页面被禁止,权限不够
  9. 404: 请求的资源不存在
  10. 500: 服务器故障
  11. 503: 服务器处于超负载或正在停机维护

持久连接

HTTP 协议采用请求-应答的模式,即非Keep-Alive模式,每次请求客户端都要和读武器端重新建立一次连接,完成之后就断开这个连接(HTTP协议为无连接的协议)

当使用Keep-Alive模式时,就可以重复利用连接,不是每次请求都重新建立连接,而是连接可以重复利用

HTTP是支持持久连接的,这个连接是HTTP1.1开始的才支持的

管线化

在持久连接的情况下,某个连接上消息的传递类似于

请求1 -> 响应1 -> 请求2 -> 响应2 -> 请求3 -> 响应3

管线化的是指,把多个的请求一次打包,服务器端一次返回

请求1-> 请求2 -> 请求3 -> 响应1 -> 响应2 -> 响应3

管线化的特点

  1. 管线化机制是通过持久连接来完成,只有http1.1支持这个技术
  2. 只有GET和HEAD请求可以进行管线化,POST会有所限制
  3. 初次连接时不应该启动管线化,因为服务器不一定支持
  4. 管线化不会影响响应的到来顺序
  5. HTTP1.1要求服务器端支持管线化,但并不要求服务器端也对响应进行管线化处理,只是要求对于管线化的请求不失败就行
  6. 由于上面提到的服务端的问题,开启管线化很可能并不会带来性能的大幅度的提升,而且很多服务器和代理程序对管线话的支持并不是很好,因此现代浏览器Chrome和Firefox默认并未开启管线化的支持