前言
做 Web 开发可以不了解网络底层的每一个细节,但理解 HTTP、DNS、CDN、HTTPS 这些核心概念是必须的。它们是浏览器和服务器之间的”交通规则”,搞清楚了,调试问题和优化性能时思路会清晰很多。
OSI 模型与 TCP/IP 模型1OSI(Open Systems Interconnection)七层模型是国际标准化组织(ISO)制定的网络通信理论模型,从物理层到应用层描述网络通信过程。实际应用中更常用 TCP/IP 四层模型。
七层 vs 四层
| OSI 七层模型 | TCP/IP 四层模型 | 主要协议 | 单位 |
|---|---|---|---|
| 应用层 | 应用层 | HTTP / HTTPS / DNS / WebSocket / FTP | 数据 |
| 表示层 | ↑ | SSL/TLS(加密)、JPEG、ASCII | 数据 |
| 会话层 | ↑ | 建立和管理会话 | 数据 |
| 传输层 | 传输层 | TCP / UDP | 段(Segment) |
| 网络层 | 网络层 | IP / ICMP / ARP | 包(Packet) |
| 数据链路层 | 网络接口层 | Ethernet / Wi-Fi | 帧(Frame) |
| 物理层 | ↓ | 光纤、双绞线、无线电 | 比特(Bit) |
对 Web 开发来说,只需要关注上面三层(或四层),真正打交道最多的是应用层的 HTTP。
TCP vs UDP
| 特性 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠,保证顺序 | 不可靠,可能丢包 |
| 速度 | 较慢(有确认重传机制) | 快 |
| 适用场景 | HTTP、HTTPS、SSH、WebSocket | 视频直播、DNS、游戏、VoIP |
| 头部大小 | 20-60 字节 | 8 字节 |
三次握手与四次挥手
TCP 三次握手2TCP 三次握手确保双方都能收发数据:客户端发 SYN 表示”我想连接”,服务器回 SYN+ACK 表示”收到,我也准备好了”,客户端再发 ACK 表示”好的,开始吧”。(建立连接)
TCP 四次挥手(断开连接)
HTTP 协议
HTTP 版本演进
| 版本 | 年份 | 主要改进 |
|---|---|---|
| HTTP/0.9 | 1991 | 只有 GET,只支持 HTML |
| HTTP/1.0 | 1996 | 增加 HEAD/POST,支持 header、状态码、多种文件类型 |
| HTTP/1.1 | 1997 | 持久连接、管道化、分块传输、Host 头 |
| HTTP/2 | 2015 | 多路复用、头部压缩(HPACK)、服务器推送、二进制分帧 |
| HTTP/3 | 2022 | 基于 QUIC3QUIC(Quick UDP Internet Connections)是 Google 开发的基于 UDP 的传输协议,解决了 TCP 的队头阻塞问题,成为 HTTP/3 的底层协议。(UDP),彻底解决队头阻塞 |
HTTP/1.1 仍然是最广泛使用的版本。HTTP/2 需要 TLS 加密(实践中),HTTP/3 则更进一步,基于 UDP 的 QUIC 协议来避免 TCP 的队头阻塞问题。
HTTP 请求方法
| 方法 | 含义 | 幂等4幂等性指同一请求执行多次与执行一次的效果相同。GET/PUT/DELETE 是幂等的(多次删除同一资源结果一致),POST 不是(多次提交会创建多个资源)。 | 安全 | 有请求体 |
|---|---|---|---|---|
GET | 获取资源 | ✅ | ✅ | ❌ |
HEAD | 获取响应头(无 body) | ✅ | ✅ | ❌ |
POST | 提交数据 | ❌ | ❌ | ✅ |
PUT | 替换/创建资源 | ✅ | ❌ | ✅ |
PATCH | 部分修改资源 | ❌ | ❌ | ✅ |
DELETE | 删除资源 | ✅ | ❌ | ✅ 可以 |
OPTIONS | 查询支持的请求方法/跨域预检 | ✅ | ✅ | ❌ |
常见 HTTP 请求头
| 请求头 | 含义 | 示例 |
|---|---|---|
Host | 目标主机名(HTTP/1.1 必须) | Host: example.com |
User-Agent | 客户端标识 | Mozilla/5.0 ... |
Accept | 客户端接受的 MIME 类型 | Accept: text/html |
Accept-Language | 客户端语言偏好 | Accept-Language: zh-CN |
Accept-Encoding | 客户端支持的压缩方式 | Accept-Encoding: gzip, br |
Referer | 请求来源页面 URL | Referer: https://google.com |
Content-Type | 请求体的 MIME 类型 | Content-Type: application/json |
Content-Length | 请求体长度 | Content-Length: 42 |
Authorization | 认证凭据 | Authorization: Bearer <token> |
Cookie | Cookie 信息 | Cookie: session=abc123 |
Origin | 请求来源(CORS 用) | Origin: https://example.com |
HTTP 状态码
1xx 信息 2xx 成功 3xx 重定向4xx 客户端错误 5xx 服务器错误| 状态码 | 含义 | 说明 |
|---|---|---|
| 200 | OK | 请求成功 |
| 201 | Created | 创建成功(POST/PUT) |
| 204 | No Content | 成功,无返回内容(DELETE) |
| 301 | Moved Permanently | 永久重定向,搜索引擎会更新 URL |
| 302 | Found | 临时重定向,搜索引擎保留原 URL |
| 304 | Not Modified | 缓存有效,使用本地缓存 |
| 307 | Temporary Redirect | 临时重定向,不允许改变请求方法 |
| 308 | Permanent Redirect | 永久重定向,不允许改变请求方法 |
| 400 | Bad Request | 客户端请求有误 |
| 401 | Unauthorized | 未认证(未登录) |
| 403 | Forbidden | 已认证但无权限 |
| 404 | Not Found | 资源不存在 |
| 405 | Method Not Allowed | 请求方法不被允许 |
| 408 | Request Timeout | 请求超时 |
| 409 | Conflict | 资源冲突(如并发编辑) |
| 413 | Content Too Large | 请求体太大 |
| 429 | Too Many Requests | 请求频率超过限制 |
| 500 | Internal Server Error | 服务器内部错误 |
| 502 | Bad Gateway | 网关收到无效响应 |
| 503 | Service Unavailable | 服务暂时不可用(如过载、维护) |
| 504 | Gateway Timeout | 网关超时 |
常见响应头
| 响应头 | 含义 |
|---|---|
Content-Type | 响应体的 MIME 类型 |
Content-Length | 响应体长度 |
Cache-Control | 缓存策略 |
Set-Cookie | 设置 Cookie |
Location | 重定向目标 URL |
Access-Control-Allow-Origin | CORS 允许的来源 |
Last-Modified | 资源的最后修改时间 |
ETag5ETag(Entity Tag)是资源的唯一标识符(通常是内容哈希),用于条件请求。比基于时间的 Last-Modified 更精确,能检测到同一秒内的多次修改。 | 资源的实体标签(用于条件请求) |
HTTPS / TLS6TLS(Transport Layer Security)传输层安全协议,是 SSL 的后继者。TLS 1.2 和 TLS 1.3 是当前主流版本,提供加密、数据完整性和身份验证。
HTTPS 是 HTTP 在 TLS(传输层安全协议)之上的加密版本。
HTTP vs HTTPS
| 对比 | HTTP | HTTPS |
|---|---|---|
| 加密 | 明文传输 | TLS 加密 |
| 默认端口 | 80 | 443 |
| 证书 | 不需要 | 需要 SSL/TLS 证书 |
| 安全性 | 加密、完整性校验、身份验证 | |
| 性能 | 稍快(无加密开销) | 略慢(握手 + 加解密,但现代硬件影响很小) |
| SEO | 浏览器标记”不安全” | 搜索引擎优先收录 |
TLS 握手简要过程
现代 HTTPS 的性能影响已经非常小(尤其在 HTTP/2 下),Chrome 已经将非 HTTPS 网站标记为”不安全”。新项目默认都应该使用 HTTPS。
DNS(域名系统)
DNS 将人类可读的域名(example.com)转换为机器可读的 IP 地址(93.184.216.34)。
DNS 解析过程7DNS 递归查询:本地 DNS 服务器代替客户端逐级查询(根域名服务器 → 顶级域服务器 → 权威域名服务器),客户端只需发一次请求。
常见 DNS 记录类型
| 记录类型 | 含义 | 示例 |
|---|---|---|
| A | 域名 → IPv4 地址 | example.com → 93.184.216.34 |
| AAAA | 域名 → IPv6 地址 | example.com → 2606:2800:220:1:248:1893:25c8:1946 |
| CNAME | 域名 → 另一个域名(别名) | www.example.com → example.com |
| MX | 邮件交换记录 | example.com → mail.example.com |
| TXT | 文本信息(验证域名所有权等) | 用于 SPF、DKIM、域名验证 |
| NS | 域名的 DNS 服务器 | example.com → ns1.example.com |
常用公共 DNS
| DNS 服务商 | 首选 | 备选 |
|---|---|---|
| 阿里 DNS | 223.5.5.5 | 223.6.6.6 |
| 腾讯 DNS | 119.29.29.29 | — |
| 114 DNS | 114.114.114.114 | 114.114.115.115 |
| Google DNS | 8.8.8.8 | 8.8.4.4 |
| Cloudflare DNS | 1.1.1.1 | 1.0.0.1 |
CDN(内容分发网络)
CDN 把内容缓存到离用户更近的边缘节点8CDN 边缘节点是部署在全球各地的服务器,物理上靠近用户,缓存静态内容以减少延迟。当用户请求资源时,智能调度系统会返回最近节点的 IP。,加速访问。
CDN 工作原理
CDN 的 CDN 核心步骤
- 用户请求资源 → DNS 解析到 CDN 的智能调度系统
- 调度系统返回离用户最近的边缘节点 IP
- 边缘节点如有缓存,直接返回(命中)
- 没有缓存 → 回源拉取,缓存后再返回
使用 CDN 的好处
| 好处 | 说明 |
|---|---|
| 加速 | 用户从最近节点加载,延迟大幅降低 |
| 减负 | 源服务器只需要处理 CDN 回源请求 |
| 高可用 | 某节点故障,自动切换其他节点 |
| 抗攻击 | 大部分 CDN 自带 DDoS 防护能力 |
| 带宽节省 | 静态资源在边缘节点缓存,节省源站带宽 |
CDN 适合缓存的内容
- 静态资源:JS / CSS / 图片 / 字体
- 视频、音频文件
- 不频繁变动的 JSON 数据
-
动态 API 响应(除非配合边缘计算或针对性配置)
CDN 不是万能的。对于需要实时更新的内容,需要配置合适的缓存策略(Cache-Control、CDN-Cache-Control)或者使用 CDN 的缓存刷新/预热 API。
HTTP 缓存策略
两大类型
| 缓存类型 | 位置 | 控制者 |
|---|---|---|
| 私有缓存 | 浏览器本地 | 用户/开发者 |
| 共享缓存 | CDN、反向代理 | 运维/开发者 |
Cache-Control 指令
| 指令 | 含义 | 示例 |
|---|---|---|
max-age=<秒> | 资源可缓存的最大时间 | max-age=31536000(1 年) |
no-cache | 每次使用前必须校验是否过期 | |
no-store | 完全禁止缓存(敏感数据用) | no-store |
public | 中间代理也可缓存 | public |
private | 仅浏览器可缓存 | private |
must-revalidate | 过期后必须向源服务器验证 | must-revalidate |
immutable | 资源不会变,刷新时无需重新验证 | immutable |
缓存策略组合
# 静态资源(JS/CSS/图片)使用版本号/哈希做缓存破坏Cache-Control: public, max-age=31536000, immutable
# HTML 页面:每次都验证是否更新Cache-Control: no-cache
# API 响应:短时间缓存Cache-Control: private, max-age=60
# 敏感信息:完全不缓存Cache-Control: no-store缓存破坏(Cache Busting)
更新静态资源时改文件名或查询参数,强制浏览器加载新版本:
<!-- 旧版本 --><script src="bundle.js"></script>
<!-- 新版本:通过哈希或版本号改变 URL --><script src="bundle.v2.js"></script><script src="bundle.js?v=2"></script><script src="bundle.abc123.js"></script>条件请求验证
| 验证方式 | 请求头 | 响应头 |
|---|---|---|
| 时间验证 | If-Modified-Since | Last-Modified |
| 哈希验证 | If-None-Match | ETag |
服务器收到条件请求后,如果资源未变更,返回 304 Not Modified(不返回 body),浏览器继续使用本地缓存。
Cookie
Cookie 是服务器存储在浏览器中的一小段数据,用于维持状态(因为 HTTP 是无状态的)。
Cookie 属性
| 属性 | 含义 | 推荐设置 |
|---|---|---|
Domain | 允许接收 Cookie 的域名 | 不设置或指定具体域名 |
Path | 路径限制 | / |
Expires / Max-Age | 过期时间 | 会话 Cookie 不设(浏览器关闭即删) |
HttpOnly | 禁止 JavaScript 读取 | ✅ 必须(防 XSS) |
Secure | 仅 HTTPS 传输 | ✅ 必须 |
SameSite | 控制跨站请求是否携带 Cookie | Lax(默认) 或 Strict |
Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=LaxSameSite 值 | 行为 |
|---|---|
Strict | 最严格,所有跨站请求都不带 Cookie |
Lax | 默认值,安全的跨站请求(如 GET 导航)会带 Cookie |
None | 允许所有跨站请求带 Cookie(需同时设置 Secure) |
CORS(跨域资源共享)
当浏览器发起的请求与当前页面协议、域名、端口任一不同时,就属于跨域请求。CORS 是服务器告诉浏览器”这个跨域请求是安全的”的机制。
简单请求 vs 预检请求9CORS 预检请求(OPTIONS)用于检查服务器是否允许实际的跨域请求。只有简单请求(GET/HEAD/POST + 基本头)可以跳过预检。
| 条件 | 简单请求 | 预检请求 |
|---|---|---|
| 方法 | GET / HEAD / POST | PUT / DELETE / PATCH / 其他 |
| 额外请求头 | 不允许 | 允许 |
| Content-Type | text/plain / multipart/form-data / application/x-www-form-urlencoded | 其他如 application/json |
| 处理流程 | 直接发送请求 | 先 OPTIONS 预检,再发真实请求 |
CORS 响应头
# 允许的来源(必须)Access-Control-Allow-Origin: https://example.com# 或通配符(不能用于认证请求)Access-Control-Allow-Origin: *
# 允许的方法(预检响应)Access-Control-Allow-Methods: GET, POST, PUT, DELETE
# 允许的请求头(预检响应)Access-Control-Allow-Headers: Content-Type, Authorization
# 是否允许携带 CookieAccess-Control-Allow-Credentials: true
# 预检结果缓存时间Access-Control-Max-Age: 86400401 / 403 vs CORS:浏览器报 CORS 错误是因为服务器没有返回正确的 CORS 头,不是资源不存在。如果你遇到 CORS 错误,检查服务端是否设置了 Access-Control-Allow-Origin。
WebSocket
WebSocket 是 HTML5 引入的协议,在客户端和服务器之间建立全双工(双向同时通信)的持久连接。
HTTP vs WebSocket
| 对比 | HTTP | WebSocket |
|---|---|---|
| 通信模式 | 请求-响应 | 全双工 |
| 建立方式 | 每次请求新建连接(HTTP/1.1 可复用) | 通过 HTTP 升级握手10WebSocket 通过 HTTP Upgrade 机制从 HTTP 协议升级到 WebSocket 协议。握手成功后(101 Switching Protocols),连接保持打开,双方可随时发送消息。 |
| 连接持久性 | 短连接或持久连接 | 长连接,一直保持 |
| 数据推送 | 只能轮询或 Server-Sent Events | 服务器可主动推送 |
| 协议标识 | http:// / https:// | ws:// / wss:// |
| 适用场景 | REST API、网页浏览 | 实时聊天、游戏、协作编辑 |
WebSocket 握手
// 客户端发起const ws = new WebSocket('wss://example.com/chat');
ws.onopen = () => console.log('连接已建立');ws.onmessage = (event) => console.log('收到消息:', event.data);ws.onclose = () => console.log('连接已关闭');ws.onerror = (err) => console.error('错误:', err);
// 发送消息ws.send('Hello Server');握手过程基于 HTTP 升级:
GET /chat HTTP/1.1Connection: UpgradeUpgrade: websocketSec-WebSocket-Version: 13Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==HTTP/1.1 101 Switching ProtocolsConnection: UpgradeUpgrade: websocketSec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=浏览器输入 URL 后的完整过程
这是一个经典的面试问题,也帮你理清所有网络概念:
学习路线图
- 理解 OSI / TCP-IP 分层模型
- 掌握 HTTP 请求方法和状态码
- 理解 DNS 解析过程
- 了解 HTTPS / TLS 握手原理
- 理解 CDN 的工作原理和使用场景
- 学会 HTTP 缓存策略配置
- 理解 CORS 和 Cookie 的工作机制
- 了解 WebSocket 和 HTTP 的区别
- 能完整描述浏览器输入 URL 后的全过程
总结
| 知识点 | 要点 | 核心概念 |
|---|---|---|
| HTTP | 无状态、请求-响应、1.1~3 版本演进 | 方法、状态码、请求/响应头 |
| HTTPS | TLS 加密保证机密性、完整性、身份验证 | 证书、TLS 握手、443 端口 |
| DNS | 域名→IP 地址的翻译系统 | A / CNAME / MX 记录、递归查询 |
| CDN | 就近分发,加速静态资源 | 边缘节点、回源、缓存命中 |
| 缓存 | 减少网络请求,降低延迟 | Cache-Control、ETag、304 |
| Cookie | 维持会话状态 | HttpOnly、Secure、SameSite |
| CORS | 浏览器安全策略,控制跨域访问 | 简单请求、预检请求、响应头 |
| WebSocket | 全双工实时通信 | 升级握手、ws:// |
网络知识面很广,初期不需要把每层协议都吃透。先从最常用的 HTTP 开始,遇到具体的性能问题再往下深挖。背面试题不如真正用一次,抓包看看真实的请求和响应,印象会深很多。
参考来源
- MDN Web Docs: HTTP Overview
- MDN Web Docs: HTTP 状态码
- MDN Web Docs: HTTP 缓存
- MDN Web Docs: CORS
- MDN Web Docs: HTTP Cookie
- MDN Web Docs: WebSocket
OSI(Open Systems Interconnection)七层模型是国际标准化组织(ISO)制定的网络通信理论模型,从物理层到应用层描述网络通信过程。实际应用中更常用 TCP/IP 四层模型。
↩TCP 三次握手确保双方都能收发数据:客户端发 SYN 表示”我想连接”,服务器回 SYN+ACK 表示”收到,我也准备好了”,客户端再发 ACK 表示”好的,开始吧”。
↩QUIC(Quick UDP Internet Connections)是 Google 开发的基于 UDP 的传输协议,解决了 TCP 的队头阻塞问题,成为 HTTP/3 的底层协议。
↩幂等性指同一请求执行多次与执行一次的效果相同。GET/PUT/DELETE 是幂等的(多次删除同一资源结果一致),POST 不是(多次提交会创建多个资源)。
↩ETag(Entity Tag)是资源的唯一标识符(通常是内容哈希),用于条件请求。比基于时间的 Last-Modified 更精确,能检测到同一秒内的多次修改。
↩TLS(Transport Layer Security)传输层安全协议,是 SSL 的后继者。TLS 1.2 和 TLS 1.3 是当前主流版本,提供加密、数据完整性和身份验证。
↩DNS 递归查询:本地 DNS 服务器代替客户端逐级查询(根域名服务器 → 顶级域服务器 → 权威域名服务器),客户端只需发一次请求。
↩CDN 边缘节点是部署在全球各地的服务器,物理上靠近用户,缓存静态内容以减少延迟。当用户请求资源时,智能调度系统会返回最近节点的 IP。
↩CORS 预检请求(OPTIONS)用于检查服务器是否允许实际的跨域请求。只有简单请求(GET/HEAD/POST + 基本头)可以跳过预检。
↩WebSocket 通过 HTTP Upgrade 机制从 HTTP 协议升级到 WebSocket 协议。握手成功后(101 Switching Protocols),连接保持打开,双方可随时发送消息。
↩
评论
GitHub 登录后可评论。
评论区会在滚动到这里时自动加载。