HTTP和HTTPS有什么区别
HTTPS=HTTP+加密+认证+完整性。
最本质的区别:安全和加密
- HTTP明文传输,途径的运营商,路由器,黑客能直接看到内容
- HTTPS密文传输,数据发送前加密成乱码,只有拥有钥匙的服务器能解开,即使被截获了也是一串无意义的字符
连接建立的过程
- HTTP三次握手后就开始发送信息
- HTTPS在TCP三次握手后,还要进行TLS握手,服务器给浏览器数字证书(CA证书),浏览器验证后,双方协商出秘钥,之后开始传输数据
端口号和资源消耗
HTTP默认端口80,HTTPS默认443
HTTP消耗服务器资源较低,HTTPS较高
HTTP不需要证书,HTTPS需要证书
误解
HTTPS确实要比HTTP慢一些,但是没有慢很多。TLS1.3(1RTT或者0RTT)减少握手开销,会话复用和强制跳转,使得损耗控制在10%
完整性
- HTTP:数据传输过程中可能被运营商加上广告
- HTTPS:带有消息完整性校验,哪怕篡改一个字节也能被检测出来
HTTPS的秘钥交换和证书校验的全过程
0:建立TCP连接
先建立TCP连接(HTTP3.0另算)
1:证书校验
服务器发送证书给客户端时
- 服务器发送"证件包":数字证书(域名、公钥、有效期、CA签名)和整个证书链(根CA到中间CA)
- 浏览器查验真伪:
- 看有效期是否过期
- 看域名是否匹配
- 查看证书有没有被拉黑
- 用本地的根CA公钥,解密证书的CA签名,成功解密,校验通过
- 提取公钥:验证成功后拿到公钥
2:密钥交换
-
浏览器打招呼
- 发送支持的密码列表
- 发送随机数a
- 生成临时公私钥(两个),公钥(1个)明文发送给服务器
-
服务器回应
- 从密码套件选一个,发随机数b
- 发证书(第一阶段)
- 服务器生成公私钥,公钥发给客户端
-
双方同时计算
- 客户端根据客户端私钥和服务端公钥算一个数c
- 服务器根据客户端公钥和服务端私钥算一个数c
这个数双方完全相同
3:生成会话密钥
a,b,c三个随机数,生成一个秘钥。
4:加密通信
浏览器发一条完成(Finished)消息,用秘钥加密
服务器收到用秘钥解密,校验通过
服务器回应一个完成(Finished)消息
TLS握手完成
非对称加密
非对称加密通信开销比较大,只需要用非对称加密计算一个秘钥,后续通信使用对称加密即可,保证性能和安全。
总共出现了哪些公钥私钥?客户端随机公钥私钥,服务器随机公钥私钥,证书公钥(客户端),证书私钥(服务器)。
TLS中使用了什么算法
第一类:密钥交换算法,非对称(一方公钥一方私钥)
TLS1.3使用ECDHE(椭圆曲线迪菲-赫尔曼),计算数c。
第二类:身份验证算法,非对称
服务器发送证书,用私钥签名,客户端用证书公钥验证签名,证明服务器确实有这个私钥。
RSA算法,ECDSA(椭圆曲线数字签名)
第三类:对称加密算法
AES算法。拿密钥对明文加密解密
第四类:哈希和伪随机函数
SHA-256/SHA-384(安全哈希算法):a,b,c三个随机数反复进行SHA-256哈希,得到一个较长的,随机性强的对称密钥。
服务器发证书,客户端校验时:直接用私钥加密证书太大,先哈希得到指纹再加密这个指纹,然后客户端同样哈希算一遍这个证书得到指纹,再用公钥解密服务器传来的加密指纹。对比指纹是否一致。防篡改,提升效率
HTTP&WebSocket
本质区别
- HTTP是请求-响应模型,客户端可以主动发起请求,服务器不能主动给客户端发消息
- WebSocket是全双工持久连接,客户端和服务器可以互相发送信息
多角度对比
| 维度 | HTTP | WebSocket |
|---|---|---|
| 通信方向 | 单向触发,只能由客户端发起 | 双向实时,可以双方主动发 |
| 协议头开销 | 开销较大 | 没有重复header,连接建立好后只有轻量级数据帧 |
| 二进制支持 | 处理较为笨重 | 原生支持二进制 |
连接升级过程
- 客户端发起一个特殊GET请求
connection:upgradeupgrade:websocketsec-websocket-key
- 服务器回复101(协议切换)
- TCP连接上的协议由HTTP变成了Websocket
WebSocket和轮询
没有WebSocket的时候,想知道服务器要不要主动推数据,必须前端不断轮询。
- 轮询:每次要发一个HTTP头,存在延迟
- WebSocket:握手后,服务器收到消息就能推送,节省带宽(HTTPheader开销)和服务器CPU(如果有信息要发送,就阻塞等待请求到来)。
场景
大多数时候使用HTTP
实时交互强的时候使用websocket
- 即使聊天(网页微信)
- 在线游戏(多人对战)
- 协同编辑(飞书文档)
WebSocket的工作过程
1:建立连接
通过HTTP协议,升级协议
客户端:
html
Connection: Upgrade // 告诉服务器我要切换协议
Upgrade: websocket // 指定要切换成 WebSocket
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== // 随机 Base64 码(防缓存代理)
服务器:
html
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= // 经过加密算法计算出的校验值
2:数据传输
不再发送HTTP报文,而是发送轻量级数据帧,帧头仅2-14字节
帧包括:
- FIN:是否是该消息的最后一帧(传输大文件)
- opcode(操作码):这个帧干什么的
- 数据长度
- 掩码:客户端发送给服务器的数据必须加掩码(XOR 加密)
...
特点:全双工,客户端发完消息不用等回复,服务器也可以随时推送数据。无HTTP头部冗余。
3:保活与关闭
连接可能被切断,可以互发特殊帧确认连接是否存活(这个不是超时连接断开)
- ping帧(通常由服务器发起)
- pong帧(另一方回复相同载荷)
- 维持网络不被中间网络设备断开,确认对方是否掉线
关闭连接:
一方要关闭,发送close帧。对方收到后回复一个相同的close帧。
为什么要掩码
- 原因 :早期 WebSocket 草案曾引发缓存污染攻击。恶意网页可以让浏览器发起 WebSocket 请求,由于数据可控,攻击者可以将
HTTP/1.1 200 OK等 ASCII 码伪装成 WebSocket 数据发往代理服务器,污染代理缓存。 - 解决方案 :让客户端用密钥(掩码)对数据进行 XOR 异或处理,使得数据在到达代理服务器时看起来是完全随机的乱码,无法被代理误认为 HTTP 响应,从而彻底杜绝该漏洞,wss密文传输也是一样的效果。
SSE和WebSocket的区别
SSE和WebSocket的核心区别在于,SSE是单向(服务器到客户端),WebSocket是全双工的。
| 特性 | SSE (Server-Sent Events) | WebSocket |
|---|---|---|
| 通信方向 | 单向:仅服务器向客户端推送数据。 | 双向:客户端和服务器可随时互相发送数据。 |
| 协议基础 | 标准 HTTP/HTTPS,无需额外协议升级。 | 独立协议 (ws/wss),需通过 HTTP 升级握手。 |
| 实现复杂度 | 简单 ,浏览器原生 EventSource API 即可实现。 |
较复杂,需处理更多连接状态和逻辑。 |
| 自动重连 | 内置,浏览器自动处理,支持断点续传。 | 需手动实现,需自己编写心跳检测和重连逻辑。 |
| 数据格式 | 仅文本 (UTF-8)。 | 文本和二进制,如图片、文件等。 |
| 连接数限制 | HTTP/1.1 下同源限制约6个;HTTP/2 下可多路复用。 | 无浏览器同源连接数限制。(不受HTTP限制) |
| 代理/防火墙 | 兼容性好,标准 HTTP 流量易通过。 | 可能被拦截,升级握手可能被严格网络环境阻止。 |
场景
如果是服务器单向给客户端发消息,用SSE更加简单和轻量
- 消息推送:新闻,通知
- 实时数据:体育赛事比分等
- AI流式响应(可以用HTTP吗?可能太大了,而且是请求-响应式的,不适合流式)
如果客户端和服务器频繁交互,选择WebSocket
- 即时聊天
- 多人协作
- 在线游戏
如果要传输的数据是二进制也选择WebSocket更好。可以同时使用二者