1. HTTP 基础
- 定义:HTTP(HyperText Transfer Protocol)是应用层协议,基于 请求-响应模型,用于客户端(浏览器)与服务器之间的通信。
- 特点:
- 无状态:每次请求独立,服务器不保留客户端状态(通过 Cookie/Session 解决)。
- 明文传输(HTTP) vs 加密传输(HTTPS)。
- 默认端口:HTTP(80),HTTPS(443)。
2. HTTP 方法(Methods)
方法 | 描述 | 幂等性 | 安全性 |
---|---|---|---|
GET | 获取资源,参数在 URL 中 | 是 | 是 |
POST | 提交数据,可能创建资源或触发操作 | 否 | 否 |
PUT | 更新整个资源 | 是 | 否 |
PATCH | 部分更新资源 | 否 | 否 |
DELETE | 删除资源 | 是 | 否 |
HEAD | 获取响应头,无响应体 | 是 | 是 |
幂等性:多次执行结果相同(如 GET、PUT、DELETE)。
安全性:不修改资源(如 GET、HEAD)。
3. HTTP 状态码(Status Codes)
状态码 | 类别 | 常见状态码及含义 |
---|---|---|
1xx | 信息性 | 100(继续) |
2xx | 成功 | 200(OK), 201(Created) |
3xx | 重定向 | 301(永久重定向), 302(临时重定向), 304Not Modified(缓存未修改) |
4xx | 客户端错误 | 400(请求错误), 401(未认证), 403(禁止访问), 404(未找到) |
5xx | 服务器错误 | 500(内部错误), 502(网关错误), 503(服务不可用) |
关键区别:
- 301 vs 302:301 是永久重定向(浏览器缓存),302 是临时重定向。
- 401 vs 403:401 表示未认证,403 表示无权限。
4. HTTP 头部(Headers)
- 通用头部:
Cache-Control
:缓存策略(如max-age=3600
)。Connection
:控制连接(如keep-alive
)。
- 请求头部:
Host
:目标域名。User-Agent
:客户端信息。Authorization
:认证信息(如 Bearer Token)。
- 响应头部:
Content-Type
:响应体类型(如application/json
)。- Content-Length
- Content-Encoding
Set-Cookie
:设置 Cookie。
- 缓存相关:
ETag
:资源标识,用于协商缓存。Last-Modified
:资源最后修改时间。
5. HTTP vs HTTPS
- HTTPS = HTTP + SSL/TLS 加密。
- 加密流程:
- 客户端发送请求,服务器返回证书。
- 客户端验证证书,生成对称密钥并用公钥加密发送。
- 服务器用私钥解密,后续通信使用对称加密。
- HTTP问题:无状态,明文传输,不安全
- HTTP的风险:窃听、篡改、冒充
- HTTPS如何解决的:信息加密、校验机制、身份证书
6. HTTP 缓存机制
- 强制缓存(无需请求服务器):
Cache-Control: max-age=3600
(优先级高于Expires
)。
- 协商缓存(需请求服务器验证):
Last-Modified
+If-Modified-Since
(时间戳)。ETag
+If-None-Match
(唯一标识,精度更高)。
缓存流程:
强缓存生效 → 直接返回本地缓存;
强缓存失效 → 发起请求,验证协商缓存 → 返回 304 或新内容。
7. HTTP/1.1 vs HTTP/2 vs HTTP/3
- HTTP/1.1:
- 持久连接(默认
Connection: keep-alive
)。 - 队头阻塞(同一连接需顺序处理请求)。
- 持久连接(默认
- HTTP/2:
- 多路复用(一个连接并行处理多个请求)。
- 头部压缩(HPACK)。
- 二进制传输。
- 服务器推送(Server Push)。
- HTTP/3:
- 基于 QUIC 协议(UDP 实现,解决队头阻塞)。
- 更快握手(0-RTT)。
8. 安全相关
- CSRF(跨站请求伪造):
- 防御:Token 验证、SameSite Cookie 属性。
- XSS(跨站脚本攻击):
- 防御:输入过滤、输出转义、CSP(内容安全策略)。
9. Cookie 和 Session
- Cookie:客户端存储,通过
Set-Cookie
设置,每次请求自动携带。 - Session:服务端存储用户状态,Session ID 通过 Cookie 传递。
- 区别:
- Cookie 不安全(可篡改),Session 较安全但需服务器存储。
- 分布式系统中 Session 需共享存储(如 Redis)。
10. RESTful API 设计
- 资源定位:URL 表示资源(如
/users/123
)。 - HTTP 方法对应操作:GET(查)、POST(增)、PUT(改)、DELETE(删)。
- 状态码语义化:200(成功)、201(创建)、400(错误请求)等。
- 版本控制:通过 URI(
/v1/users
)或头部(Accept-Version: v1
)。
11. 性能优化
- 减少请求次数:合并资源(CSS/JS)、雪碧图。
- 使用 CDN 加速静态资源。
- 压缩资源:Gzip、Brotli。
- 启用 HTTP/2 多路复用。
12.http与websocket
- websocket是全双工通信,适用于实时应用
高频面试题
- GET 和 POST 的区别?
- HTTP 状态码 301 和 302 的区别?
- 如何实现 Cookie 的安全性(Secure/HttpOnly/SameSite)?
- 浏览器缓存机制是怎样的?
- HTTP/2 如何提升性能?
- HTTP如何解决“粘包”的问题的?
- HTTP 协议通过设置回车符、换行符作为 HTTP header 的边界,通过 Content-Length 字段作为HTTP body 的边界,这两个方式都是为了解决“粘包”的问题。
1.HTTPS的连接是如何建立的?
步骤一:TCP 连接建立
- 客户端向服务器发起 HTTPS 请求(默认端口 443),开始 TCP 三次握手。
步骤二:TLS 握手(密钥协商)
-
Client Hello
- 客户端发送支持的 TLS 版本、加密套件列表(如 RSA、ECDHE)、客户端随机数(Client Random)。
-
Server Hello
- 服务器选择加密套件,返回服务器随机数(Server Random)和数字证书(包含公钥、域名、颁发机构等信息)。
-
证书验证
- 客户端验证证书的合法性(如是否过期、域名匹配、证书链是否可信等)。
-
生成预主密钥
- 客户端生成一个随机数 预主密钥(Pre-Master Secret),用服务器公钥加密后发送给服务器。
-
生成会话密钥
- 服务器用私钥解密获取预主密钥,结合 Client Random 和 Server Random,双方通过算法生成相同的 对称会话密钥(Session Key)。
步骤三:加密通信
- 后续所有 HTTP 数据均使用 对称加密(如 AES) 传输,会话密钥仅在此次连接中有效,确保高效和安全。
关键词:
- 非对称加密:用于安全交换对称密钥(RSA/ECDHE)。
- 对称加密:用于高效加密实际数据(AES)。
- 证书验证:防止中间人攻击,确保服务器身份可信。