2、应用层
1、HTTP 报文格式
请求报文
响应报文
1.1、请求方法
- GET:获取资源,可以理解为读取或者下载数据
- HEAD:获取资源的元信息
- POST:向资源提交数据,相当于写入或上传数据
- PUT:类似 POST
- DELETE:删除资源
- CONNECT:建立特殊的连接隧道
- OPTIONS:列出可对资源实行的方法
- TRACE:追踪请求 - 响应的传输路径
GET 的语义是从服务器获取指定的资源,参数位置一般是写在 URL 中,只能支持 ASCII,浏览器会对 URL 的长度有限制
POST 的语义是根据请求负荷(报文 body)对指定的资源做出处理
请求携带数据的位置一般是写在报文 body 中,body 中的数据可以是任意格式的数据,只要客户端与服务端协商好即可,而且浏览器不会对 body 大小做限制
GET 方法就是安全且幂等的,因为它是「只读」操作,无论操作多少次,服务器上的数据都是安全的,且每次的结果都是相同的
POST 因为是「新增或提交数据」的操作,会修改服务器上的资源,所以是不安全的,且多次提交数据就会创建多个资源,所以不是幂等的
1.2、状态码
200 OK:是最常见的成功状态码,表示一切正常,如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据
204 No Content:也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据
206 Partial Content:是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态
301 Moved Permanently:表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问
302 Found:表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问
301 和 302 都会在响应头里使用字段 Location,指明后续要跳转的 URL,浏览器会自动重定向新的 URL
304 Not Modified:不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制
400 Bad Request:表示客户端请求的报文有错误,但只是个笼统的错误
403 Forbidden:表示服务器禁止访问资源,并不是客户端的请求出错
404 Not Found:表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端
500 Internal Server Error:与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道
501 Not Implemented:表示客户端请求的功能还不支持,类似 "即将开业,敬请期待" 的意思
502 Bad Gateway:通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误
503 Service Unavailable:表示服务器当前很忙,暂时无法响应客户端,类似 "网络服务正忙,请稍后重试" 的意思
1.3、连接管理
HTTP 协议最初(0.9 ⁄ 1.0)是个非常简单的协议,通信过程也采用了简单的 "请求 - 应答" 方式
因为客户端与服务器的整个连接过程很短暂,不会与服务器保持长时间的连接状态,所以就被称为 "短连接"
短连接的缺点相当严重,因为在 TCP 协议里,建立连接和关闭连接都是非常 "昂贵" 的操作
- TCP 建立连接要有 "三次握手",发送 3 个数据包,需要 1 个 RTT
- 关闭连接是 "四次挥手",4 个数据包需要 2 个 RTT
- 而 HTTP 的一次简单 "请求 - 响应" 通常只需要 4 个包,如果不算服务器内部的处理时间,最多是 2 个 RTT
这么算下来,浪费的时间就是 3 ÷ 5 = 60%,有三分之二的时间被浪费掉了,传输效率低得惊人
针对短连接暴露出的缺点,HTTP 协议就提出了 "长连接" 的通信方式,也叫持久连接、连接保活、连接复用
1.4、队头阻塞
因为 HTTP 规定报文必须是 "一发一收",这就形成了一个先进先出的 "串行" 队列
队列里的请求没有轻重缓急的优先级,只有入队的先后顺序,排在最前面的请求被最优先处理
如果队首的请求因为处理的太慢耽误了时间,那么队列里后面的所有请求也不得不跟着一起等待,结果就是其他的请求承担了不应有的时间成本
1.5、缓存技术
对于一些具有重复性的 HTTP 请求,比如每次请求得到的数据都一样的,我们可以把这对「请求 - 响应」的数据都缓存在本地
那么下次就直接读取本地的数据,不必在通过网络获取服务器的响应了,这样的话 HTTP/1.1 的性能肯定肉眼可见的提升,因此 HTTP 协议的头部有不少是针对缓存的字段
HTTP 缓存有两种实现方式,分别是强制缓存和协商缓存
强制缓存
强制缓存:只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏览器这边
强制缓存利用下面这两个 HTTP 响应头部(Response Header)字段实现的,它们都用来表示资源在客户端缓存的有效期
- Cache-Control,是一个相对时间
- Expires,是一个绝对时间
如果 HTTP 响应头部同时有 Cache-Control 和 Expires 字段的话,Cache-Control 的优先级高于 Expires
Cache-control 选项更多一些,设置更加精细,所以建议使用 Cache-Control 来实现强缓存,具体的实现流程如下
- 当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在 Response 头部加上 Cache-Control,Cache-Control 中设置了过期时间大小
- 浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与 Cache-Control 中设置的过期时间大小,来计算出该资源是否过期
如果没有则使用该缓存,否则重新请求服务器 - 服务器再次收到请求后,会再次更新 Response 头部的 Cache-Control
协商缓存
协商缓存需要配合强制缓存中 Cache-Control 字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求
2、Cookie Session Token
Cookie、Session、Token 究竟区别在哪?如何进行身份认证,保持用户登录状态?
使用什么保持用户登录状态?Session 还是 Token?
2.1、Cookie
2.2、Session
2.3、Token
3、HTTPS
3.1、HTTPS 解决了哪些问题
7 寸帽
3.2、基于 RSA 算法的 TLS 握手过程
3.3、HTTPS 的应用数据如何保证完整性
TLS 在实现上分为握手协议和记录协议两层
- TLS 握手协议就是我们前面说的 TLS 四次握手的过程,负责协商加密算法和生成对称密钥,后续用此密钥来保护应用程序数据(即 HTTP 数据)
- TLS 记录协议负责保护应用程序数据并验证其完整性和来源,所以对 HTTP 数据加密是使用记录协议
TLS 记录协议主要负责消息(HTTP 数据)的压缩 + 加密 + 数据的认证
- 消息被分割成多个较短的片段,然后分别对每个片段进行压缩
- 经过压缩的片段会被加上消息认证码(MAC 值,这个是通过哈希算法生成的),这是为了保证完整性,并进行数据的认证
通过附加消息认证码的 MAC 值,可以识别出篡改,与此同时,为了防止重放攻击,在计算消息认证码时,还加上了片段的编码 - 经过压缩的片段再加上消息认证码会一起通过对称密码进行加密
- 上述经过加密的数据再加上由数据类型、版本号、压缩后的长度组成的报头就是最终的报文数据
记录协议完成后,最终的报文数据将传递到传输控制协议 (TCP) 层进行传输
4、HTTP 版本
4.1、HTTP 1.1
纯文本协议:文本解析效率低
并发连接有限:谷歌浏览器最大并发连接数是 6 个,而且每一个连接都要经过 TCP 和 TLS 握手耗时,以及 TCP 慢启动过程给流量带来的影响
队头阻塞问题:同一连接只能在完成一个 HTTP 事务(请求和响应)后,才能处理下一个事务
HTTP 头部巨大且重复:由于 HTTP 协议是无状态的,每一个请求都得携带 HTTP 头部,特别是对于有携带 Cookie 的头部,而 Cookie 的大小通常很大
4.2、HTTP 2
二进制格式传输数据 + 并发传输 + 服务器主动推送资源 + 头部压缩(HPACK 算法)
在应用层与传输层之间,添加了二进制分帧层,将 HTTP 由文本协议转换成二进制协议(帧和流)
一个资源请求就是一个流,一个流由多个帧组成,用同一个流 ID 标识,接收方可以通过流 ID 将帧关联起来,从而实现乱序请求和响应的关联
4.3、HTTP 3
HTTP 2 建立连接后不是尽快发送数据,而是经历 "慢启动" 的育预热过程,增加网络延迟和资源消耗
在传输数据阶段,虽然在应用层多个请求可以同时发送,但是传输层 TCP 协议要求数据包必须按顺序串行传输
如果其中一个数据包丢失或延迟,后续的数据包需要等待重传或者等待前面的数据包传输完成后才能发送,也就是说队头阻塞的问题并没有彻底解决(TCP 层的队头阻塞)
QUIC 协议:安全性高、建立连接快、无队头阻塞、连接迁移(4G -> 5G)、避免协议僵化(用户空间)
5、跨域
跨域:不同源之间的资源访问,只要请求的 url 有以下不同,就属于跨域,协议、域名、端口
6、DNS
DNS:Domain Name System,将字符串自动转换为具体的 IP 地址
域名屏蔽:对域名直接不解析,返回错误,让你无法拿到 IP 地址,也就无法访问网站
域名劫持:也叫 "域名污染",你要访问 A 网站,但 DNS 给了你 B 网站
本文来自博客园,作者:lidongdongdong~,转载请注明原文链接:https://www.cnblogs.com/lidong422339/p/17674998.html