网络协议
HTTP 基础
HTTP 作用、特点与协议对比
包含的题目:
- HTTP 的作用是什么?
- HTTP 的特点是什么?
- HTTP 与 HTTPS 的区别是什么?(高频考点)
- HTTP 与 WebSocket 的区别是什么?
详细答案:
HTTP 作用:超文本传输协议,用于客户端和服务器之间的通信,是万维网数据通信的基础。
HTTP 特点:
- 无状态:每次请求独立,服务器不保存客户端状态
- 无连接:每次连接只处理一个请求,响应后断开(HTTP/1.1 支持持久连接)
- 简单快速:请求方法简单,通信速度快
- 灵活:可以传输任意类型数据
- 基于请求/响应:客户端发起请求,服务器返回响应
HTTP vs HTTPS:
| 对比项 | HTTP | HTTPS |
|---|---|---|
| 协议 | 应用层协议 | HTTP + SSL/TLS |
| 端口 | 80 | 443 |
| 安全性 | 明文传输,不安全 | 加密传输,安全 |
| 证书 | 不需要 | 需要数字证书 |
| 性能 | 快 | 稍慢(有加密开销) |
| SEO | 一般 | 有优势(搜索引擎排名) |
HTTPS 加密过程:
- 客户端发起 HTTPS 请求
- 服务器返回数字证书
- 客户端验证证书
- 双方协商加密算法和密钥
- 建立加密连接通信
HTTP vs WebSocket:
- HTTP:单向通信,请求-响应模式,无状态,短连接
- WebSocket:双向通信,全双工,有状态,长连接,适合实时应用
HTTP 版本
HTTP/1.1、HTTP/2.0、HTTP/3.0
包含的题目: 5. HTTP/1.1 的特点 6. HTTP/1.1 的改进有哪些? 7. HTTP/2.0 的特点(高频考点) 8. HTTP/2.0 的改进有哪些? 9. HTTP/3.0 的特点 10. HTTP/3.0 的改进有哪些?
详细答案:
HTTP/1.1 特点:
- 持久连接:默认保持连接,减少握手开销
- 管道化:支持多个请求并行发送(但响应需按序返回)
- 分块传输:支持动态内容传输
- 缓存控制:增强缓存机制
- Host 头:支持虚拟主机
HTTP/2.0 改进:
- 二进制分帧:数据以二进制帧传输,解析效率高
- 多路复用:一个连接并行处理多个请求
- 头部压缩:HPACK 算法压缩头部
- 服务器推送:服务器主动推送资源
- 流量控制:优先级和流量控制
HTTP/3.0 改进:
- 基于 QUIC 协议:UDP 而非 TCP
- 0-RTT 连接建立:减少握手延迟
- 改进的拥塞控制:更智能的流量管理
- 无队头阻塞:独立的数据流
- 连接迁移:IP 变化时保持连接
版本对比:
| 版本 | 传输层 | 关键特性 | 性能 |
|---|---|---|---|
| HTTP/1.1 | TCP | 持久连接、管道化 | 中等 |
| HTTP/2.0 | TCP | 多路复用、头部压缩 | 高 |
| HTTP/3.0 | QUIC/UDP | 0-RTT、无队头阻塞 | 最高 |
HTTP 请求方法
GET、POST、PUT、DELETE 等
包含的题目: 11. HTTP 请求方法有哪些?(高频考点) 12. GET 与 POST 的区别(高频考点) 13. PUT 与 PATCH 的区别 14. 哪些方法是安全的? 15. 哪些方法是幂等的?
详细答案:
常用请求方法:
- GET:获取资源(安全、幂等、可缓存)
- POST:创建资源(不安全、不幂等、不可缓存)
- PUT:替换资源(不安全、幂等、不可缓存)
- DELETE:删除资源(不安全、幂等、不可缓存)
- PATCH:部分更新资源(不安全、不幂等)
- HEAD:获取头部信息(安全、幂等、可缓存)
- OPTIONS:获取支持的请求方法(安全、幂等)
- TRACE:回显请求(安全、幂等)
- CONNECT:建立隧道连接(不安全、不幂等)
GET vs POST:
| 方面 | GET | POST |
|---|---|---|
| 数据位置 | URL 查询字符串 | 请求体 |
| 数据大小 | 有限制(URL 长度限制) | 无限制 |
| 安全性 | 数据可见,不敏感 | 数据隐藏,较安全 |
| 缓存 | 可缓存 | 不可缓存 |
| 幂等性 | 幂等 | 不幂等 |
| 后退/刷新 | 无害 | 重新提交 |
| 书签 | 可收藏 | 不可收藏 |
PUT vs PATCH:
- PUT:替换整个资源,需要提供完整数据
- PATCH:部分更新资源,只发送需要修改的字段
安全方法:GET、HEAD、OPTIONS、TRACE(不修改服务器状态) 幂等方法:GET、HEAD、OPTIONS、TRACE、PUT、DELETE(多次请求效果相同)
HTTP 状态码
状态码分类与含义
包含的题目: 16. HTTP 状态码有哪些?(高频考点) 17. 2xx 状态码的含义 18. 3xx 状态码的含义 19. 301 与 302 的区别 20. 304 状态码的含义 21. 4xx 状态码的含义 22. 401 与 403 的区别 23. 5xx 状态码的含义 24. 502 与 503 的区别
详细答案:
状态码分类:
- 1xx:信息性状态码(请求已接收,继续处理)
- 2xx:成功状态码(请求成功处理)
- 3xx:重定向状态码(需进一步操作)
- 4xx:客户端错误状态码(请求有误)
- 5xx:服务器错误状态码(服务器处理错误)
常用状态码:
2xx 成功:
- 200 OK:请求成功
- 201 Created:资源创建成功
- 204 No Content:请求成功,无内容返回
3xx 重定向:
- 301 Moved Permanently:永久重定向(SEO 权重传递)
- 302 Found:临时重定向(SEO 权重不传递)
- 304 Not Modified:资源未修改,使用缓存
- 307 Temporary Redirect:临时重定向,保持方法
4xx 客户端错误:
- 400 Bad Request:请求语法错误
- 401 Unauthorized:未认证,需身份验证
- 403 Forbidden:已认证,但无权限
- 404 Not Found:资源不存在
- 405 Method Not Allowed:方法不允许
- 429 Too Many Requests:请求过多
5xx 服务器错误:
- 500 Internal Server Error:服务器内部错误
- 502 Bad Gateway:网关错误,上游服务器无效响应
- 503 Service Unavailable:服务不可用
- 504 Gateway Timeout:网关超时
401 vs 403:
- 401:需要身份验证(Authentication)
- 403:身份已验证,但无访问权限(Authorization)
502 vs 503:
- 502:网关/代理服务器收到无效响应
- 503:服务器暂时无法处理请求(过载/维护)
HTTP 请求头与响应头
常用头部字段
包含的题目: 25-35. 请求头与响应头相关题目
详细答案:
常用请求头:
- Accept:客户端可接受的媒体类型
- Accept-Encoding:可接受的内容编码
- Authorization:身份验证信息
- Content-Type:请求体媒体类型
- Cookie:客户端 Cookie
- User-Agent:客户端信息
- Host:目标主机
- Cache-Control:缓存控制
- If-Modified-Since:条件请求(时间)
- If-None-Match:条件请求(ETag)
常用响应头:
- Cache-Control:缓存控制指令
- Content-Type:响应体媒体类型
- Content-Encoding:内容编码
- Set-Cookie:设置 Cookie
- Location:重定向目标
- ETag:资源标识符
- Last-Modified:最后修改时间
- Access-Control-Allow-Origin:CORS 跨域允许
缓存控制示例:
Cache-Control: max-age=3600, public
Cache-Control: no-cache, no-store, must-revalidate
Cache-Control: private, max-age=0
HTTP 缓存
强缓存与协商缓存
包含的题目: 36. 什么是 HTTP 缓存?(高频考点) 37. 什么是强缓存?(高频考点) 38. 什么是协商缓存?(高频考点) 39. Cache-Control 的使用 40. ETag 的使用 41. Last-Modified 的使用 42. 缓存策略的选择
详细答案:
HTTP 缓存类型:
- 强缓存:不向服务器请求,直接使用缓存
- 协商缓存:向服务器验证缓存是否可用
强缓存实现:
# 响应头设置
Cache-Control: max-age=3600
Expires: Wed, 21 Oct 2025 07:28:00 GMT
协商缓存实现:
# 请求头(条件请求)
If-Modified-Since: Tue, 15 Nov 2024 12:45:26 GMT
If-None-Match: "abc123"
# 响应头
ETag: "abc123"
Last-Modified: Tue, 15 Nov 2024 12:45:26 GMT
缓存策略:
- 静态资源:强缓存 + 文件名哈希
- 动态内容:协商缓存或禁用缓存
- API 数据:视情况选择缓存策略
ETag vs Last-Modified:
- ETag:精确,基于内容哈希
- Last-Modified:基于时间,可能不准确(1s 精度)
HTTP 安全
HTTPS、SSL/TLS、常见攻击与防护
包含的题目: 43. 什么是 HTTPS?(高频考点) 44. HTTPS 的原理是什么?(高频考点) 45. SSL/TLS 的作用 46. 数字证书的作用 47. 什么是 XSS 攻击?(高频考点) 48. XSS 攻击的防范方法 49. 什么是 CSRF 攻击?(高频考点) 50. CSRF 攻击的防范方法 51. 什么是点击劫持? 52. 什么是中间人攻击? 53. 什么是 SQL 注入? 54. HTTP 安全头有哪些? 55. Content-Security-Policy 头的使用
详细答案:
HTTPS 原理:
- 证书验证:客户端验证服务器证书
- 密钥交换:双方协商对称加密密钥
- 加密通信:使用对称加密传输数据
- 完整性校验:确保数据未被篡改
SSL/TLS 握手过程:
- Client Hello:客户端支持的加密套件
- Server Hello:服务器选择加密套件
- 证书验证:客户端验证服务器证书
- 密钥交换:生成会话密钥
- 加密通信:开始加密传输
XSS(跨站脚本)攻击:
- 类型:反射型、存储型、DOM 型
- 防范:
- 输入过滤和转义
- 设置 HttpOnly Cookie
- 使用 Content-Security-Policy
- 避免内联事件处理
CSRF(跨站请求伪造)攻击:
- 原理:利用用户已登录状态发起恶意请求
- 防范:
- 使用 CSRF Token
- 检查 Referer/Origin 头
- 设置 SameSite Cookie
- 重要操作使用二次验证
安全头部:
Content-Security-Policy: default-src 'self';
X-Frame-Options: DENY;
X-XSS-Protection: 1; mode=block;
Strict-Transport-Security: max-age=31536000;
Referrer-Policy: no-referrer-when-downgrade;
HTTP 性能优化
优化方法与最佳实践
包含的题目: 56. HTTP 性能优化的方法有哪些? 57. 减少 HTTP 请求的方法 58. 使用 CDN 59. 启用压缩的方法 60. 预加载的实现 61. DNS 预解析的实现
详细答案:
性能优化方法:
- 减少请求数:合并文件、使用雪碧图、懒加载
- 减小资源大小:压缩代码、优化图片、Tree Shaking
- 使用 CDN:分布式缓存,减少延迟
- 启用压缩:Gzip/Brotli 压缩
- 使用缓存:合理设置缓存策略
- HTTP/2:多路复用,头部压缩
- 预加载/预连接:提前获取资源
CDN 优势:
- 减少延迟
- 降低源站压力
- 提高可用性
- 防御 DDoS 攻击
压缩实现:
# 服务器配置
Accept-Encoding: gzip, deflate, br
Content-Encoding: gzip
预加载示例:
<link rel="preload" href="critical.css" as="style">
<link rel="preconnect" href="https://cdn.example.com">
<link rel="dns-prefetch" href="https://api.example.com">
HTTP 跨域
跨域问题与解决方案
包含的题目: 62. 什么是跨域?(高频考点) 63. 什么是同源策略?(高频考点) 64. 跨域的解决方案有哪些?(高频考点) 65. JSONP 的原理是什么? 66. CORS 的原理是什么?(高频考点) 67. 代理服务器的使用 68. postMessage 的使用 69. WebSocket 的使用
详细答案:
同源策略:协议、域名、端口完全相同才属于同源
跨域解决方案:
- JSONP:利用
<script>标签跨域加载脚本 - CORS:服务器设置 Access-Control-Allow-Origin
- 代理服务器:同域服务器转发请求
- postMessage:跨文档通信
- WebSocket:不受同源策略限制
- Nginx 反向代理:配置代理转发
CORS 配置:
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Credentials: true
Access-Control-Max-Age: 86400
简单请求 vs 预检请求:
- 简单请求:GET/HEAD/POST,特定 Content-Type
- 预检请求:OPTIONS 请求,检查是否允许跨域
JSONP 示例:
// 客户端
function handleResponse(data) {
console.log(data);
}
const script = document.createElement('script');
script.src = 'https://api.example.com/data?callback=handleResponse';
// 服务器响应
handleResponse({ data: 'example' });
代理服务器示例:
// Node.js 代理
const proxy = require('http-proxy-middleware');
app.use('/api', proxy({ target: 'http://api.example.com', changeOrigin: true }));
以上是对网络协议 69 道面试题目的综合解答,涵盖了 HTTP 基础、版本、方法、状态码、缓存、安全、性能优化和跨域等核心知识点。