文章目录
HTTP 协议分析
HTTP(HyperText Transfer Protocol,超文本传输协议)是 Web 通信的基础协议,基于客户端-服务器模型,默认使用 TCP 80 端口(HTTPS 使用 443 端口)。
一、HTTP 请求报文结构
HTTP 请求由 请求行、请求头部、空行 和 请求体 四部分组成。
请求行 → GET /index.html HTTP/1.1
请求头部 → Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html
空行 → (CRLF)
请求体 → (可选,如 POST 数据)
1. 请求行(Request Line)
请求行是请求报文的第一行,包含三个字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| 请求方法 | 表示对资源的操作类型 | GET、POST、PUT、DELETE |
| 请求 URI | 资源的路径和查询参数 | /api/user?id=123 |
| HTTP 版本 | 协议版本号 | HTTP/1.1、HTTP/2.0 |
常用请求方法:
GET:获取资源,幂等,无请求体POST:提交数据(如表单),非幂等,有请求体PUT:上传/更新资源,幂等DELETE:删除资源,幂等HEAD:类似 GET,但只返回头部,不返回响应体PATCH:局部更新资源OPTIONS:查询服务器支持的方法TRACE:回显请求,用于诊断CONNECT:建立隧道(用于 HTTPS 代理)
二、HTTP 响应报文结构
HTTP 响应由 状态行、响应头部、空行 和 响应体 四部分组成。
状态行 → HTTP/1.1 200 OK
响应头部 → Content-Type: text/html; charset=utf-8
Content-Length: 1024
空行 → (CRLF)
响应体 → <html>...</html>
1. 状态行(Status Line)
状态行是响应报文的第一行,包含三个字段:
| 字段 | 说明 | 示例 |
|---|---|---|
| HTTP 版本 | 协议版本号 | HTTP/1.1 |
| 状态码 | 三位数字,表示响应状态 | 200、404、500 |
| 原因短语 | 状态码的文本描述 | OK、Not Found |
常见状态码分类:
| 区间 | 类别 | 含义 |
|---|---|---|
| 1xx | 信息性 | 请求已接收,继续处理 |
| 2xx | 成功 | 请求已成功处理 |
| 3xx | 重定向 | 需要进一步操作以完成请求 |
| 4xx | 客户端错误 | 请求有语法错误或无法完成 |
| 5xx | 服务器错误 | 服务器处理请求时出错 |
常见状态码详解:
| 状态码 | 原因短语 | 说明 |
|---|---|---|
200 | OK | 请求成功 |
201 | Created | 资源创建成功 |
204 | No Content | 成功但无响应体 |
301 | Moved Permanently | 永久重定向 |
302 | Found | 临时重定向 |
304 | Not Modified | 资源未修改,使用缓存 |
400 | Bad Request | 请求语法错误 |
401 | Unauthorized | 需要身份认证 |
403 | Forbidden | 服务器拒绝执行 |
404 | Not Found | 资源不存在 |
405 | Method Not Allowed | 方法不被允许 |
500 | Internal Server Error | 服务器内部错误 |
502 | Bad Gateway | 网关错误 |
503 | Service Unavailable | 服务不可用 |
504 | Gateway Timeout | 网关超时 |
三、常用头部字段
HTTP 头部字段分为 通用头部、请求头部、响应头部 和 实体头部 四类。
1. 通用头部(General Headers)
请求和响应都可使用:
| 字段 | 说明 | 示例 |
|---|---|---|
Date | 报文创建时间 | Date: Tue, 15 Oct 2024 10:30:00 GMT |
Connection | 连接管理 | Connection: keep-alive / close |
Cache-Control | 缓存控制 | Cache-Control: max-age=3600 |
Pragma | 兼容旧缓存(HTTP/1.0) | Pragma: no-cache |
Trailer | 分块传输的尾部字段 | Trailer: Content-MD5 |
Transfer-Encoding | 传输编码方式 | Transfer-Encoding: chunked |
Upgrade | 升级协议 | Upgrade: websocket |
Via | 经过的代理服务器 | Via: 1.1 proxy.example.com |
Warning | 附加警告信息 | Warning: 110 Response is stale |
2. 请求头部(Request Headers)
仅出现在请求报文中:
| 字段 | 说明 | 示例 |
|---|---|---|
Host | 目标主机和端口(HTTP/1.1 必需) | Host: www.example.com:8080 |
User-Agent | 客户端标识 | User-Agent: Mozilla/5.0 (Windows NT 10.0) |
Accept | 客户端能接受的媒体类型 | Accept: text/html, application/json |
Accept-Charset | 接受的字符集 | Accept-Charset: utf-8, iso-8859-1 |
Accept-Encoding | 接受的编码/压缩方式 | Accept-Encoding: gzip, deflate, br |
Accept-Language | 接受的语言 | Accept-Language: zh-CN, en;q=0.9 |
Authorization | 认证凭证 | Authorization: Bearer <token> |
Cookie | 客户端存储的 Cookie | Cookie: sessionId=abc123; theme=dark |
Referer | 请求来源页面的 URL | Referer: https://google.com/ |
Origin | 请求来源(跨域时使用) | Origin: https://foo.example |
If-Match | 资源匹配条件(ETag) | If-Match: "abc123" |
If-None-Match | 资源不匹配条件 | If-None-Match: "abc123" |
If-Modified-Since | 资源修改时间条件 | If-Modified-Since: Sat, 01 Jan 2024 00:00:00 GMT |
If-Unmodified-Since | 资源未修改时间条件 | If-Unmodified-Since: Sat, 01 Jan 2024 00:00:00 GMT |
Range | 请求部分内容 | Range: bytes=0-999 |
Content-Length | 请求体长度(字节) | Content-Length: 256 |
Content-Type | 请求体的媒体类型 | Content-Type: application/json |
X-Requested-With | 异步请求标识 | X-Requested-With: XMLHttpRequest |
3. 响应头部(Response Headers)
仅出现在响应报文中:
| 字段 | 说明 | 示例 |
|---|---|---|
Server | 服务器软件信息 | Server: Apache/2.4.41 (Ubuntu) |
Set-Cookie | 设置 Cookie | Set-Cookie: sessionId=abc123; Path=/; HttpOnly |
Location | 重定向目标 URL | Location: https://www.example.com/new |
ETag | 资源实体标签 | ETag: "abc123def456" |
Last-Modified | 资源最后修改时间 | Last-Modified: Tue, 15 Oct 2024 10:00:00 GMT |
Accept-Ranges | 是否支持范围请求 | Accept-Ranges: bytes |
Content-Range | 响应体的范围 | Content-Range: bytes 0-999/10000 |
WWW-Authenticate | 认证方式质询 | WWW-Authenticate: Basic realm="User Visible Realm" |
Access-Control-Allow-Origin | CORS 允许的源 | Access-Control-Allow-Origin: * |
Access-Control-Allow-Methods | CORS 允许的方法 | Access-Control-Allow-Methods: GET, POST, OPTIONS |
X-Powered-By | 技术栈信息 | X-Powered-By: PHP/7.4 |
X-Frame-Options | 页面是否可被嵌入 iframe | X-Frame-Options: DENY |
X-Content-Type-Options | MIME 类型嗅探防护 | X-Content-Type-Options: nosniff |
Content-Security-Policy | 内容安全策略 | Content-Security-Policy: default-src 'self' |
Strict-Transport-Security | 强制使用 HTTPS | Strict-Transport-Security: max-age=31536000 |
4. 实体头部(Entity Headers)
描述请求体/响应体的元信息:
| 字段 | 说明 | 示例 |
|---|---|---|
Content-Type | 实体的媒体类型和编码 | Content-Type: text/html; charset=utf-8 |
Content-Length | 实体长度(字节) | Content-Length: 1024 |
Content-Encoding | 实体内容的编码/压缩 | Content-Encoding: gzip |
Content-Language | 实体的自然语言 | Content-Language: zh-CN |
Content-Location | 实体的备选位置 | Content-Location: /index.html |
Content-MD5 | 实体内容的 MD5 校验 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
Expires | 实体过期时间 | Expires: Thu, 01 Dec 2024 16:00:00 GMT |
Allow | 资源支持的方法 | Allow: GET, HEAD, PUT |
四、HTTP 版本演进
| 版本 | 发布时间 | 主要特性 |
|---|---|---|
| HTTP/0.9 | 1991 | 只有 GET 方法,无头部,仅传输 HTML |
| HTTP/1.0 | 1996 | 引入请求头/响应头、状态码、多种方法 |
| HTTP/1.1 | 1999 | 持久连接、管道化、Host 头部、分块传输、缓存机制 |
| HTTP/2.0 | 2015 | 二进制协议、多路复用、头部压缩、服务器推送 |
| HTTP/3.0 | 2022 | 基于 QUIC(UDP),更快的握手,无队头阻塞 |
HTTP 常见面试题 10 个
1. HTTP 和 HTTPS 的区别是什么?
参考答案:
| 特性 | HTTP | HTTPS |
|---|---|---|
| 端口 | 80 | 443 |
| 安全性 | 明文传输,易被窃听/篡改 | SSL/TLS 加密,安全 |
| 证书 | 不需要 | 需要 CA 证书 |
| 性能 | 较快 | 加密解密有一定开销 |
| 协议层 | 应用层 | HTTP + SSL/TLS |
HTTPS 在 HTTP 基础上加入了 SSL/TLS 协议,通过非对称加密交换密钥,再用对称加密传输数据,保证了数据的机密性、完整性和身份认证。
2. GET 和 POST 的区别是什么?
参考答案:
| 特性 | GET | POST |
|---|---|---|
| 作用 | 获取资源 | 提交/创建资源 |
| 参数位置 | URL 中 | 请求体中 |
| 参数长度 | 受 URL 长度限制(浏览器通常 2KB~8KB) | 无严格限制 |
| 安全性 | 参数可见,相对不安全 | 参数在 body 中,相对安全 |
| 幂等性 | 幂等(多次调用结果相同) | 非幂等 |
| 缓存 | 可被浏览器缓存 | 不可缓存 |
| 书签 | 可收藏为书签 | 不可收藏 |
| 后退/刷新 | 无害 | 会重新提交数据 |
注意: 安全性上 POST 并非绝对安全,只是参数不在 URL 上显示,抓包仍然可见。真正安全需要靠 HTTPS 加密。
3. HTTP 常见的状态码有哪些?分别代表什么含义?
参考答案:
- 1xx 信息性:
100 Continue(继续发送请求)、101 Switching Protocols(协议切换) - 2xx 成功:
200 OK、201 Created、204 No Content、206 Partial Content - 3xx 重定向:
301 Moved Permanently(永久重定向)、302 Found(临时重定向)、304 Not Modified(协商缓存命中)、307 Temporary Redirect - 4xx 客户端错误:
400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found、405 Method Not Allowed、408 Request Timeout、409 Conflict、413 Payload Too Large、429 Too Many Requests - 5xx 服务器错误:
500 Internal Server Error、502 Bad Gateway、503 Service Unavailable、504 Gateway Timeout
4. 解释一下 HTTP 的缓存机制(强缓存和协商缓存)
参考答案:
HTTP 缓存分为 强缓存 和 协商缓存 两级:
强缓存(不发请求):
- 命中则直接使用本地缓存,不发请求
- 相关字段:
Expires(HTTP/1.0,绝对时间)、Cache-Control(HTTP/1.1,相对时间) Cache-Control常见值:max-age、no-cache、no-store、public、private
协商缓存(发请求验证):
- 强缓存失效后,浏览器发请求验证资源是否更新
- 服务器返回 304 表示未修改,继续使用缓存;返回 200 表示已更新
- 两组头部:
Last-Modified/If-Modified-Since:基于最后修改时间ETag/If-None-Match:基于资源唯一标识(优先级更高)
缓存流程:
- 浏览器先检查强缓存是否命中 → 命中则直接使用
- 未命中则发送请求进行协商缓存
- 协商缓存命中返回 304,浏览器使用本地缓存
- 协商缓存未命中返回 200 和新资源
5. 什么是跨域?如何解决跨域问题?
参考答案:
跨域 是浏览器的 同源策略 限制:协议、域名、端口三者有一个不同就会产生跨域。同源策略是为了安全,防止恶意网站读取其他网站的数据。
常见解决方案:
-
CORS(跨域资源共享):服务端设置响应头
Access-Control-Allow-Origin:允许的源Access-Control-Allow-Methods:允许的方法Access-Control-Allow-Headers:允许的头部- 简单请求直接发,非简单请求先发 OPTIONS 预检请求
-
JSONP:利用
<script>标签不受同源策略限制,只支持 GET -
代理服务器:Nginx 反向代理 / Node.js 中间件代理,将请求转发到目标服务器
-
postMessage:页面间通信,如 iframe 之间
-
WebSocket:协议本身不受同源策略限制
-
document.domain + iframe:适用于一级域名相同的场景
6. HTTP/1.1 和 HTTP/2.0 的区别是什么?
参考答案:
| 特性 | HTTP/1.1 | HTTP/2.0 |
|---|---|---|
| 传输格式 | 文本格式 | 二进制分帧 |
| 多路复用 | 无,存在队头阻塞 | 支持,同一域名一个连接并行请求 |
| 头部压缩 | 无,重复发送 | HPACK 算法压缩头部 |
| 服务器推送 | 无 | 支持,主动推送资源 |
| 流优先级 | 无 | 支持流优先级 |
| 队头阻塞 | 有(TCP 层面 + HTTP 层面) | 解决了 HTTP 层面的队头阻塞 |
HTTP/2 核心改进:
- 二进制分帧:将消息拆分为更小的帧,二进制编码更高效
- 多路复用:单连接上并行处理多个请求响应,解决了 HTTP/1.1 的队头阻塞
- 头部压缩:HPACK 算法减少冗余头部传输
- 服务器推送:服务端主动将资源推送给客户端缓存
7. Cookie、Session、Token 的区别是什么?
参考答案:
| 特性 | Cookie | Session | Token |
|---|---|---|---|
| 存储位置 | 客户端(浏览器) | 服务端 | 客户端(通常在 localStorage 或 header 中) |
| 安全性 | 较低,可被篡改 | 较高 | 高(签名验证) |
| 跨域 | 受同源策略限制 | 依赖 Cookie | 天然支持跨域 |
| 服务器压力 | 小 | 大(需存储 session) | 小(无状态) |
| 分布式 | 支持 | 需共享 session | 天然支持 |
| 典型大小 | ≤4KB | 无限制 | 可自定义 |
JWT(JSON Web Token) 是最常见的 Token 实现,由三部分组成:
Header:算法和类型Payload:用户信息和声明Signature:签名,防止篡改
8. 什么是 CSRF 和 XSS?如何防范?
参考答案:
CSRF(Cross-Site Request Forgery,跨站请求伪造):
- 原理:攻击者诱导用户在已登录的网站上执行非本意的操作
- 防范:
- 验证
Referer头部 - 使用 CSRF Token(每次请求携带随机令牌)
- 关键操作使用验证码
- SameSite Cookie 属性(
Strict/Lax)
- 验证
XSS(Cross-Site Scripting,跨站脚本攻击):
- 原理:攻击者向页面注入恶意脚本,其他用户访问时执行
- 类型:存储型、反射型、DOM 型
- 防范:
- 对用户输入进行转义/过滤
- 使用
Content-Security-Policy限制脚本来源 - Cookie 设置
HttpOnly防止窃取 - 使用框架自带的转义机制(如 React 的 JSX)
9. HTTP 请求中常见的头部字段有哪些?分别有什么作用?
参考答案:
通用头部:
Cache-Control:缓存控制策略Connection:连接管理(keep-alive / close)Date:报文创建时间Transfer-Encoding:传输编码(如 chunked)
请求头部:
Host:目标主机(HTTP/1.1 必需)User-Agent:客户端信息Accept:客户端接受的内容类型Accept-Encoding:支持的压缩算法Cookie:携带的 CookieAuthorization:认证信息(Bearer Token 等)Referer:请求来源页面Origin:跨域请求的源If-Modified-Since/If-None-Match:协商缓存条件
响应头部:
Server:服务器信息Set-Cookie:设置 CookieLocation:重定向地址ETag/Last-Modified:缓存标识Access-Control-Allow-Origin:CORS 跨域许可Content-Type:响应体类型Content-Length:响应体长度
10. 输入 URL 到页面展示的完整过程是什么?
参考答案:
- URL 解析:浏览器解析 URL 的协议、域名、路径、参数等
- DNS 解析:将域名解析为 IP 地址(浏览器缓存 → 系统缓存 → 路由器缓存 → ISP DNS → 根/顶级/权威 DNS 递归查询)
- TCP 连接:与服务器建立 TCP 三次握手
- TLS 握手(HTTPS):协商加密套件、交换密钥、验证证书
- 发送 HTTP 请求:构建请求报文,发送到服务器
- 服务器处理:服务器接收请求,处理业务逻辑,生成响应
- 返回 HTTP 响应:服务器返回响应报文(状态行、头部、响应体)
- 浏览器解析渲染:
- 解析 HTML 构建 DOM 树
- 解析 CSS 构建 CSSOM 树
- 合并为渲染树(Render Tree)
- 布局(Layout):计算元素位置和大小
- 绘制(Paint):将像素绘制到屏幕
- 合成(Composite):将多个层合并显示
- TCP 断开连接:四次挥手
其中还会涉及 浏览器缓存(强缓存/协商缓存)、CDN、负载均衡 等中间环节。
324



被折叠的 条评论
为什么被折叠?



