技术备忘 网络HTTPDNSCDNWebSocket

前言

做 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

特性TCPUDP
连接面向连接(三次握手)无连接
可靠性可靠,保证顺序不可靠,可能丢包
速度较慢(有确认重传机制)
适用场景HTTP、HTTPS、SSH、WebSocket视频直播、DNS、游戏、VoIP
头部大小20-60 字节8 字节

三次握手与四次挥手

TCP 三次握手2TCP 三次握手确保双方都能收发数据:客户端发 SYN 表示”我想连接”,服务器回 SYN+ACK 表示”收到,我也准备好了”,客户端再发 ACK 表示”好的,开始吧”。(建立连接)

ServerClientServerClient第一次:客户端发起连接第二次:服务端确认并同步第三次:客户端确认,连接建立【连接建立,开始传输】SYN (seq=x)SYN+ACK (seq=y, ack=x+1)ACK (seq=x+1, ack=y+1)

TCP 四次挥手(断开连接)

ServerClientServerClient第一次:客户端发送关闭请求第二次:服务端确认第三次:服务端也准备关闭第四次:客户端确认,连接关闭FIN (seq=u)ACK (seq=v, ack=u+1)FIN (seq=w)ACK (seq=u+1, ack=w+1)

HTTP 协议

HTTP 版本演进

版本年份主要改进
HTTP/0.91991只有 GET,只支持 HTML
HTTP/1.01996增加 HEAD/POST,支持 header、状态码、多种文件类型
HTTP/1.11997持久连接、管道化、分块传输、Host 头
HTTP/22015多路复用、头部压缩(HPACK)、服务器推送、二进制分帧
HTTP/32022基于 QUIC3QUIC(Quick UDP Internet Connections)是 Google 开发的基于 UDP 的传输协议,解决了 TCP 的队头阻塞问题,成为 HTTP/3 的底层协议。(UDP),彻底解决队头阻塞
NOTE

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请求来源页面 URLReferer: https://google.com
Content-Type请求体的 MIME 类型Content-Type: application/json
Content-Length请求体长度Content-Length: 42
Authorization认证凭据Authorization: Bearer <token>
CookieCookie 信息Cookie: session=abc123
Origin请求来源(CORS 用)Origin: https://example.com

HTTP 状态码

1xx 信息 2xx 成功 3xx 重定向
4xx 客户端错误 5xx 服务器错误
状态码含义说明
200OK请求成功
201Created创建成功(POST/PUT)
204No Content成功,无返回内容(DELETE)
301Moved Permanently永久重定向,搜索引擎会更新 URL
302Found临时重定向,搜索引擎保留原 URL
304Not Modified缓存有效,使用本地缓存
307Temporary Redirect临时重定向,不允许改变请求方法
308Permanent Redirect永久重定向,不允许改变请求方法
400Bad Request客户端请求有误
401Unauthorized未认证(未登录)
403Forbidden已认证但无权限
404Not Found资源不存在
405Method Not Allowed请求方法不被允许
408Request Timeout请求超时
409Conflict资源冲突(如并发编辑)
413Content Too Large请求体太大
429Too Many Requests请求频率超过限制
500Internal Server Error服务器内部错误
502Bad Gateway网关收到无效响应
503Service Unavailable服务暂时不可用(如过载、维护)
504Gateway Timeout网关超时

常见响应头

响应头含义
Content-Type响应体的 MIME 类型
Content-Length响应体长度
Cache-Control缓存策略
Set-Cookie设置 Cookie
Location重定向目标 URL
Access-Control-Allow-OriginCORS 允许的来源
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

对比HTTPHTTPS
加密明文传输TLS 加密
默认端口80443
证书不需要需要 SSL/TLS 证书
安全性数据可以被中间人窃听和篡改加密、完整性校验、身份验证
性能稍快(无加密开销)略慢(握手 + 加解密,但现代硬件影响很小)
SEO浏览器标记”不安全”搜索引擎优先收录

TLS 握手简要过程

ServerClientServerClient1. 客户端发送支持的加密套件、TLS 版本2. 服务端选择加密套件,发送证书3. 客户端验证证书,协商对称密钥4. 握手完成,开始加密通信【加密数据传输】ClientHelloServerHello + 证书 + ...证书验证 + 密钥交换Finished
NOTE

现代 HTTPS 的性能影响已经非常小(尤其在 HTTP/2 下),Chrome 已经将非 HTTPS 网站标记为”不安全”。新项目默认都应该使用 HTTPS

DNS(域名系统)

DNS 将人类可读的域名(example.com)转换为机器可读的 IP 地址(93.184.216.34)。

DNS 解析过程7DNS 递归查询:本地 DNS 服务器代替客户端逐级查询(根域名服务器 → 顶级域服务器 → 权威域名服务器),客户端只需发一次请求。

