1. HTTP 与 HTTPS 的区别
主要区别:
- 安全性:HTTPS 比 HTTP 更安全
- HTTP 是明文传输
- HTTPS 使用 SSL/TLS 加密
- 端口:
- HTTP 默认端口 80
- HTTPS 默认端口 443
- 证书:
- HTTPS 需要 CA 证书
- HTTP 不需要证书
- 速度:
- HTTPS 因为需要加密解密,性能会略低于 HTTP
让我用通俗易懂的方式来解释 HTTPS 的工作流程:
HTTPS 握手过程流程图
sequenceDiagram
participant Client as 客户端
participant Server as 服务器
Note over Client,Server: 1. 客户端打招呼
Client->>Server: Client Hello
Note left of Client: 发送:<br/>1. 支持的 SSL/TLS 版本<br/>2. 支持的加密算法<br/>3. 随机数 Client Random
Note over Client,Server: 2. 服务器回应
Server->>Client: Server Hello
Note right of Server: 发送:<br/>1. 确认 SSL/TLS 版本<br/>2. 确认加密算法<br/>3. 随机数 Server Random
Note over Client,Server: 3. 服务器发送证书
Server->>Client: 发送数字证书
Note right of Server: 包含:<br/>1. 公钥<br/>2. 证书信息<br/>3. 数字签名
Note over Client,Server: 4. 客户端验证证书
Note left of Client: 1. 验证证书合法性<br/>2. 生成随机数 Pre-master
Client->>Server: 用公钥加密 Pre-master
Note over Client,Server: 5. 生成会话密钥
Note over Client,Server: 双方使用三个随机数生成会话密钥:<br/>Client Random<br/>Server Random<br/>Pre-master
Note over Client,Server: 6. 开始加密通信
Client->>Server: 使用会话密钥加密数据
Server->>Client: 使用会话密钥加密数据
详细解释每个步骤:
1. 客户端打招呼(Client Hello)
就像说:
"你好,我想安全地和你聊天,
我可以用这些加密方式:AES-256、AES-128...
这是我的随机数,待会儿用来生成密钥"
2. 服务器回应(Server Hello)
就像回答:
"好的,我们就用 AES-256 加密吧,
这是我的随机数,我们待会儿用这个生成密钥"
3. 服务器发送证书
就像出示身份证:
"这是我的证书,证明我是真的淘宝网站,
证书里有我的公钥,你可以用它来加密信息"
4. 客户端验证证书
就像验证身份证:
1. 检查证书是否有效
2. 生成第三个随机数(Pre-master)
3. 用公钥加密这个随机数发给服务器
5. 生成会话密钥
双方都用三个随机数生成相同的会话密钥:
- Client Random(客户端的随机数)
- Server Random(服务器的随机数)
- Pre-master(客户端生成的随机数)
6. 开始加密通信
就像现在双方都有了同一把钥匙:
- 所有数据都用会话密钥加密
- 确保了通信安全
为什么要这么复杂?
-
三个随机数的原因:
- 增加随机性
- 防止密钥被预测
- 提高安全性
-
证书的作用:
- 防止中间人攻击
- 确认服务器身份
- 安全传输公钥
-
会话密钥的好处:
- 对称加密速度快
- 每次会话都不同
- 即使一次被破解也不影响其他会话
生活中的比喻
可以把整个过程比喻成:
1. 双方见面打招呼(握手)
2. 服务器出示身份证(证书)
3. 客户端确认身份证真伪
4. 双方合作制作一把钥匙(会话密钥)
5. 用这把钥匙加密之后的所有对话
这样的设计既保证了通信的安全性,又兼顾了加密解密的效率。
让我详细解释下数字证书(SSL/TLS 证书)的内容:
数字证书内容结构图
graph TD
A[数字证书] --> B[基本信息]
A --> C[公钥信息]
A --> D[签名信息]
B --> B1[版本号]
B --> B2[序列号]
B --> B3[颁发者信息]
B --> B4[有效期]
B --> B5[使用者信息]
C --> C1[公钥]
C --> C2[加密算法]
D --> D1[签名算法]
D --> D2[CA签名]
详细内容解释
1. 基本信息部分
Version(版本号)
- 证书版本,如 X.509 v3
Serial Number(序列号)
- 证书的唯一标识号
- 由 CA 机构分配
Issuer(颁发者信息)
- CA 机构的名称
- 所在国家/地区
- 机构邮箱等
Validity(有效期)
- Not Before: 生效时间
- Not After: 过期时间
Subject(使用者信息)
- 网站域名
- 公司名称
- 所在地等
2. 公钥信息部分
Public Key(公钥)
- 用于加密通信的公钥
Public Key Algorithm(公钥算法)
- RSA
- ECC 等
3. 签名信息部分
Signature Algorithm(签名算法)
- SHA256 with RSA
- SHA1 with RSA 等
CA Signature(CA 签名)
- CA 对证书内容的签名
- 用于验证证书完整性
生活中的比喻
可以把数字证书比作一个"电子身份证":
就像身份证包含:
1. 基本信息
- 姓名 → 域名
- 身份证号 → 序列号
- 有效期 → 证书有效期
- 发证机关 → CA 机构
2. 身份认证
- 照片 → 公钥
- 防伪标记 → CA 签名
3. 其他信息
- 地址 → 企业信息
- 身份证等级 → 证书等级
证书验证过程
sequenceDiagram
participant Client as 客户端
participant Cert as 证书
participant CA as CA机构
Client->>Cert: 1. 检查有效期
Client->>Cert: 2. 验证域名
Client->>CA: 3. 验证 CA 签名
CA-->>Client: 4. 返回验证结果
Note over Client: 5. 决定是否信任证书
不同等级的证书
1. DV 证书 (Domain Validation)
- 仅验证域名所有权
- 适合个人网站
- 价格便宜,安全性一般
2. OV 证书 (Organization Validation)
- 验证组织机构真实性
- 适合企业网站
- 价格适中,安全性好
3. EV 证书 (Extended Validation)
- 最严格的验证
- 适合银行等金融机构
- 价格最贵,安全性最高
为什么需要证书?
-
身份认证
- 防止钓鱼网站
- 确认网站真实性
-
数据完整性
- 防止数据被篡改
- 确保信息真实
-
密钥交换
- 安全传输公钥
- 防止中间人攻击
这就像现实生活中:
- 身份证用于证明身份
- 防伪标记防止伪造
- 政府作为可信第三方
通过这样的机制,确保了网络通信的安全性和可靠性。
2. HTTPS、UDP、Socket 的区别
-
HTTPS:
- 是一个应用层协议
- 基于 HTTP 协议,但增加了 SSL/TLS 加密层
-
UDP:
- 是传输层协议
- 无连接,不可靠传输
- 速度快,适合视频直播等场景
-
Socket:
- 不是协议,是编程接口(API)
- 可以支持 TCP 或 UDP
- 是应用程序与网络协议栈的接口
3. HTTP 网络请求过程
-
DNS 解析:
- 将域名解析为 IP 地址
-
TCP 连接:
- 客户端和服务器建立 TCP 三次握手
-
发送 HTTP 请求:
- 客户端发送请求头和请求体
-
服务器处理请求:
- 服务器解析请求
- 处理业务逻辑
-
返回响应:
- 服务器返回响应头和响应体
-
断开连接:
- 如果是非持久连接,则断开 TCP 连接
4. TCP 三次握手和四次挥手
三次握手:
- 客户端发送 SYN
- 服务器返回 SYN+ACK
- 客户端发送 ACK
四次挥手:
- 客户端发送 FIN
- 服务器返回 ACK
- 服务器发送 FIN
- 客户端返回 ACK
三次握手和四次挥手流程图:
TCP 三次握手流程图
sequenceDiagram
participant Client as 客户端
participant Server as 服务器
Note over Client,Server: 三次握手过程
Client->>Server: SYN=1, seq=x
Note left of Client: CLOSED→SYN_SENT
Server->>Client: SYN=1, ACK=1, seq=y, ack=x+1
Note right of Server: LISTEN→SYN_RCVD
Client->>Server: ACK=1, seq=x+1, ack=y+1
Note left of Client: SYN_SENT→ESTABLISHED
Note right of Server: SYN_RCVD→ESTABLISHED
TCP 四次挥手流程图
sequenceDiagram
participant Client as 客户端
participant Server as 服务器
Note over Client,Server: 四次挥手过程
Client->>Server: FIN=1, seq=u
Note left of Client: ESTABLISHED→FIN_WAIT_1
Server->>Client: ACK=1, ack=u+1
Note right of Server: ESTABLISHED→CLOSE_WAIT
Note left of Client: FIN_WAIT_1→FIN_WAIT_2
Server->>Client: FIN=1, seq=w
Note right of Server: CLOSE_WAIT→LAST_ACK
Client->>Server: ACK=1, ack=w+1
Note left of Client: FIN_WAIT_2→TIME_WAIT
Note right of Server: LAST_ACK→CLOSED
Note left of Client: 等待 2MSL 后
Note left of Client: TIME_WAIT→CLOSED
说明:
三次握手过程解释:
- 客户端发送 SYN 包(seq=x)给服务器,进入 SYN_SENT 状态
- 服务器收到 SYN 包,回复 SYN+ACK 包(seq=y, ack=x+1),进入 SYN_RCVD 状态
- 客户端收到 SYN+ACK 包,回复 ACK 包(seq=x+1, ack=y+1),双方进入 ESTABLISHED 状态
四次挥手过程解释:
- 客户端发送 FIN 包(seq=u),进入 FIN_WAIT_1 状态
- 服务器收到 FIN 包,回复 ACK 包(ack=u+1),进入 CLOSE_WAIT 状态
- 服务器发送 FIN 包(seq=w),进入 LAST_ACK 状态
- 客户端收到 FIN 包,回复 ACK 包(ack=w+1),进入 TIME_WAIT 状态
- 客户端等待 2MSL 后,进入 CLOSED 状态
注意:
- MSL(Maximum Segment Lifetime)是报文最大生存时间
- TIME_WAIT 状态持续 2MSL 的原因是确保最后一个 ACK 能够到达服务器端
- 如果 ACK 丢失,服务器会重发 FIN 包,客户端还能够重发 ACK
让我用生活中的例子来形象解释这些网络包的含义:
SYN 包 (Synchronization)
同步包 - 相当于打招呼 "你好,我想和你说话"
🤝 生活场景举例:
小明:(举手)"同学,你好!能和你说话吗?"
- 这就像发送 SYN 包,表示想建立连接
ACK 包 (Acknowledgement)
确认包 - 相当于回应 "好的,我收到了"
👌 生活场景举例:
小红:(点头)"好的,我听到了!"
- 这就像发送 ACK 包,表示确认收到消息
FIN 包 (Finish)
结束包 - 相当于说 "再见,我要走了"
👋 生活场景举例:
小明:"我要回家了,再见!"
- 这就像发送 FIN 包,表示要断开连接
形象化解释三次握手过程:
场景:小明和小红在微信上加好友
1. 小明:你好,我是小明,可以加你好友吗?(SYN)
- 就像发送好友申请
2. 小红:你好小明,我是小红,当然可以!(SYN + ACK)
- 就像同意了好友申请,并自我介绍
3. 小明:太好了小红,我们已经是好友啦!(ACK)
- 确认已经成为好友
形象化解释四次挥手过程:
场景:结束微信聊天
1. 小明:我要睡觉了哦 (FIN)
- 表示想结束对话
2. 小红:好的,我知道了 (ACK)
- 表示收到小明要睡觉的消息
3. 小红:等等,我也要说晚安!(FIN)
- 表示小红这边也要结束了
4. 小明:晚安啦!(ACK)
- 最后的告别
各种包的标志位:
SYN = 1:我要建立连接
ACK = 1:我确认收到了
FIN = 1:我要断开连接
为什么要这样设计?
就像在现实生活中:
- 不能突然开始说话(需要 SYN)
- 不能不回应对方(需要 ACK)
- 不能突然走人(需要 FIN)
- 要有礼貌地道别(需要最后的 ACK)
这样的设计保证了网络通信的可靠性,就像人与人之间礼貌的交往一样,需要合适的开始,明确的回应,以及得体的结束。
5. HTTP 为什么可靠
HTTP 本身并不可靠,它的可靠性来自于底层的 TCP 协议:
- TCP 提供了确认机制
- 提供重传机制
- 提供序号机制确保数据顺序
- 提供流量控制
6. TCP/IP 协议分层
TCP/IP 四层模型:
- 应用层:HTTP、FTP、SMTP 等
- 传输层:TCP、UDP
- 网络层:IP
- 网络接口层:以太网等
- TCP 属于传输层
- HTTP 属于应用层
7. POST 请求参数位置
POST 请求参数在请求体(Request Body)中,具体可以有几种形式:
application/x-www-form-urlencoded
application/json
multipart/form-data
text/plain
请求参数不会像 GET 请求那样显示在 URL 中,而是在请求体中传输,这样更安全且可以传输更多数据。