HTTP相关知识
1.HTTP常见面试题
HTTP是什么
HTTP是超文本传输协议
- 协议 计算机之间的规范,并按照规范处理相关问题
- 传输 两点间双向传输,中转/代理服务器也需满足HTTP协议
- 超文本 含有文字、图片、视频、甚至(超)链接的文本
HTTP是超文本传输协议,是一种在点对点传输含有文字、图片、视频、超链接等超文本时双方所遵循的约定和规范。
HTTP常见的状态码
- 2xx 成功,报文正在被处理
- 3xx 重定向
- 4xx 客户端错误,请求报文有误
- 5xx 服务器错误,服务器处理请求时发生错误
HTTP常见字段
- Host 访问同一台服务器不同网站
- Content-Length 本次回应数据长度
- Connection 客户端要求服务器建立持久连接
- Content-Type 回应客户端的数据格式
- Content-Encoding 数据的压缩方法
GET和POST区别
- GET 请求将请求数据放在url,发送请求
- POST 请求将数据放在body里,发送请求,比如提交表单
GET和POST是否安全幂等
安全 指请求方法不会破坏服务器资源
幂等 指多次执行相同操作结果都是相同的
- GET 是安全且幂等的
- POST 是不安全不幂等的,因为会修改服务器数据
HTTP1.1的优点和体现
- 简单,易于理解
- 灵活易于扩展,开发人员可以自定义和扩充
- HTTP工作在应用层,则下层可随意变动
- 应用广泛跨平台
HTTP缺点
- 无状态 优点是减轻服务器负担,但缺点也显而易见,某些需要验证用户身份的一系列环节都会造成困扰,会多次验证身份信息,解决方法有cookie技术,当客户端请求时带上cookie避免多次验证
- 明文传输 将所有信息暴露了出去,某些信息很容易被窃取
- HTTP不安全,明文传输内容可能被窃听,不验证双方身份则可能遇到伪装,无法证明报文完整性,则有可能被篡改数据
解决方式可以使用HTTPS来解决,引入SSL/TLS传输层
HTTP1.1性能
- 长连接 默认为长连接方式 keep-alive,没有一方明确断开连接则保持连接状态
- 管道网络传输 客户端可以发起多个请求,无需等待回应,减少整体响应时间,但响应顺序还是依据请求顺序,如果前面的响应很慢,则会造成对头堵塞
HTTP与HTTPS的区别
- HTTP明文传输有封面,HTTPS加入了SSL/TLS安全协议,使得报文加密传输
- HTTP连接简单,TCP三次握手即可传输,但HTTP必须进行SSL/TLS握手才能传输
- HTTP端口号为80,HTTPS端口号为443
- HTTPS需要申请数字证书
HTTPS所解决的问题
- 窃听风险 -- 信息加密 -- 混合加密
- 篡改风险 -- 校验机制 -- 摘要算法
- 冒充风险 -- 身份证书 -- 数字证书
1.混合加密
HTTPS采用混合加密,使用了对称加密和非对称加密
2.摘要算法
通过摘要算法算出明文的指纹,比较两个明文指纹,若相同,则数据是完整的。
3.数字证书
借助三方机构将服务器公钥放在数字证书中,只要证书可信,公钥就可信
HTTPS的建立与交互
客户端向服务器要公钥
双方生产会话密钥
双方通过会话密钥加密通信
HTTP/1.1、HTTP/2、HTTP/3演变
优点:HTTP1.1与HTTP1.0比较,采用了TCP长连接方式,支持了管道网络传输
缺点:冗余发送冗余信息,没有请求优先级控制,请求只能从客户端发起,服务器只能被动响应
HTTP/2优点是进行了头部压缩,并将报文使用二进制格式传输,并可指定优先级
HTTP/2实现了并发进行多个请求或回应
HTTP/2的服务器可以主动向客户端发送消息,例如浏览器请求HTML时,服务器就将JS、CSS等文件主动发送给客户端,也就是服务器推送。
HTTP/3基于TCP中阻塞的问题,将TCP协议改成了UDP
2.HTTP/1.1如何优化
三种优化思路:
- 尽量避免发送HTTP请求
- 在需要发送HTTP请求时,考虑如何减少请求次数
- 减少服务器的HTTP相应的数据大小
如何避免发送HTTP请求
通过缓存技术来将重复缓存数据保留在本地
如何减少HTTP请求次数
- 减少重定向请求次数
通过代理服务器,让代理服务器去解决重定向问题,而不是返回给客户端去解决,这样代理服务器甚至可以知悉重定向规则,直接访问重定向后的url
- 合并请求
通过打包减少请求次数,合并资源,来合并请求,减少请求次数
- 延迟发送请求
按需获取
如何减少HTTP响应数据大小
- 无损压缩 gzip
- 有损压缩 常用于压缩多媒体数据 webP
3.HTTPS RSA 握手解析
TLS握手过程
HTTPS是应用层协议
- RSA握手过程
1.客户端发送Client Hello,密码套件,并生成随机数发送过去
2.服务端从密码套件中选择一个,来生成随机数,返回Server Hello消息
3.服务端发送Server Certicficate,消息中含有数字证书
4.服务端发送Server Hello Done,表明打招呼完毕
数字证书包含的信息:
- 公钥
- 持有者信息
- 证书认证机构的信息
- CA对这份文件的数据签名以及使用的算法
- 证书有效期
- 额外信息
5.证书验证完毕,客户端生成新的随机数,用服务器的公钥加密随机数,并传递给服务端
6.服务端收到后用RSA私钥解密,得到随机数
7.双方根据得到的三个随机数,生成会话密钥,此密钥为对称密钥,用于对后续HTTP请求/响应的数据加密和解密
8.双方互相通过对称密钥加密之前的信息成摘要,再让对方使用密钥进行解密,来验证是否可用和之前信息是否被篡改,如果信息没有问题,则握手正式完成,接下来使用会话密钥进行HTTP请求和响应
RSA算法缺陷
RSA密钥协商算法不支持前向保密,通过DH算法来解决
4.HTTPS ECDHE握手解析
离散对数
离散+对数
如果对于一个整数b和质数p的一个原根a,可以找到一个唯一的指数i,使得
ai(mod p) = b 成立,那么指数 i 称为 b 的 以 a 为底数的模 p 的离散对数
这就是DH算法的数学基础
DH算法
通过离散对数形成的密钥
DHE算法
每次通信双方的私钥都是随机生成的,保证了向前安全
ECDHE算法
通过ECC椭圆曲线特性,生成坐标,代表密钥,双方x坐标一样,则是共享密钥
ECDHE握手过程
-
TLS第一次握手 客户端发送Client Hello
-
TLS第二次握手 服务端发挥Server Hello,为了证明自己的身份,发送Certificate消息,然后发送Server Key Exchange
这个过程服务器做了三件事:
- 选择了椭圆曲线
- 生成随机数作为曲线私钥
- 根据私钥和G来计算出服务端公钥,公开给客户端,为了保证不会被三方篡改,使用RSA签名,然后发送Server Done
-
TLS第三次握手 生成客户端的椭圆曲线公钥,发给服务端,发送最终会话密钥
-
TLS第四次握手 握手正式完成
5.HTTPS如何优化
分析性能损耗
产生损耗的两个环节:
- TLS握手过程
- 握手后的加密传输
硬件优化
CPU越好,HTTPS传输越快,因为握手需要大量计算
软件优化
- 升级内核等
- 替换交换算法,例如使用ECDHE替换RSA
- TLS升级 1.2 ---> 1.3
证书优化
- 减少证书大小
- 证书验证优化
会话复用
复用对称加密密钥
-
Session ID -- TLS握手连接后,双方会在内存缓存会话密钥,并用Session ID标识
- 缺点:服务器压力大,如果负载均衡不一定命中上次访问的服务器
-
Session Ticket -- 将缓存工作交给客户端,类似于Cookie 不具备向前安全性不能抵御重放攻击
Pre-shared Key
随着HTTP请求一起发送 Session Ticket
但也会有重放攻击的风险
6.HTTP2优势
兼容HTTP1.1
仍使用http://表示明文协议,https://表示加密协议
只在应用层做出改变
头部压缩
- 压缩
- 避免重复性
- 二进制编码
通过字典,用较小索引号来表示重复字符串
静态表编码,写入在HTTP2框架中
在统计大量HTTP头部后,HTTP2将出现频率高的ASCII码编码成了Huffman编码表
动态表编码
当超出静态编码表的范围时,会在编码解码的时候随时更新,动态添加index号,这样可以使得条字段都可以由一个对应的index号,但这样也会让动态表维护很困难,因此设置传输请求数量,当请求数量达到一定限制时则关闭HTTP2连接来释放内存
二进制帧
一般分为数据帧和控制帧两类
并发传输
多个Stream复用一条TCP连接,达到并发的效果
一个TCP连接包含多个Steam
Stream里可以包含多个Message -- 对应HTTP1中的请求或响应
Message里包含一条或者多个Frame,Frame是HTTP2最小单位,以二进制压缩格式压缩
同一Stream必须严格有序
服务器主动推送资源
建立连接后服务器可以主动推送CSS等资源
7.HTTP3
将TCP协议换成了UDP协议,还基于UDP在应用层实现了QUIC协议,使得UDP变成可靠的
一个数据包丢失了,不会影响其他流
连接更快,只需要一个QUIC协议的握手,QUIC内部包含了TLS
通过连接ID,来达到无缝的连接迁移
HTTP3协议
HTTP3的帧结构直接使用QUIC里的Stream
大致分为数据帧和控制帧两类
\