HTTP常见面试题
学习资源 小林coding 2022.3.30
HTTP基本概念
HTTP是什么?
HTTP 超文本传输协议
超文本
传输
协议
三部分
-
协议:HTTP是用在计算机中的协议 使用计算机能够理解的语言确立了一种计算机之间交流通信的规范(两个以上参与者),以及相关控制和错误处理的方式(行为约定和规范)
-
传输: HTTP 双向协议 数据两端之间传输 允许中转与接力
HTTP是一个在计算机世界里面专门用来在
两点间传输数据
的约定和规范 -
超文本 -> 超越普通文本的文字 -> 典型HTML
HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。
HTTP只能从互联网 -> 本地服务器?
X 还可以是S-S 采用两点之间描述
HTTP常见状态码
HTTP常见字段
host字段
有了 Host
字段,就可以将请求发往「同一台」服务器上的不同网站。
Content-Length
表示本次回应的数据长度
Connection
常用于客户端要求服务器使用TCP持久连接
以便其他请求复用
HTTP/1.1 默认持久连接 ->兼容老版本
Connection: keep-alive
Content-Type
说明客户端发送的格式
Content-Type: text/html; charset=utf-8
上面的类型表明,发送的是网页,而且编码是UTF-8。
客户端请求的时候,可以使用 Accept
字段声明自己可以接受哪些数据格式。
Accept: */*
Content-Encoding
表明服务器数据的压缩方式
Content-Encoding: gzip
上面表示服务器返回的数据采用了 gzip 方式压缩,告知客户端需要用此方式解压。
客户端在请求时,用 Accept-Encoding
字段说明自己可以接受哪些压缩方法。
Accept-Encoding: gzip, deflate
GET&POST
GET : 从服务器获取指定的资源
请求参数 一般写在URL中 URL规定只支持ASCII 浏览器会对URL长度有限制
POST: 根据请求负荷(报文body)对指定的资源做出处理
安全和幂等性
安全
:请求方法不会 破坏 服务器上的资源
幂等
: 执行多次相同的结果 结果都是相同的
GET : 安全且幂等 只读
可以对GET请求的数据做缓存
缓存可存在于 浏览器 代理(Nginx) 浏览器中get可以保存为书签
POST: 新增或提交数据 修改资源 不安全 不可缓存
避免传输过程中数据被窃取 使用HTTPS协议 所有HTTP数据都会被加密传输
GET请求也可以携带body
POST URL请求后也可以加参数
HTTP特性
HTTP1.1
-
简单
HTTP基本报文形式 header+body
头部信息k-v
-
灵活易于拓展
允许开发人员自定义扩充
HTTP运行在应用层 OSI第七层 下层可以随意变化
HTTPS: HTTP TCP 之间增加了SSL/TLS安全传输层
HTTP/3 把TCP换成了基于UDP的QUIC
-
应用广泛和跨平台
缺点:无状态 明文传输 不安全
-
无状态
服务器不会去记忆HTTP的状态 不需要额外资源记录状态信息
减轻服务器负担
完成关联性操作时很烦 每次需要鉴权
解决方案
:Cookie -
明文传输
信息裸奔
-
不安全
-
通信明文不加密 内容窃听
-
不验证身份 伪装
-
无法证明报文完整性 可能遭篡改
解决方案
:HTTPS -
HTTP1.1性能
HTTP基于TCP/IP 请求-应答 的通信模式
-
长连接
问题:HTTP/1.0 每次发起连接 三次握手四次挥手 串行 增加通信开销
解决:
长连接
只要任意一端没有明确提出断开连接 则保持TCP连接状态 -
管道网络传输
在同一个TCP连接里面 客户端可以发起多个请求 不必串行发送
减少整体的响应时间
服务器
按照顺序
队头堵塞 -
队头堵塞
按顺序发送请求队列 阻塞
因此1.1性能一般般
HTTP与HTTPS
区别
-
HTTP超文本传输协议 明文传输
HTTPS 加入 SSL/TLS 安全协议
-
HTTP建立简单 三次握手 HTTPS 三次握手+SSL/TLS握手
-
端口 80 443
-
HTTPS 需要向CA(证书权威机构申请数字证书)保证服务器的身份是可信的
解决问题
-
信息加密
-
校验机制
-
身份证书
如何解决
-
混合加密
-
摘要算法 指纹 完整性
-
服务器公钥 数字证书
-
混合加密 对称加密 + 非对称加密
-
通信建立前 非对称加秘密 交换 会话密钥 后续不再使用
-
通信过程中 全部使用 对称加密 加密 明文数据
采用「混合加密」的方式的原因:
-
对称加密只使用一个密钥,运算速度快,密钥必须保密,无法做到安全的密钥交换。
-
非对称加密使用两个密钥:公钥和私钥,公钥可以任意分发而私钥保密,解决了密钥交换问题但速度慢。
-
-
摘要算法
客户端在发送明文之前会通过摘要算法算出明文的「指纹」,发送的时候把「指纹 + 明文」一同加密成密文后,发送给服务器,服务器解密后,用相同的摘要算法算出发送过来的明文,通过比较客户端携带的「指纹」和当前算出的「指纹」做比较,若「指纹」相同,说明数据是完整的。
-
数字证书
客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。
服务器公钥存放在数字证书中
HTTPS建立连接过程
SSL/TLS协议基本流程:
-
客户端向服务器索要验证服务器公钥
-
双方协商生产会话密钥
-
双方采用密钥进行加密通信
SSL/TLS四次通信
-
1. ClientHello
首先,由客户端向服务器发起加密通信请求,也就是 ClientHello
请求。
在这一步,客户端主要向服务器发送以下信息:
(1)客户端支持的 SSL/TLS 协议版本,如 TLS 1.2 版本。
(2)客户端生产的随机数(Client Random
),后面用于生产「会话秘钥」。
(3)客户端支持的密码套件列表,如 RSA 加密算法。
2. SeverHello
服务器收到客户端请求后,向客户端发出响应,也就是 SeverHello
。服务器回应的内容有如下内容:
(1)确认 SSL/ TLS 协议版本,如果浏览器不支持,则关闭加密通信。
(2)服务器生产的随机数(Server Random
),后面用于生产「会话秘钥」。
(3)确认的密码套件列表,如 RSA 加密算法。
(4)服务器的数字证书。
3.客户端回应
客户端收到服务器的回应之后,首先通过浏览器或者操作系统中的 CA 公钥,确认服务器的数字证书的真实性。
如果证书没有问题,客户端会从数字证书中取出服务器的公钥,然后使用它加密报文,向服务器发送如下信息:
(1)一个随机数(pre-master key
)。该随机数会被服务器公钥加密。
(2)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
(3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供服务端校验。
上面第一项的随机数是整个握手阶段的第三个随机数,这样服务器和客户端就同时有三个随机数,接着就用双方协商的加密算法,各自生成本次通信的「会话秘钥」。
4. 服务器的最后回应
服务器收到客户端的第三个随机数(pre-master key
)之后,通过协商的加密算法,计算出本次通信的「会话秘钥」。然后,向客户端发生最后的信息:
(1)加密通信算法改变通知,表示随后的信息都将用「会话秘钥」加密通信。
(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时把之前所有内容的发生的数据做个摘要,用来供客户端校验。
至此,整个 SSL/TLS 的握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的 HTTP 协议,只不过用「会话秘钥」加密内容。
HTTP/1.1 2 3 演变
HTTP/1.1
优点: 长连接 管道
缺点: 头部未压缩 队头阻塞 没有优先级控制 请求只能从客户端到服务器
HTTP/2
优点 : 头部压缩 消除重复部分 提高速度
HPACK
算法 客户端服务器维护一张头信息表 只发送索引号 提高速度
二进制格式:头信息和数据体都是二进制 为帧
数据流:可以指定优先级
多路复用: 一个连接中并发多个请求或相应 不用按照顺序一一对应
服务器推送 服务器可以主动向客户端发送信息
问题: 如果丢包 重传 所有HTTP请求都得等待丢包重传
所以 HTTP3把HTTP下层的TCP改为UDP
UDP可靠性 QUIC协议
-
QUIC 有自己的一套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响。
-
TLS3 升级成了最新的
1.3
版本,头部压缩算法也升级成了QPack
。 -
HTTPS 要建立一个连接,要花费 6 次交互,先是建立三次握手,然后是
TLS/1.3
的三次握手。QUIC 直接把以往的 TCP 和TLS/1.3
的 6 次交互合并成了 3 次,减少了交互次数。