面试题 - 网络方面

88 阅读8分钟

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. 会话密钥的好处

    • 对称加密速度快
    • 每次会话都不同
    • 即使一次被破解也不影响其他会话
生活中的比喻

可以把整个过程比喻成:

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)
- 最严格的验证
- 适合银行等金融机构
- 价格最贵,安全性最高
为什么需要证书?
  1. 身份认证

    • 防止钓鱼网站
    • 确认网站真实性
  2. 数据完整性

    • 防止数据被篡改
    • 确保信息真实
  3. 密钥交换

    • 安全传输公钥
    • 防止中间人攻击

这就像现实生活中:

- 身份证用于证明身份
- 防伪标记防止伪造
- 政府作为可信第三方

通过这样的机制,确保了网络通信的安全性和可靠性。

2. HTTPS、UDP、Socket 的区别

  • HTTPS

    • 是一个应用层协议
    • 基于 HTTP 协议,但增加了 SSL/TLS 加密层
  • UDP

    • 是传输层协议
    • 无连接,不可靠传输
    • 速度快,适合视频直播等场景
  • Socket

    • 不是协议,是编程接口(API)
    • 可以支持 TCP 或 UDP
    • 是应用程序与网络协议栈的接口

3. HTTP 网络请求过程

  1. DNS 解析

    • 将域名解析为 IP 地址
  2. TCP 连接

    • 客户端和服务器建立 TCP 三次握手
  3. 发送 HTTP 请求

    • 客户端发送请求头和请求体
  4. 服务器处理请求

    • 服务器解析请求
    • 处理业务逻辑
  5. 返回响应

    • 服务器返回响应头和响应体
  6. 断开连接

    • 如果是非持久连接,则断开 TCP 连接

4. TCP 三次握手和四次挥手

三次握手

  1. 客户端发送 SYN
  2. 服务器返回 SYN+ACK
  3. 客户端发送 ACK

四次挥手

  1. 客户端发送 FIN
  2. 服务器返回 ACK
  3. 服务器发送 FIN
  4. 客户端返回 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

说明:

三次握手过程解释

  1. 客户端发送 SYN 包(seq=x)给服务器,进入 SYN_SENT 状态
  2. 服务器收到 SYN 包,回复 SYN+ACK 包(seq=y, ack=x+1),进入 SYN_RCVD 状态
  3. 客户端收到 SYN+ACK 包,回复 ACK 包(seq=x+1, ack=y+1),双方进入 ESTABLISHED 状态

四次挥手过程解释

  1. 客户端发送 FIN 包(seq=u),进入 FIN_WAIT_1 状态
  2. 服务器收到 FIN 包,回复 ACK 包(ack=u+1),进入 CLOSE_WAIT 状态
  3. 服务器发送 FIN 包(seq=w),进入 LAST_ACK 状态
  4. 客户端收到 FIN 包,回复 ACK 包(ack=w+1),进入 TIME_WAIT 状态
  5. 客户端等待 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:我要断开连接

为什么要这样设计?

就像在现实生活中:

  1. 不能突然开始说话(需要 SYN)
  2. 不能不回应对方(需要 ACK)
  3. 不能突然走人(需要 FIN)
  4. 要有礼貌地道别(需要最后的 ACK)

这样的设计保证了网络通信的可靠性,就像人与人之间礼貌的交往一样,需要合适的开始,明确的回应,以及得体的结束。

5. HTTP 为什么可靠

HTTP 本身并不可靠,它的可靠性来自于底层的 TCP 协议:

  • TCP 提供了确认机制
  • 提供重传机制
  • 提供序号机制确保数据顺序
  • 提供流量控制

6. TCP/IP 协议分层

TCP/IP 四层模型:

  1. 应用层:HTTP、FTP、SMTP 等
  2. 传输层:TCP、UDP
  3. 网络层:IP
  4. 网络接口层:以太网等
  • TCP 属于传输层
  • HTTP 属于应用层

7. POST 请求参数位置

POST 请求参数在请求体(Request Body)中,具体可以有几种形式:

  • application/x-www-form-urlencoded
  • application/json
  • multipart/form-data
  • text/plain

请求参数不会像 GET 请求那样显示在 URL 中,而是在请求体中传输,这样更安全且可以传输更多数据。