应用层:HTTP、HTTPS 与 DNS
4.1 HTTP 基础
HTTP 报文结构:
- 请求报文:请求行(方法 + URL + 版本)→ 请求头部 → 空行 → 请求体;
- 响应报文:状态行(版本 + 状态码 + 短语)→ 响应头部 → 空行 → 响应体。
常用方法:GET(获取)、POST(提交)、PUT(整体替换)、DELETE(删除)、PATCH(部分更新)、HEAD(只要响应头)、OPTIONS(询问支持的方法,CORS 预检用)。
GET 与 POST 的区别:语义上 GET 幂等(获取不改状态)且可缓存,POST 不幂等;GET 参数放 URL,POST 放 body;「GET 有长度限制」其实是浏览器和服务器的 URL 长度限制,HTTP 协议本身不限制;安全性上 URL 会记日志,都不算加密,机密数据一律走 HTTPS。
常见状态码(必背):
| 类别 | 含义 | 常见码 |
|---|---|---|
| 1xx | 信息 | 101 Switching Protocols(WebSocket 升级) |
| 2xx | 成功 | 200 OK、204 无内容、206 断点续传 |
| 3xx | 重定向 | 301 永久重定向、302 临时、304 命中协商缓存 |
| 4xx | 客户端错误 | 400 请求语法错、401 未认证、403 禁止访问、404 未找到、405 方法不允许 |
| 5xx | 服务端错误 | 500 内部错误、502 网关收到无效响应、503 服务不可用、504 网关超时 |
502 与 504 的区别(排障高频):两者都是网关/代理(如 Nginx)返回的——502 Bad Gateway 表示后端返回了无效响应或连接被拒(后端进程挂了、端口没人监听);504 Gateway Timeout 表示后端在超时时间内没返回(后端太慢、卡死、数据库慢查询)。
4.2 HTTP/1.1
- 长连接(Keep-Alive):默认开启,一个 TCP 连接可复用多个请求,避免每次都三次握手,降低时延与开销;
- 管线化(Pipelining):可连续发多个请求不等响应,但因存在队头阻塞问题,浏览器默认禁用,实际很少用;
- 队头阻塞(HOL Blocking):同一连接上请求必须按序处理,前一个响应慢会阻塞后面所有请求;浏览器用「开多个并行连接(6 个左右)」来缓解;
- Cookie/Session:HTTP 无状态,用 Cookie(存客户端)维持会话状态。
4.3 HTTP 缓存(必考:强缓存 + 协商缓存)
浏览器拿资源时的完整判断流程:
- 先查强缓存:未过期 → 直接使用本地缓存(状态 200,from cache),不发请求;
- 强缓存过期 → 发请求走协商缓存:带
If-Modified-Since/If-None-Match询问服务器资源是否变了; - 服务器判定未变 → 返回 304 Not Modified(无 body),浏览器继续用本地缓存;
- 资源变了 → 返回 200 + 新资源。
强缓存字段:
Cache-Control(HTTP/1.1,优先级高):max-age=秒(相对时间)、no-cache(跳过强缓存,直接协商)、no-store(完全不缓存)、public/private、s-maxage(仅代理缓存);Expires(HTTP/1.0):绝对时间Expires: Wed, 21 Oct 2026 07:28:00 GMT,受客户端时钟影响,优先级低于 Cache-Control。
协商缓存字段(两对,按优先级):
ETag / If-None-Match(优先):服务器给资源算唯一指纹(哈希),浏览器下次带上If-None-Match: 指纹,服务器比对;Last-Modified / If-Modified-Since:资源的最后修改时间,精度只有秒,且「内容没变但时间变了」会误判,所以 ETag 更准。
4.4 HTTP/2
针对 HTTP/1.1 队头阻塞与头部冗余的四大改进:
- 二进制帧:报文拆成二进制帧传输(帧 = 最小单位),解析更高效;
- 多路复用:一条 TCP 连接上并行传输多个 Stream,彼此不阻塞,彻底解决 HTTP 层队头阻塞;
- 头部压缩(HPACK):客户端与服务端维护头部索引表,重复的头部只传索引;
- 服务器推送:服务器可主动推送客户端「将来可能需要」的资源(如 CSS)。
遗留问题:HTTP/2 只解决应用层队头阻塞,TCP 层队头阻塞仍在——任何一个 TCP 包丢失,整条连接上所有流都得等待重传。这催生了 HTTP/3。
4.5 HTTP/3(QUIC)
- 基于 UDP 重新实现可靠传输 + 加密,绕开 TCP 的历史包袱;
- 彻底解决队头阻塞:不同 Stream 独立可靠传输,丢包只影响所在流;
- 0/1-RTT 建连:把传输层握手与 TLS 握手合并,首次 1-RTT、重连可 0-RTT;
- 连接迁移:用 Connection ID 标识连接而非「IP + 端口」四元组,Wi-Fi 切 4G 连接不断;
- 拥塞控制可插拔,默认支持更优的算法。
4.6 HTTPS(必考)
HTTP 明文的风险:窃听(内容裸奔)、篡改(运营商插广告)、冒充(假网站)——对应需要加密、完整性校验、身份认证。
加密体系:
- 对称加密(AES/ChaCha20):加解密同一把钥匙,快,适合大量数据;难题是密钥如何安全分发;
- 非对称加密(RSA/ECC):公钥加密、私钥解密,安全但慢,只用于交换对称密钥;
- 混合加密方案:用非对称加密安全地协商出对称会话密钥,之后全程用对称加密通信。
数字证书与 CA:
- 证书里存了什么:持有人信息(域名等)、持有人公钥、有效期、签发机构 CA、签名算法、CA 的数字签名(CA 用私钥对证书摘要加密生成);
- 浏览器内置受信任 CA 的根证书(含公钥),收到服务器证书后用 CA 公钥验签,同时校验域名匹配、有效期、吊销状态(CRL/OCSP),全部通过才信任;
- 证书链:根 CA → 中间 CA → 网站证书,逐级验签。
TLS 握手流程(以经典 RSA 密钥交换为例,TLS 1.2):
- ClientHello:客户端发送随机数 C、支持的 TLS 版本与加密套件;
- ServerHello:服务端发送随机数 S、选定套件 + 数字证书;
- 客户端验证证书 → 生成预主密钥,用服务器公钥加密后发送;
- 双方用「随机数 C + 随机数 S + 预主密钥」计算出相同的会话密钥;
- 之后所有应用数据用会话密钥对称加密传输。
(TLS 1.3 进一步优化为 1-RTT,握手即加密;重连可 0-RTT。)
中间人攻击与防御:攻击者伪造证书/代理流量冒充服务器。证书防中间人的原理:攻击者拿不到受信 CA 的私钥,伪造的证书验签不过;用户自己忽略证书告警才会中招。加固:HSTS(强制 HTTPS,防降级剥离)。
HTTPS 是四层还是七层? HTTPS = HTTP + TLS。TLS 工作在传输层之上、应用层之下(相当于 OSI 的表示层)。做负载均衡时:四层 LB 只透传加密流量(不解密),七层 LB 做 TLS 卸载(解密后再转发给后端)——这是运维场景的标准答法。
4.7 DNS:域名解析
解析顺序(从浏览器输入域名开始):浏览器 DNS 缓存 → 系统缓存 / hosts 文件(优先级高于 DNS 服务器)→ 本地 DNS 服务器(运营商或公共 DNS 如 114.114.114.114、8.8.8.8)→ 若无缓存则代为迭代查询。
递归查询 vs 迭代查询:
- 递归:客户端 → 本地 DNS:「你必须给我最终答案」(客户端只问一次);
- 迭代:本地 DNS → 根服务器 → 顶级域(.com)服务器 → 权威 DNS(example.com 的 NS),逐级问「谁知道」,最后拿到 A 记录返回客户端。
常见记录类型:A(IPv4)、AAAA(IPv6)、CNAME(别名→另一域名)、MX(邮件)、NS(该域的权威服务器)、PTR(反向解析)。
DNS 用什么传输层协议:查询走 UDP 53(小报文、追求快);响应超过 512 字节或区域传送(zone transfer)用 TCP 53。
DNS 污染/劫持:污染——查询路径上的设备伪造应答返回假 IP;劫持——运营商 DNS 插广告。防御:用可信公共 DNS、DoH(DNS over HTTPS)、DoT(DNS over TLS)。
4.8 其他常用协议
| 协议 | 端口 | 传输层 | 要点 |
|---|---|---|---|
| FTP | 21 控制 / 20 数据 | TCP | 明文、双连接(控制+数据),被动模式开放高位端口 |
| SFTP | 22 | TCP | 基于 SSH 的文件传输,加密,与 FTP 是两套东西 |
| SSH | 22 | TCP | 加密远程登录/隧道/端口转发,公钥认证 |
| DHCP | 67/68 | UDP | 动态分配 IP,四步 DORA:Discover → Offer → Request → ACK |
| Telnet | 23 | TCP | 明文远程登录(不安全,被 SSH 取代) |
| SMTP/POP3/IMAP | 25/110/143 | TCP | 邮件发送 / 收取 |
4.9 高频面试题
Q1:HTTP 缓存整套流程,浏览器拿到资源先看哪个? 先查强缓存(Cache-Control 优先于 Expires),未过期直接用;过期后走协商缓存(ETag/If-None-Match 优先于 Last-Modified/If-Modified-Since),命中返回 304。见 4.3。
Q2:HTTPS 握手过程,证书里面存了什么? 见 4.6:握手四步(随机数交换 → 证书 → 公钥加密的预主密钥 → 会话密钥);证书含持有人信息、公钥、有效期、签发 CA、签名算法与 CA 签名。
Q3:从浏览器输入域名到拿到 IP(DNS 解析全过程)? 缓存链(浏览器→系统→hosts)→ 本地 DNS 递归代查 → 根 → 顶级域 → 权威 → 返回 IP 并逐级缓存(TTL 控制缓存时长)。见 4.7。