一、是什么
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包首部信息
- 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