计算机网络
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/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
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 更容易泄露。
参数位置: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 的方案:用非对称加密交换对称密钥,再用对称密钥加密通信 → 兼顾安全和性能。
非对称加密(RSA/ECC):公钥加密、私钥解密,安全但慢。用于密钥交换和数字签名。
HTTPS 的方案:用非对称加密交换对称密钥,再用对称密钥加密通信 → 兼顾安全和性能。
3 缓存策略
强缓存 vs 协商缓存?
强缓存:浏览器直接用缓存,不发请求。通过
协商缓存:浏览器发请求问服务器"资源变了吗?",没变返回 304,用缓存。通过
Cache-Control: max-age=31536000 或 Expires 控制。协商缓存:浏览器发请求问服务器"资源变了吗?",没变返回 304,用缓存。通过
ETag / If-None-Match 或 Last-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 + 无自定义头 → 直接发,响应头
预检请求(Preflight):不满足简单请求条件 → 先发 OPTIONS 请求询问服务器,服务器返回允许的方法/头/源,浏览器确认后才发真实请求。
Access-Control-Allow-Origin 允许即可。预检请求(Preflight):不满足简单请求条件 → 先发 OPTIONS 请求询问服务器,服务器返回允许的方法/头/源,浏览器确认后才发真实请求。
服务端关键响应头:
Access-Control-Allow-Origin:允许的源(不推荐用 *)Access-Control-Allow-Methods:允许的方法Access-Control-Allow-Headers:允许的自定义头Access-Control-Allow-Credentials:是否允许带 CookieAccess-Control-Max-Age:预检结果缓存时间
5 Cookie / Session / JWT
Cookie 有哪些重要属性?
HttpOnly:禁止 JS 读取(防 XSS 窃取)Secure:仅 HTTPS 下发送SameSite:Strict(完全禁止跨站携带)/ Lax(导航类 GET 请求可带,默认值)/ None(跨站都带,必须配 Secure)Domain / Path:作用范围Max-Age / Expires:过期时间
Session 和 JWT 的区别?
Session:状态存服务端,客户端只持有 session ID(通过 Cookie 传递)。优点是可随时吊销,缺点是有状态、需要存储、分布式下需共享。
JWT:状态存客户端(token 自包含用户信息 + 签名),服务端无状态。优点是天然支持分布式,缺点是无法主动吊销(除非搭配黑名单)、token 可能较大。
JWT:状态存客户端(token 自包含用户信息 + 签名),服务端无状态。优点是天然支持分布式,缺点是无法主动吊销(除非搭配黑名单)、token 可能较大。
面试话术:传统 Web 应用适合 Session;前后端分离、微服务、移动端适合 JWT。实际项目中两者常结合使用。
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 后关闭
① 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"> 提前解析域名,减少首次请求延迟。