网络题失分往往不是不会,而是只给结论不给链路。这份清单按「结论—展开—追问」三层组织,目标是每道题都能稳稳撑满一分钟。
网络题的回答分三层,少一层就显得"背过但没懂":
| 层次 | 内容 | 时长 |
|---|---|---|
| 结论 | 一句话给出判断,先让面试官确认方向对了 | 5 秒 |
| 机制 | 按时间顺序或数据流向展开,带关键字段与报文 | 40 秒 |
| 边界 | 主动补失效场景、版本差异、相邻方案对比 | 15 秒 |
三个常见扣分点:只背名词不画链路;把"协议层的队头阻塞"和"TCP 层的队头阻塞"混为一谈;把"缓存命中"等同于"不发请求"。
一句话:DNS 拿 IP,TCP 建连,TLS 协商密钥,HTTP 收发报文,浏览器解析渲染;中间还有重定向、缓存、并发连接调度。
展开(1 分钟)
追问会怎么问
一句话:三次握手是为了双向确认序列号并排除历史连接;四次挥手是因为 TCP 全双工,两个方向要各自关闭。
三次握手
Client → Server: SYN, seq=x
Server → Client: SYN+ACK, seq=y, ack=x+1
Client → Server: ACK, ack=y+1
四次挥手
Client → Server: FIN
Server → Client: ACK ← 半关闭,服务端还能继续发数据
Server → Client: FIN
Client → Server: ACK
TIME_WAIT 等 2MSL 的两个理由
追问:大量 TIME_WAIT 怎么办——调 tcp_tw_reuse、用连接池、让服务端主动关;CLOSE_WAIT 多则是应用没调 close()。
一句话:HTTP/1.1 用一条连接串行传,HTTP/2 在一条 TCP 上多路复用,HTTP/3 把复用下沉到 QUIC 的独立流。
| 维度 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 传输 | 文本 | 二进制分帧 | 二进制,跑在 QUIC 上 |
| 并发 | 6 个连接左右,靠域名分片 | 单连接多路复用 | 单连接多路复用 |
| 队头阻塞 | 应用层:前一个响应不回来后面等着 | 应用层解决,TCP 层仍在 | 流级独立,彻底消除 |
| 头压缩 | 无 | HPACK | QPACK |
| 建连 | TCP + TLS 两轮以上 | TCP + TLS,可 TLS1.3 减一轮 | 1-RTT,重连可 0-RTT |
两个层面的队头阻塞
QUIC 为什么基于 UDP
一句话:非对称只用来安全地协商出对称密钥,真正的数据全程用对称加密。
TLS 1.2(两次往返)
TLS 1.3 把密钥交换统一到 ECDHE,删掉 RSA 密钥交换与不安全的套件,压缩到 1-RTT;会话恢复可 0-RTT,代价是有重放风险。
为什么分工:非对称运算慢、有长度限制,只适合少量数据;对称加密快几个数量级,适合持续传输。
证书链校验:叶子证书 → 中间 CA → 根 CA。浏览器只内置根证书,逐级验证签名、有效期、域名(SAN)与用途(KeyUsage),再查吊销状态(CRL / OCSP)。
追问:中间人能不能伪造——不能,缺的是根 CA 的私钥;自签证书为什么会红——链到不了受信根。
一句话:强缓存决定"要不要发请求",协商缓存决定"发了之后能不能用旧的"。
| 响应头 | 语义 | 备注 |
|---|---|---|
Cache-Control: max-age=31536000 | 相对过期时间 | 优先级高于 Expires |
no-cache | 可存但每次必须协商 | 不是不缓存 |
no-store | 完全不存 | 敏感页面 |
public / private | 能否被 CDN 缓存 | private 只给浏览器 |
immutable | 有效期内不刷新 | 配合 hash 文件名 |
s-maxage | 专给共享缓存 | 覆盖 max-age |
stale-while-revalidate | 先给旧的,后台更新 | 提升体验 |
协商缓存
Last-Modified / If-Modified-Since:精度到秒,文件内容变了但 mtime 没变会误判。ETag / If-None-Match:内容指纹,精度高,多部署节点要保证算法一致,否则缓存失效。from disk cache 与 from memory cache
追问:为什么线上发版后用户还是旧页面——index.html 被缓存了,需要给它 no-cache。
一句话:跨域限制的是"读取响应",不是"发出请求";CORS 是服务端授权浏览器放宽这个限制。
Content-Type 仅限 text/plain、multipart/form-data、application/x-www-form-urlencoded。OPTIONS 预检,带 Access-Control-Request-Method 与 Access-Control-Request-Headers。| 响应头 | 作用 |
|---|---|
Access-Control-Allow-Origin | 允许的来源,* 或具体域名 |
Access-Control-Allow-Methods | 预检通过的方法 |
Access-Control-Allow-Headers | 预检通过的请求头 |
Access-Control-Allow-Credentials | 是否允许携带 Cookie |
Access-Control-Max-Age | 预检结果缓存时长 |
Access-Control-Expose-Headers | 允许 JS 读取的响应头 |
Cookie 跨域为什么必须具体域名
Allow-Origin: * 与 Allow-Credentials: true 互斥。带凭证时若还允许通配,任意站点都能借用户的 Cookie 读取数据,等于同源策略失效。所以需要:请求侧 withCredentials = true 或 credentials: 'include',响应侧 Allow-Origin 回写具体 origin、Allow-Credentials: true,Cookie 自身还要 SameSite=None; Secure。
追问:预检能不能省——Max-Age 内可复用;同源部署、BFF 代理、JSONP 都是绕过方案,各有代价。
| 状态码 | 含义 | 易错点 |
|---|---|---|
| 301 | 永久重定向 | 会被缓存,方法可能被改成 GET |
| 302 | 临时重定向 | 同样可能改方法,别和 307 混 |
| 307 | 临时重定向 | 严格保留原方法 |
| 308 | 永久重定向 | 保留方法,且可被缓存 |
| 304 | 协商缓存命中 | 没有响应体,不能带业务数据 |
| 401 | 未认证 | 没登录或凭证失效,需要认证 |
| 403 | 已认证无权限 | 登录了但不允许访问 |
| 502 | 网关收到上游无效响应 | 上游挂了或返回非法内容 |
| 504 | 网关等待上游超时 | 上游慢,不是网关自己慢 |
判断口诀:3xx 看永久性与是否保方法,4xx 看缺凭证还是缺权限,5xx 看谁坏了。