# 关于 http 协议你知道多少
# http 协议
- HTTP 协议是超文本传输协议,对于 HTTP 来说多了一层 SSL/TLS
- 基于 TCP/IP 通信协议来传递数据
- http 协议是短连接协议,限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接
- HTTP 协议是无状态协议,缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大
- 通过 http 协议中头部的 Content-Type 标记,可以传输任意数据类型的数据对象(文本、图片、视频等等),非常灵活
- 发送请求访问某个资源时,只需传送请求方法和 URL 就可以了,使得 http 服务器的程序规模小,因而通信速度很快
- HTTP1.0 定义了三种请求方法:GET, POST , HEAD 方法
- HTTP1.1 新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE , CONNECT 方法(如果是 RESful 接口的话一般会用到 PUT、DELETE、GET、POST,分别对应增删查改)
# http 状态码
- 1xx 信息响应(100-Continue-继续,客户端应继续其请求)
- 2xx 成功相应(200-ok-请求成功)
- 3xx 重定向(301-Moved Permanently-永久重定向,304-Not Modified-缓存)
- 4xx 客户端错误(401-Unauthorized-无权限,403-Forbidden-服务器理解请求客户端的请求,但是拒绝执行此请求)
- 5xx 服务器错误(500-Internal Server Error-服务器内部错误,502-Bad Gateway-从远程服务器接收到了一个无效的响应,503-Service Unavailable-服务器暂时的无法处理客户端的请求)
# 关于 http 的缺点
- 无状态
- 不安全
- 明文传输:报文(header 部分)使用的是明文,直接将信息暴露给了外界
- 队头阻塞:只建立一个 TCP 连接,同一时刻只能处理一个请求,那么当请求耗时过长时,其他请求就只能阻塞状态
# HTTP 和 HTTPS 的区别
- HTTP 是明文传输,不安全的,HTTPS 是加密传输,安全的多
- HTTP 标准端口是 80,HTTPS 标准端口是 443
- HTTP 不用认证证书免费,HTTPS 需要认证证书要钱
- 连接方式不同,HTTP 三次握手,HTTPS 中 TLS1.2 版本 7 次,TLS1.3 版本 6 次
- HTTP 在 OSI 网络模型中是在应用层,而 HTTPS 的 TLS 是在传输层
- HTTP 是无状态的,HTTPS 是有状态的
# TCP 三次握手
- 客户端发送一个带 SYN=1,Seq=X 的数据包到服务器端口
- 服务器发回一个带 SYN=1, ACK=X+1, Seq=Y 的响应包以示传达确认信息
- 客户端再回传一个带 ACK=Y+1, Seq=Z 的数据包,代表“握手结束”
# 关于加密
- TLS 是 SSL 的升级版,TLS 需要保证信息的:机密性、可用性、完整性、认证性、不可否认性
- TLS 实际用的是两种算法的混合加密。通过 非对称加密算法 交换 对称加密算法 的密钥,交换完成后,再用对称加密进行加解密传输数据。
- 浏览器和服务器通信通过共同支持的加密套件,用来实现安全的通信
- RSA:表示握手时用 RSA 算法交换密钥,即不对称加密算法,就是一对密钥,有公钥(public key)和私钥(private key),对于安全性来说,使用公钥反推出私钥是非常困难,但不是做不到,随着计算机运算能力提高,非对称密钥至少要 2048 位才能保证安全性,这就导致性能上要比对称加密要差很多
- PSK:表示使用 PSK 算法签名
- AES128-GCM:表示使用 AES256 对称加密算法通信,就是加密和解密使用同一个密钥
- SHA256:表示使用 SHA256 算法验证信息完整性并生成随机数
# HTTP2 有哪些特点
- 二进制分帧层:HTTP2 性能提升的核心就在于二进制分帧层,1.1 响应是文本格式,而 2.0 把响应划分成了两个帧,图中的 HEADERS(首部)和 DATA(消息负载) 是帧的类型,缩小了请求体积
- 多路复用:HTTP/1.1 的线头阻塞和多个 TCP 连接的问题,HTTP2 的多路复用完美解决。HTTP2 让所有的通信都在一个 TCP 连接上完成,真正实现了请求的并发,HTTP2 对同一域名下所有请求都是基于流的,也就是说同一域名下不管访问多少文件,只建立一次连接
- 头部压缩:
- 维护一份相同的静态字典,包含常见的头部名称,以及常见的头部名称和值的组合
- 维护一份相同的动态字典,可以动态的添加内容
- 通过静态 Huffman 编码对传输的首部字段进行编码
- 允许服务端主动推送数据给客户端
- 请求优先级:可以设置数据帧的优先级,让服务端先处理重要资源,优化用户体验。
# 关于缓存
- 缓存可以解决什么问题?
- 减少不必要的网络传输,节约宽带
- 更快的加载页面
- 减少服务器负载,避免服务器过载的情况出现。
- 为了使缓存策略更加健壮、灵活,HTTP 1.0 版本 和 HTTP 1.1 版本的缓存策略会同时使用,甚至强制缓存和协商缓存也会同时使用,对于强制缓存,服务器通知浏览器一个缓存时间,在缓存时间内,下次请求,直接使用缓存,超出有效时间,执行协商缓存策略,对于协商缓存,将缓存信息中的 Etag 和 Last-Modified 通过请求头 If-None-Match 和 If-Modified-Since 发送给服务器,由服务器校验同时设置新的强制缓存,校验通过并返回 304 状态码时,浏览器直接使用缓存,如果协商缓存也未命中,则服务器重新设置协商缓存的标识。
- 强缓存:浏览器如果判断本地缓存未过期,就直接使用,无需发起 http 请求
- HTTP 1.0 中服务器使用的响应头字段为
Expires
, 值为未来的绝对时间(时间戳),浏览器请求时的当前时间超过了 Expires 设置的时间,代表缓存失效 - HTTP 1.1 中 Cache-Control 是最重要的规则,默认为 private,共有 5 种值:
- private 私有缓存(表示资源只能被浏览器缓存)
- public 共享缓存(表示资源即可以被浏览器缓存也可以被代理服务器缓存)
- max-age 缓存的内容将在 xxx 秒后失效
- no-cache 需要使用对比缓存来验证缓存数据
- no-store 所有内容都不会缓存,强缓存、协商缓存都不会触发
- ETag 就是将原先协商缓存的比较时间戳的形式修改成了比较文件指纹
- HTTP 1.0 中服务器使用的响应头字段为
- 协商缓存:第一次请求时服务器会将缓存标识与数据一起返回给客户端,客户端将二者备份至缓存数据库中。再次请求数据时,客户端将备份的缓存标识发送给服务器,服务器根据缓存标识进行判断,服务器端读出文件修改时间,读出来的修改时间赋给响应头的 last-modified 字段,判断成功后,返回 304 状态码
- HTTP1.0 中 If-Modified-Since/Last-Modified 这两个是成对出现的
- HTTP 1.1 中 If-None-Match/E-tag 这两个是成对出现的
# 补充
- 从浏览器地址栏输入 url 到请求返回发生了什么?
- DNS 解析:将域名解析成 IP 地址
- TCP 连接:TCP 三次握手
- 发送 HTTP 请求
- 服务器处理请求并返回 HTTP 报文
- 关闭 TCP 连接,通过四次挥手释放 TCP 连接
- 浏览器解析渲染页面
- 解析 HTML 结构,构建 DOM 树
- 解析 CSS,生成 CSS 规则树
- 合并 DOM 树和 CSS 规则,生成 render 树后绘制
- 加载外部脚本
- 解析并执行部分脚本代码
- DOM 树构建完成(PS 可以使用 DOMContentLoaded 事件插入在此之后)
- 加载图片等外部文件
- 页面执行完毕后再执行 window.onload
TCP/UDP 都属于传输层,但是他们有什么区别
- TCP 协议面向有连接,能正确处理丢包,传输顺序错乱的问题,但是为了建立与断开连接,需要至少 7 次的发包收包,资源浪费
- UDP 面向无连接,不管对方有没有收到,如果要得到通知,需要通过应用层
TCP/IP 协议族按层次分为以下四层
- 应用层
- 传输层
- 网络层
- 链路层
- XSS :跨站脚本攻击
- 利用 html 可以执行
<script>alert(1)</script>
的特性,将脚本注入页面中, - 通过输入框将脚本代码注入数据库
- CSRF 跨站请求伪造攻击防范措施
- Get 请求不用于对数据进行修改
- Cookie 设置 HTTP Only
- 接口设置禁止跨域
- 请求时附带验证信息,比如验证码或者 Token
- 中间人攻击
- 中间人攻击是攻击方同时与服务端和客户端建立起了连接,并让对方认为连接是安全的,但是实际上整个通信过程都被攻击者控制了。
- 攻击者不仅能获得双方的通信信息,还能修改通信信息。中间人攻击的本质是客户端和服务端之间的认证和信任问题。