✅ 命中

❌ 未命中

✅ 命中

❌ 未命中

你输入 example.com

浏览器 DNS 缓存

命中?

返回 IP

操作系统 DNS 缓存

命中?

本地 DNS 服务器

(ISP / 公共 DNS)

递归查询

根域名服务器

.com 顶级域服务器

example.com

权威域名服务器

返回 IP 地址

逐级缓存

常见 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 服务商首选备选
阿里 DNS223.5.5.5223.6.6.6
腾讯 DNS119.29.29.29
114 DNS114.114.114.114114.114.115.115
Google DNS8.8.8.88.8.4.4
Cloudflare DNS1.1.1.11.0.0.1

CDN(内容分发网络)

CDN 把内容缓存到离用户更近的边缘节点8CDN 边缘节点是部署在全球各地的服务器,物理上靠近用户,缓存静态内容以减少延迟。当用户请求资源时,智能调度系统会返回最近节点的 IP。,加速访问。

CDN 工作原理

回源拉取内容

源服务器

origin

北京节点

上海节点

广州节点

北京用户

上海用户

广州用户

CDN 的 CDN 核心步骤

  1. 用户请求资源 → DNS 解析到 CDN 的智能调度系统
  2. 调度系统返回离用户最近的边缘节点 IP
  3. 边缘节点如有缓存,直接返回(命中
  4. 没有缓存 → 回源拉取,缓存后再返回

使用 CDN 的好处

好处说明
加速用户从最近节点加载,延迟大幅降低
减负源服务器只需要处理 CDN 回源请求
高可用某节点故障,自动切换其他节点
抗攻击大部分 CDN 自带 DDoS 防护能力
带宽节省静态资源在边缘节点缓存,节省源站带宽

CDN 适合缓存的内容

  • 静态资源:JS / CSS / 图片 / 字体
  • 视频、音频文件
  • 不频繁变动的 JSON 数据
  • 动态 API 响应(除非配合边缘计算或针对性配置)
NOTE

CDN 不是万能的。对于需要实时更新的内容,需要配置合适的缓存策略(Cache-ControlCDN-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

缓存策略组合

http
# 静态资源(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)

更新静态资源时改文件名或查询参数,强制浏览器加载新版本:

html
<!-- 旧版本 -->
<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-SinceLast-Modified
哈希验证If-None-MatchETag

服务器收到条件请求后,如果资源未变更,返回 304 Not Modified(不返回 body),浏览器继续使用本地缓存。

Cookie 是服务器存储在浏览器中的一小段数据,用于维持状态(因为 HTTP 是无状态的)。

属性含义推荐设置
Domain允许接收 Cookie 的域名不设置或指定具体域名
Path路径限制/
Expires / Max-Age过期时间会话 Cookie 不设(浏览器关闭即删)
HttpOnly禁止 JavaScript 读取✅ 必须(防 XSS)
Secure仅 HTTPS 传输✅ 必须
SameSite控制跨站请求是否携带 CookieLax(默认)Strict
http
Set-Cookie: session=abc123; HttpOnly; Secure; SameSite=Lax
SameSite行为
Strict最严格,所有跨站请求都不带 Cookie
Lax默认值,安全的跨站请求(如 GET 导航)会带 Cookie
None允许所有跨站请求带 Cookie(需同时设置 Secure

CORS(跨域资源共享)

当浏览器发起的请求与当前页面协议、域名、端口任一不同时,就属于跨域请求。CORS 是服务器告诉浏览器”这个跨域请求是安全的”的机制。

简单请求 vs 预检请求9CORS 预检请求(OPTIONS)用于检查服务器是否允许实际的跨域请求。只有简单请求(GET/HEAD/POST + 基本头)可以跳过预检。

条件简单请求预检请求
方法GET / HEAD / POSTPUT / DELETE / PATCH / 其他
额外请求头不允许允许
Content-Typetext/plain / multipart/form-data / application/x-www-form-urlencoded其他如 application/json
处理流程直接发送请求先 OPTIONS 预检,再发真实请求

CORS 响应头

http
# 允许的来源(必须)
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
# 是否允许携带 Cookie
Access-Control-Allow-Credentials: true
# 预检结果缓存时间
Access-Control-Max-Age: 86400
NOTE

401 / 403 vs CORS:浏览器报 CORS 错误是因为服务器没有返回正确的 CORS 头,不是资源不存在。如果你遇到 CORS 错误,检查服务端是否设置了 Access-Control-Allow-Origin

WebSocket

WebSocket 是 HTML5 引入的协议,在客户端和服务器之间建立全双工(双向同时通信)的持久连接。

HTTP vs WebSocket

对比HTTPWebSocket
通信模式请求-响应全双工
建立方式每次请求新建连接(HTTP/1.1 可复用)通过 HTTP 升级握手10WebSocket 通过 HTTP Upgrade 机制从 HTTP 协议升级到 WebSocket 协议。握手成功后(101 Switching Protocols),连接保持打开,双方可随时发送消息。
连接持久性短连接或持久连接长连接,一直保持
数据推送只能轮询或 Server-Sent Events服务器可主动推送
协议标识http:// / https://ws:// / wss://
适用场景REST API、网页浏览实时聊天、游戏、协作编辑

WebSocket 握手

js
// 客户端发起
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 升级:

http
GET /chat HTTP/1.1
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
http
HTTP/1.1 101 Switching Protocols
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

浏览器输入 URL 后的完整过程

这是一个经典的面试问题,也帮你理清所有网络概念:

HTTPS

HTTP

加载子资源

重复 DNS→TCP→请求

浏览器解析 URL

(协议、域名、端口、路径)

查找 DNS 缓存

浏览器 → 操作系统 → 本地 DNS

DNS 递归查询

拿到 IP 地址

建立 TCP 连接

(三次握手)

TLS 握手、证书验证

发送 HTTP 请求(Request)

服务端处理请求

返回 HTTP 响应(Response)

浏览器解析 HTML

加载 CSS / JS / 图片

渲染页面

学习路线图

  • 理解 OSI / TCP-IP 分层模型
  • 掌握 HTTP 请求方法和状态码
  • 理解 DNS 解析过程
  • 了解 HTTPS / TLS 握手原理
  • 理解 CDN 的工作原理和使用场景
  • 学会 HTTP 缓存策略配置
  • 理解 CORS 和 Cookie 的工作机制
  • 了解 WebSocket 和 HTTP 的区别
  • 能完整描述浏览器输入 URL 后的全过程

总结

知识点要点核心概念
HTTP无状态、请求-响应、1.1~3 版本演进方法、状态码、请求/响应头
HTTPSTLS 加密保证机密性、完整性、身份验证证书、TLS 握手、443 端口
DNS域名→IP 地址的翻译系统A / CNAME / MX 记录、递归查询
CDN就近分发,加速静态资源边缘节点、回源、缓存命中
缓存减少网络请求,降低延迟Cache-Control、ETag、304
Cookie维持会话状态HttpOnlySecureSameSite
CORS浏览器安全策略,控制跨域访问简单请求、预检请求、响应头
WebSocket全双工实时通信升级握手、ws://

网络知识面很广,初期不需要把每层协议都吃透。先从最常用的 HTTP 开始,遇到具体的性能问题再往下深挖。背面试题不如真正用一次,抓包看看真实的请求和响应,印象会深很多。


参考来源

脚注
  1. OSI(Open Systems Interconnection)七层模型是国际标准化组织(ISO)制定的网络通信理论模型,从物理层到应用层描述网络通信过程。实际应用中更常用 TCP/IP 四层模型。

  2. TCP 三次握手确保双方都能收发数据:客户端发 SYN 表示”我想连接”,服务器回 SYN+ACK 表示”收到,我也准备好了”,客户端再发 ACK 表示”好的,开始吧”。

  3. QUIC(Quick UDP Internet Connections)是 Google 开发的基于 UDP 的传输协议,解决了 TCP 的队头阻塞问题,成为 HTTP/3 的底层协议。

  4. 幂等性指同一请求执行多次与执行一次的效果相同。GET/PUT/DELETE 是幂等的(多次删除同一资源结果一致),POST 不是(多次提交会创建多个资源)。

  5. ETag(Entity Tag)是资源的唯一标识符(通常是内容哈希),用于条件请求。比基于时间的 Last-Modified 更精确,能检测到同一秒内的多次修改。

  6. TLS(Transport Layer Security)传输层安全协议,是 SSL 的后继者。TLS 1.2 和 TLS 1.3 是当前主流版本,提供加密、数据完整性和身份验证。

  7. DNS 递归查询:本地 DNS 服务器代替客户端逐级查询(根域名服务器 → 顶级域服务器 → 权威域名服务器),客户端只需发一次请求。

  8. CDN 边缘节点是部署在全球各地的服务器,物理上靠近用户,缓存静态内容以减少延迟。当用户请求资源时,智能调度系统会返回最近节点的 IP。

  9. CORS 预检请求(OPTIONS)用于检查服务器是否允许实际的跨域请求。只有简单请求(GET/HEAD/POST + 基本头)可以跳过预检。

  10. WebSocket 通过 HTTP Upgrade 机制从 HTTP 协议升级到 WebSocket 协议。握手成功后(101 Switching Protocols),连接保持打开,双方可随时发送消息。