推荐阅读:
为什么HTTP协议如此重要?
HTTP(HyperText Transfer Protocol)作为互联网的基础协议之一,是每个后端开发者必须深入理解的核心技术。无论是日常开发中的API设计,还是面试中的高频考点,HTTP协议都占据着举足轻重的地位。本文将全面剖析HTTP协议的核心知识点,助你在技术面试中游刃有余。
一、HTTP协议基础
1.1 HTTP协议的本质
HTTP是一种无状态的、应用层的、基于请求与响应模式的协议,它建立在TCP/IP协议之上,默认使用80端口。其核心特点包括:
-
• 无连接:每次连接只处理一个请求(HTTP/1.1后支持持久连接)
-
• 无状态:协议本身不保留之前的请求信息
-
• 灵活:可以传输任意类型的数据对象
1.2 URL与URI
URI(统一资源标识符)是标识资源的字符串,而URL(统一资源定位符)是URI的子集,不仅标识资源,还提供定位资源的方式。
一个完整的URL结构:
协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志
二、HTTP请求与响应
推荐阅读:
2.1 请求报文结构
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
-
• 请求行:方法 + URI + 协议版本
-
• 请求头:若干键值对
-
• 空行
-
• 请求体(GET方法通常没有)
2.2 响应报文结构
HTTP/1.1 200 OK
Date: Mon, 23 May 2022 22:38:34 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 138
Last-Modified: Wed, 08 Jan 2022 23:11:55 GMT
Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux)
Connection: close
<html>
...
</html>
-
• 状态行:协议版本 + 状态码 + 状态描述
-
• 响应头:若干键值对
-
• 空行
-
• 响应体
2.3 常见HTTP方法
方法 | 描述 | 幂等性 | 安全性 |
GET | 获取资源 | 是 | 是 |
POST | 提交数据,可能导致状态变化或副作用 | 否 | 否 |
PUT | 替换目标资源(完整更新) | 是 | 否 |
PATCH | 部分修改资源 | 否 | 否 |
DELETE | 删除指定资源 | 是 | 否 |
HEAD | 类似GET,但只返回头部信息 | 是 | 是 |
OPTIONS | 返回服务器支持的HTTP方法 | 是 | 是 |
CONNECT | 建立隧道连接(用于HTTPS代理) | - | - |
TRACE | 回显服务器收到的请求,用于测试或诊断 | 是 | 是 |
三、HTTP状态码详解
状态码是面试必问的重点,必须熟练掌握:
3.1 1xx(信息性状态码)
-
• 100 Continue:客户端应继续发送请求
-
• 101 Switching Protocols:服务器同意切换协议
3.2 2xx(成功状态码)
-
• 200 OK:请求成功
-
• 201 Created:资源创建成功(通常配合POST/PUT)
-
• 202 Accepted:请求已接受但未处理完成
-
• 204 No Content:成功但无返回内容
-
• 206 Partial Content:部分内容(用于分块下载)
3.3 3xx(重定向状态码)
-
• 301 Moved Permanently:永久重定向
-
• 302 Found:临时重定向
-
• 304 Not Modified:资源未修改(缓存相关)
-
• 307 Temporary Redirect:临时重定向(保持方法不变)
-
• 308 Permanent Redirect:永久重定向(保持方法不变)
3.4 4xx(客户端错误状态码)
-
• 400 Bad Request:请求语法错误
-
• 401 Unauthorized:需要认证
-
• 403 Forbidden:服务器拒绝请求
-
• 404 Not Found:资源不存在
-
• 405 Method Not Allowed:方法不被允许
-
• 408 Request Timeout:请求超时
-
• 429 Too Many Requests:请求过于频繁
3.5 5xx(服务器错误状态码)
-
• 500 Internal Server Error:服务器内部错误
-
• 502 Bad Gateway:网关错误
-
• 503 Service Unavailable:服务不可用
-
• 504 Gateway Timeout:网关超时
四、HTTP头部字段精讲
4.1 通用头部字段
-
• Cache-Control:控制缓存行为
-
•
no-cache
:强制向服务器验证 -
•
no-store
:不缓存任何内容 -
•
max-age=3600
:资源有效期为3600秒
-
-
• Connection:控制不再转发给代理的头部字段/管理持久连接
-
• Date:创建报文的日期时间
4.2 请求头部字段
-
• Host:请求资源所在服务器
-
• Referer:请求来源
-
• User-Agent:客户端信息
-
• Accept:可处理的媒体类型
-
• Authorization:认证信息
-
• If-Modified-Since:比较资源的更新时间
-
• If-None-Match:比较ETag是否一致
4.3 响应头部字段
-
• Location:重定向URI
-
• Server:服务器信息
-
• ETag:资源的匹配信息
-
• WWW-Authenticate:服务器要求客户端的认证信息
4.4 实体头部字段
-
• Content-Type:实体主体的媒体类型
-
• Content-Length:实体主体的大小
-
• Content-Encoding:实体主体的编码方式
-
• Last-Modified:资源的最后修改时间
-
• Expires:实体主体过期的日期时间
-
推荐阅读:
五、HTTP缓存机制
5.1 强缓存
通过Expires或Cache-Control实现,直接从本地缓存读取资源,不发送请求。
Cache-Control: max-age=31536000
Expires: Wed, 21 Oct 2026 07:28:00 GMT
5.2 协商缓存
通过Last-Modified/If-Modified-Since或ETag/If-None-Match实现,需要向服务器验证缓存是否有效。
ETag: "33a64df551425fcc55e4d42a148795d9f25f89d4"
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
5.3 缓存策略最佳实践
-
• HTML文件:
Cache-Control: no-cache
-
• 静态资源(JS/CSS/图片):
Cache-Control: public, max-age=31536000, immutable
-
• API响应:
Cache-Control: no-store
或合适的max-age
六、HTTP安全机制
6.1 HTTPS工作原理
HTTPS = HTTP + SSL/TLS,通过以下机制保证安全:
-
1. 加密:对称加密传输数据
-
2. 认证:数字证书验证服务器身份
-
3. 完整性:防止数据被篡改
6.2 常见安全头部
-
• Strict-Transport-Security:强制HTTPS
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
-
• Content-Security-Policy:内容安全策略
Content-Security-Policy: default-src 'self'
-
• X-Frame-Options:防止点击劫持
X-Frame-Options: DENY
-
• X-XSS-Protection:XSS防护
X-XSS-Protection: 1; mode=block
七、HTTP版本演进
7.1 HTTP/1.0 vs HTTP/1.1
特性 | HTTP/1.0 | HTTP/1.1 |
连接方式 | 非持久连接 | 默认持久连接 |
主机头 | 可选 | 必须 |
缓存机制 | 简单 | 更完善 |
状态码 | 基本状态码 | 新增24个状态码 |
分块传输 | 不支持 | 支持 |
管道化 | 不支持 | 支持(但有问题) |
7.2 HTTP/2核心特性
-
1. 二进制分帧层:数据以二进制帧传输
-
2. 多路复用:一个连接并行处理多个请求
-
3. 头部压缩:HPACK算法减少头部大小
-
4. 服务器推送:服务器可主动推送资源
-
5. 流优先级:可设置请求优先级
7.3 HTTP/3与QUIC协议
HTTP/3基于QUIC协议,主要改进:
-
• 基于UDP而非TCP,减少连接建立时间
-
• 内置TLS 1.3加密
-
• 改进的拥塞控制
-
• 前向纠错(FEC)减少重传
-
• 连接迁移(切换网络不断连)
-
推荐阅读:
八、性能优化实践
8.1 减少HTTP请求
-
• 合并CSS/JS文件
-
• 使用CSS Sprites合并图片
-
• 内联小资源(Base64编码)
8.2 利用缓存
-
• 设置合适的Cache-Control
-
• 使用ETag/Last-Modified
-
• 配置CDN缓存
8.3 压缩传输
-
• 开启Gzip/Brotli压缩
gzip on; gzip_types text/plain application/xml; brotli on; brotli_types text/plain text/css application/json;
-
• 压缩图片资源(WebP格式)
8.4 其他优化
-
• 域名分片(HTTP/2中不推荐)
-
• 预加载关键资源
<link rel="preload" href="style.css" as="style">
-
• 使用HTTP/2服务器推送
九、经典面试题解析
-
1. GET和POST的本质区别是什么?
-
本质区别:GET是幂等的、安全的,而POST不是。实际区别:
-
• GET参数在URL中,长度受限;POST在请求体中,无长度限制
-
• GET可缓存,POST不可缓存
-
• GET不应修改服务器状态,POST可以
-
2. HTTP如何实现长连接?
-
在HTTP/1.1中通过
Connection: keep-alive
实现,HTTP/2则原生支持多路复用。 -
3. HTTPS的握手过程是怎样的?
-
• 客户端发送ClientHello(支持的加密套件、随机数等)
-
• 服务器响应ServerHello(选择的加密套件、随机数)和证书
-
• 客户端验证证书,生成预主密钥并用公钥加密发送
-
• 双方根据随机数和预主密钥生成会话密钥
-
• 完成握手,开始加密通信
-
4. Cookie和Session的区别?
-
• Cookie存储在客户端,Session存储在服务器端
-
• Cookie有大小限制(约4KB),Session理论上无限制
-
• Cookie不安全可能被篡改,Session相对安全
-
5. 什么是跨域?如何解决?
-
跨域是由同源策略引起的限制,解决方案:
-
• JSONP(利用script标签不受同源策略限制)
-
• CORS(现代标准解决方案)
-
• 代理服务器(后端转发请求)
-
• postMessage(窗口间通信)
-
• WebSocket(不受同源策略限制)
推荐阅读: