http速记--http概括

106 阅读6分钟

一、是什么

http是超文本传输协议的简称,是万维网上节点间传输数据的一种协议。是基于TCP协议的一种应用层协议。

具有以下特点:

  • 简单:协议只规定了基本请求和响应格式
  • 灵活:可传输任意格式数据,包括但不限于文本、音频、视频、图片等
  • 无连接:每次只处理一个请求,一应一答后就断开了连接
  • 无状态:不对请求和响应之间的状态进行保存,每个请求都是独立的

二、报文

1、请求报文

请求报文包括:

  • 请求行
    • 包括请求方法、地址、http版本
  • 请求头
    • Host一定有,处理请求的服务
  • 请求体

2、响应报文

包括:

  • 状态行
    • 包括:版本、状态码、状态短语
  • 响应头
  • 消息正文

3、请求方法

  • GET
  • POST
  • PUT
  • HEAD
    • 类似get请求,没有响应体
  • DELETE
  • OPTIONS
    • 列出服务器支持的请求方法
  • CONNECT
    • 建立TCP连接
  • TRACE

4、状态码

  • 1**
    • 中间状态
  • 2**
    • 表示服务器成功处理了请求
    • 200
    • 204:请求成功,没有响应体
    • 206:表示只返回了数据的一部分,一般用于分段传输
  • 3**
    • 表示各种重定向
    • 301:永久重定向
    • 302:临时重定向
    • 304:资源缓存重定向
  • 4**
    • 请求错误
    • 403:请求被拒绝
    • 404:资源未找到
  • 5**
    • 服务器错误

三、TCP/IP

TCP是一种可靠的传输协议,能够正确处理数据传输中出现的丢包问题,保证传输包的顺序。

1、四层分层模型

  • 应用层
    • 发送原始数据
  • 传输层
    • 最主要功能就是完成应用层之间的数据交换:
      • 数据分段:将较大的数据切分成小段数据,方便传输
      • 流量控制:控制发送发数据的传输,以免接收方无法及时处理数据
      • 差错控制:检测和纠正传输过程中出现的错误,如:丢包,乱序等
      • 连接管理:建立、维护和终止网络连接
      • 服务质量
    • 对应用层数据添加TCP首部信息
  • 网络层
    • IP协议工作的位置:
      • 数据包的封装
      • 寻址:为每个数据包分配一个唯一的地址,确保数据包能够正确传输
      • 路由选择:选择一条最佳传输路径,确保数据包被快速传输
      • 流量控制:控制发送方的数据传输速度,避免接收方无法及时处理
      • 差错控制:检测和纠正数据传输中的错误,确保数据准确性
    • 对传输层数据添加IP包首部信息
  • 通信链路层
    • 对网络层数据添加以太网包首部
    • 通过物理链路实现数据的传输

2、TCP三次握手

  • 建立连接时,客户端向服务端发送一个syn包,并进入SYN_SENT状态,等待服务器确认;
    • SYN:同步序列编号
    • 发送的syn = i
  • 服务器接收到客户端的syn包并确认客户端的syn,同时也发送一个自己的syn包,等待服务器确认;
    • 确认客户端生产 ack = i+1
    • 服务端发送的syn 标记为 k = i + ack
  • 客户端收到服务端的syn包,确认后,向服务端发送一个确认包,完成TCP连接
    • 向服务端发送的确认码syn 为 k + 1

3、四次挥手

  • 客户端发送释放报文,停止发送数据,进入等待状态
    • 客户端不能发数据,能接收数据
  • 服务端收到客户端的释放报文,发送确认报文,然后进入关闭等待状态,客户端收到服务端的确认报文,进入终止状态,但是还没有释放连接
  • 服务端完成数据传输后,向客户端发送释放连接的报文,然后服务器端进入最后确认状态
  • 客户端发送确认报文,然后进入确认等待状态,一段时间后,关闭客户端连接,服务端接收到确认报文后,会立即关闭连接

四、跨域请求

1、同源策略

http请求是开放的,任何资源都可以发送,这样就可能引起一些安全问题:

  • 跨站脚本攻击
  • SQL注入攻击
  • HTTP首部注入攻击
  • 跨站点请求伪造

于是,浏览器设置了同源限制,非同源请求资源,会有一些限制。同源策略判断:协议、主机、端口号

常见的同源限制:

  • Cookie、LocalStorage等本地存储
  • iframe操作
  • ajax请求
  • 非同源脚本异常捕获,获取不到具体异常信息
  • canvas操作跨域图片方法

2、跨域的解决办法

  • JSONP
    • 利用script标签可以跨域加载的特性,在当前页面定义一个方法,然后加载服务端临时创建的一个脚本文件,这个文件里面调用页面上定义的方法,将数据当做方法的参数传递
  • cors
    • 跨域请求资源时,通过服务端配置头字段信息,告知浏览器允许哪些域名跨域访问
  • postMessage
    • iframe跨域使用,只能传递字符串格式数据
  • document.domain
    • iframe跨域使用,限制二级域名要一样,子域名不同时
  • 代理访问
    • 前端访问后端服务,如果跨域,可以使用前端资源服务器进行代理访问,比如nginx代理,此时在浏览器上的访问就不是跨域了

3、cors跨域

通过服务端设置相应的头信息,允许某些源域访问服务资源,涉及的主要字段信息包括:

  • Access-Control-Allow-Methods:允许请求的方法
  • Access-Control-Allow-origin:允许跨域访问的源域名,配置“*”表示支持所有源跨域访问
  • Access-Control-Allow-Headers:允许跨域访问的头信息
  • Access-Control-Allow-Credentials:是否允许跨域共享cookie

4、预检请求

在跨域请求服务端接口时,对于简单请求和非简单请求,浏览器的操作流程是有区别的

(1)简单请求

  • 请求方法为:GET、POST、HEAD
  • 请求头信息字段为:Accept、Accept-Language、Content-language、Last-Event-ID、content-type只限text/plain、multipart/form-data、application/x-www-form-urlencoded

对于简单请求,浏览器会直接发送请求

(2)非简单请求

只要不满足简单请求条件的请求,都是非简单请求,浏览器发送非简单请求之前,会先发送一个预检请求(OPTION请求),携带请求的头信息,等待服务端校验,服务端判断请求的域名、头信息等,是否允许请求,如果允许,浏览器发送正式请求,如果不允许,浏览器抛出异常

5、跨域共享cookie

前端请求接口配置 withCredential 为true

后端配置:

  • Access-Control-Allow-origin:
  • Access-Control-Allow-Credentials: true
  • same-site:none
    • 谷歌浏览器80版本后需要设置为None,否则默认Lax,谷歌浏览器90+(具体记不清了)则需要使用https协议,否则None不生效
    • 枚举值:
      • Lax:默认值,只允许导航到第三方网站后,第三方网站get请求资源共享cookie
      • None:允许跨域获取cookie,设置时,必须同时设置Secure,即使用https协议,即确保访问是安全的,否则有些浏览器不能识别Node,会默认设置为Strict
      • Strict:只能cookie所属域获取cookie