计算机网络

A 级 · 高频考点 · HTTP 协议演进详见 网易腹稿 · 网络优化

1 HTTP 协议

HTTP/1.1 vs HTTP/2 vs HTTP/3 核心区别?
HTTP/1.1:文本协议,keep-alive 连接复用,但有队头阻塞(一个请求卡住后面排队)。
HTTP/2:二进制分帧,多路复用(一个 TCP 连接并行传多个请求),头部压缩(HPACK),服务器推送。但 TCP 层仍有队头阻塞。
HTTP/3:基于 QUIC(UDP),彻底解决 TCP 队头阻塞,0-RTT/1-RTT 快速建连,连接迁移(切 WiFi 不断连)。
常见 HTTP 状态码?
2xx 成功:200 OK · 201 Created · 204 No Content
3xx 重定向:301 永久 · 302 临时 · 304 Not Modified(缓存命中)
4xx 客户端错误:400 Bad Request · 401 Unauthorized(未认证)· 403 Forbidden(无权限)· 404 Not Found · 405 Method Not Allowed · 429 Too Many Requests
5xx 服务端错误:500 Internal Error · 502 Bad Gateway · 503 Service Unavailable · 504 Gateway Timeout

面试重点:301 vs 302(SEO 影响)、401 vs 403(认证 vs 授权)、304 的协商缓存机制。

GET 和 POST 的区别?
语义区别:GET 获取资源(幂等),POST 提交数据(非幂等)。
参数位置:GET 在 URL query string,POST 在 body。
缓存:GET 可被缓存,POST 默认不缓存。
长度限制:GET 受 URL 长度限制(浏览器约 2KB-8KB),POST 无限制。
安全性:两者本质都不安全,HTTPS 才是保障。GET 参数暴露在 URL 更容易泄露。

高级追问:POST 也可以用 URL 参数,GET 也可以有 body(技术上),区别主要是语义和浏览器/服务器的默认行为。

2 HTTPS 与 TLS

HTTPS 的工作原理?TLS 握手过程?
HTTPS = HTTP + TLS 加密层。TLS 握手的核心是非对称加密交换密钥 + 对称加密传输数据

TLS 1.2 握手(简化):

  • Client Hello:发送支持的加密套件、随机数 A
  • Server Hello:选定加密套件、发送证书、随机数 B
  • 客户端验证证书 → 生成预主密钥(Pre-Master Secret)→ 用服务器公钥加密发送
  • 双方用 随机数A + 随机数B + 预主密钥 计算出对称密钥
  • 之后用对称密钥加密通信

TLS 1.3 改进:1-RTT 握手(合并步骤),移除不安全算法,支持 0-RTT 恢复。

对称加密 vs 非对称加密?
对称加密(AES):加解密用同一把密钥,速度快,适合大量数据。问题是密钥如何安全传输。
非对称加密(RSA/ECC):公钥加密、私钥解密,安全但慢。用于密钥交换和数字签名。
HTTPS 的方案:用非对称加密交换对称密钥,再用对称密钥加密通信 → 兼顾安全和性能。

3 缓存策略

强缓存 vs 协商缓存?
强缓存:浏览器直接用缓存,不发请求。通过 Cache-Control: max-age=31536000Expires 控制。
协商缓存:浏览器发请求问服务器"资源变了吗?",没变返回 304,用缓存。通过 ETag / If-None-MatchLast-Modified / If-Modified-Since 控制。

优先级:Cache-Control > Expires;ETag > Last-Modified。

最佳实践:HTML 用协商缓存(可能更新);JS/CSS/图片用强缓存 + 文件名 hash(内容变 hash 变 → 自动失效)。

Cache-Control 常见字段?
max-age=N:缓存 N 秒
no-cache:可缓存但每次用前必须验证(走协商缓存)
no-store:完全不缓存
private:仅浏览器可缓存
public:CDN 等中间代理也可缓存
immutable:明确表示资源不会变(配合 hash 文件名)

4 跨域

什么是同源策略?为什么需要?
同源:协议 + 域名 + 端口 三者完全相同。浏览器限制不同源的页面访问彼此的 DOM、Cookie、发送 AJAX 请求。目的是防止恶意网站读取其他网站的敏感数据。
CORS 简单请求 vs 预检请求?
简单请求:GET/HEAD/POST + Content-Type 为 text/plain、multipart/form-data、application/x-www-form-urlencoded + 无自定义头 → 直接发,响应头 Access-Control-Allow-Origin 允许即可。
预检请求(Preflight):不满足简单请求条件 → 先发 OPTIONS 请求询问服务器,服务器返回允许的方法/头/源,浏览器确认后才发真实请求。

服务端关键响应头:

  • Access-Control-Allow-Origin:允许的源(不推荐用 *)
  • Access-Control-Allow-Methods:允许的方法
  • Access-Control-Allow-Headers:允许的自定义头
  • Access-Control-Allow-Credentials:是否允许带 Cookie
  • Access-Control-Max-Age:预检结果缓存时间

6 TCP

TCP 三次握手 / 四次挥手?
三次握手(建立连接):
① Client → SYN → Server
② Server → SYN+ACK → Client
③ Client → ACK → Server
四次挥手(断开连接):
① Client → FIN → Server(我发完了)
② Server → ACK → Client(收到)
③ Server → FIN → Client(我也发完了)
④ Client → ACK → Server(收到),等待 2MSL 后关闭
为什么是三次握手?两次不行吗?
两次握手无法确认客户端的接收能力。如果第一次 SYN 因为网络延迟重发了,服务端收到旧的 SYN 后直接建连,但客户端根本没有发起这次连接,就会浪费服务器资源。三次握手确保双方都确认了对方的发送和接收能力。

7 DNS

DNS 解析流程?
浏览器缓存 → OS 缓存(hosts 文件)→ 本地 DNS 服务器 → 根域名服务器 → 顶级域名服务器(.com)→ 权威域名服务器 → 返回 IP。

前端优化:<link rel="dns-prefetch" href="//cdn.example.com"> 提前解析域名,减少首次请求延迟。