HTTP相关知识整理笔记

197 阅读9分钟

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

大致分为数据帧和控制帧两类

\