网络知识教程(软件测试人员专用)¶
本教程面向软件测试工程师,系统讲解测试工作中需要的网络知识,从 TCP/IP 基础到 HTTP 协议、DNS、代理、WebSocket、CDN、负载均衡、微服务网络等。
前置要求¶
无前置要求,零基础可直接学习。
新手导读¶
网络知识很容易越学越底层。测试新人第一遍不需要深挖协议实现,先掌握 HTTP 请求如何发出、DNS 如何解析、代理如何抓包、常见网络错误如何排查。
建议优先理解:
- URL、域名、IP、端口分别是什么。
- GET、POST、PUT、DELETE 有什么差别。
- 状态码 200、301、400、401、403、404、500 大致代表什么。
- Cookie、Session、Token 用来解决什么问题。
- 遇到访问失败时,按
ping → telnet/curl → 抓包 → 看日志排查。
学完后,你应该能说清楚一次接口请求从浏览器到服务器大概经历了什么。
一、TCP/IP 基础¶
1.1 网络分层模型¶
OSI 七层 TCP/IP 四层 对应协议
─────────────────────────────────────────────────
应用层 应用层 HTTP、HTTPS、DNS、FTP、SMTP
表示层 ↑
会话层 ↑
─────────────────────────────────────────────────
传输层 传输层 TCP、UDP
─────────────────────────────────────────────────
网络层 网络层 IP、ICMP、ARP
─────────────────────────────────────────────────
数据链路层 网络接口层 以太网、Wi-Fi
物理层 ↑
测试人员主要关注 应用层(HTTP)和 传输层(TCP/UDP)。
1.2 IP 地址¶
IPv4: 32 位,用点分十进制表示
特殊地址:
| 地址 | 含义 |
|---|---|
127.0.0.1 |
本机(localhost) |
0.0.0.0 |
所有网卡 |
10.x.x.x |
内网 A 类 |
172.16-31.x.x |
内网 B 类 |
192.168.x.x |
内网 C 类 |
子网掩码: 区分网络号和主机号
1.3 端口¶
端口是应用的"门牌号",范围 0-65535。
| 端口 | 服务 |
|---|---|
| 80 | HTTP |
| 443 | HTTPS |
| 22 | SSH |
| 3306 | MySQL |
| 6379 | Redis |
| 8080 | 常用 HTTP 备用 |
| 27017 | MongoDB |
查看端口占用:
参数拆解:
| 参数 | 含义 |
|---|---|
netstat -anp |
显示所有连接(-a)、数字显示(-n)、显示进程(-p) |
ss -tlnp |
显示 TCP 监听(-t)、监听状态(-l)、数字(-n)、进程(-p) |
lsof -i:8080 |
显示占用 8080 端口的进程 |
grep 8080 |
过滤 8080 端口 |
findstr :8080 |
Windows 下过滤 8080 端口 |
tasklist |
Windows 下显示所有进程 |
1.4 TCP 三次握手¶
建立 TCP 连接的过程(SYN/ACK 是 TCP 协议的控制标志位,seq/ack 是序列号,用于确认数据顺序):
客户端 服务器
│ │
│── SYN (seq=x) ───────→│ 第 1 次:客户端发起连接(SYN = 我想连你)
│ │
│←─ SYN+ACK (seq=y, │ 第 2 次:服务器确认并发起
│ ack=x+1) ──────────│
│ │
│── ACK (ack=y+1) ─────→│ 第 3 次:客户端确认
│ │
│ 连接建立 │
测试关注: - 三次握手失败 → 连接超时 - 服务器 SYN 队列满 → 连接被拒绝 - 网络抖动导致丢包 → 重传延迟
1.5 TCP 四次挥手¶
断开 TCP 连接的过程:
客户端 服务器
│ │
│── FIN ────────────────→│ 第 1 次:客户端请求关闭
│ │
│←─ ACK ─────────────────│ 第 2 次:服务器确认
│ │
│←─ FIN ─────────────────│ 第 3 次:服务器也请求关闭
│ │
│── ACK ────────────────→│ 第 4 次:客户端确认
│ │
│ 连接关闭 │
测试关注: - 服务器大量 CLOSE_WAIT → 应用未正确关闭连接(Bug) - TIME_WAIT 过多 → 端口耗尽
1.6 TCP vs UDP¶
| 维度 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(握手) | 无连接 |
| 可靠性 | 可靠(重传、排序) | 不可靠 |
| 速度 | 较慢 | 快 |
| 适用 | HTTP、数据库、文件传输 | DNS、视频、游戏、直播 |
1.7 常用协议与端口¶
| 协议 | 端口 | 用途 |
|---|---|---|
| HTTP | 80 | Web 服务 |
| HTTPS | 443 | 加密 Web |
| SSH | 22 | 远程登录 |
| FTP | 21 | 文件传输 |
| SMTP | 25 | 邮件发送 |
| DNS | 53 | 域名解析 |
| MySQL | 3306 | 数据库 |
| Redis | 6379 | 缓存 |
| MongoDB | 27017 | 文档数据库 |
| RabbitMQ | 5672 | 消息队列 |
| Elasticsearch | 9200 | 搜索引擎 |
二、HTTP/HTTPS 协议¶
2.1 HTTP 请求结构¶
POST /api/login HTTP/1.1 ← 请求行
Host: api.example.com ← 请求头
Content-Type: application/json
Authorization: Bearer eyJhbGc...
User-Agent: Mozilla/5.0
← 空行(分隔头和体)
{"username":"test","password":"123"} ← 请求体
2.2 HTTP 响应结构¶
HTTP/1.1 200 OK ← 状态行
Content-Type: application/json ← 响应头
Content-Length: 156
Set-Cookie: sessionId=abc123
← 空行
{"code":0,"data":{"token":"..."}} ← 响应体
2.3 请求方法¶
| 方法 | 用途 | 幂等 | 安全 |
|---|---|---|---|
| GET | 查询 | ✅ | ✅ |
| POST | 创建 | ❌ | ❌ |
| PUT | 全量更新 | ✅ | ❌ |
| PATCH | 部分更新 | 取决于实现,默认不保证 | ❌ |
| DELETE | 删除 | ✅ | ❌ |
| HEAD | 只要响应头 | ✅ | ✅ |
| OPTIONS | 探测支持的方法 | ✅ | ✅ |
幂等:同一个请求调用多次,结果和调用一次一样(如 GET 查询、PUT 更新)。安全:请求不会修改服务器数据(只有 GET、HEAD、OPTIONS 是安全的)。
2.4 状态码¶
| 码段 | 含义 | 常见 |
|---|---|---|
| 2xx | 成功 | 200 OK, 201 Created |
| 3xx | 重定向 | 301 永久, 302 临时, 304 未修改 |
| 4xx | 客户端错误 | 400 参数错, 401 未认证, 403 无权限, 404 未找到 |
| 5xx | 服务端错误 | 500 内部错, 502 网关错, 503 不可用, 504 超时 |
2.5 常见请求头¶
| Header | 含义 |
|---|---|
Content-Type |
请求/响应体格式 |
Authorization |
鉴权信息 |
Cookie |
会话 Cookie |
User-Agent |
客户端标识 |
Accept |
接受的响应格式 |
Referer |
来源页面 |
Origin |
跨域请求来源 |
X-Forwarded-For |
真实 IP(经过代理时) |
Cache-Control |
缓存策略 |
2.6 Content-Type 类型¶
| 类型 | 用途 |
|---|---|
application/json |
JSON 数据 |
application/x-www-form-urlencoded |
表单提交 |
multipart/form-data |
文件上传 |
text/html |
HTML 页面 |
text/plain |
纯文本 |
application/xml |
XML 数据 |
application/octet-stream |
二进制流 |
2.7 Cookie / Session / Token¶
这三者都是 HTTP 状态保持的方式,但原理和适用场景不同。测试人员必须理解它们的区别,才能正确测试登录态、鉴权和会话管理。
Cookie¶
Cookie 是服务器通过 Set-Cookie 响应头写入浏览器的一小段数据(通常 ≤ 4KB),之后每次请求浏览器会自动通过 Cookie 请求头携带。
登录成功
→ 服务端响应头: Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Secure
→ 浏览器保存 Cookie
后续请求
→ 浏览器自动在请求头携带: Cookie: sessionId=abc123
→ 服务端读取 Cookie,识别用户
Cookie 关键属性:
| 属性 | 作用 | 测试关注 |
|---|---|---|
Expires / Max-Age |
过期时间 | 不设则为会话 Cookie(关闭浏览器失效) |
Path |
生效路径 | 设了 /api 则其他路径不携带 |
Domain |
生效域名 | 设了 .example.com 则子域共享 |
HttpOnly |
禁止 JS 读取 | 防 XSS 偷 Cookie,Fiddler 仍能看到 |
Secure |
仅 HTTPS 传输 | HTTP 下不携带,防止明文泄露 |
SameSite |
跨站限制 | Strict / Lax / None,防 CSRF |
Session¶
Session 是服务端存储的会话数据,客户端只保存一个 sessionId(通常放在 Cookie 里)。用户登录后,服务端创建 Session,把用户信息存在服务端内存/数据库/Redis 中,客户端只拿一个"钥匙"。
用户登录
→ 服务端创建 Session: { userId: 10001, role: "admin", loginTime: "..." }
→ 生成 sessionId = "abc123"
→ 响应: Set-Cookie: sessionId=abc123
→ 服务端存入 Redis: session:abc123 → { userId, role, ... }
后续请求
→ 浏览器携带 Cookie: sessionId=abc123
→ 服务端查 Redis: session:abc123 → 找到用户信息
Session 过期(默认 30 分钟无操作)
→ 服务端删除 Session 数据
→ 客户端 Cookie 还在,但服务端已不认识
Session 特点:
- 服务端存储,可存任意大小数据(购物车、权限列表等)。
- 每个用户占一份服务端资源,用户量大时需要 Redis 等分布式存储。
- 多台服务器时,必须用共享存储(Redis),否则用户请求打到不同服务器会丢失登录态。
- 退出登录时,服务端删除 Session 数据。
Token(JWT)¶
JWT(JSON Web Token)是无状态认证方案。用户信息和签名编码在 Token 本身里,服务端不需要存储会话,只需验证签名。
用户登录
→ 服务端生成 JWT:
Header: {"alg": "HS256", "typ": "JWT"} ← 算法
Payload: {"userId": 10001, "role": "admin", "exp": 1719000000} ← 用户信息+过期时间
Signature: HMAC-SHA256(base64(header) + "." + base64(payload), secret_key)
→ 返回: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQiOjEwMDAx...
后续请求
→ 客户端手动携带: Authorization: Bearer eyJhbGci...
→ 服务端解码 Payload,验证 Signature
→ 签名正确 → 信任 Payload 中的用户信息
JWT 三段结构:
| 段 | 内容 | 编码 |
|---|---|---|
| Header | 算法和类型 | Base64URL |
| Payload | 用户信息、过期时间、签发时间 | Base64URL(未加密,可解码查看) |
| Signature | 对 Header+Payload 的签名 | HMAC-SHA256 或 RSA |
测试注意: JWT 的 Payload 只是 Base64 编码,不是加密。用
base64 -d或浏览器控制台atob()就能看到内容。不要在 Payload 里放密码、手机号等敏感信息。
三者对比¶
| 维度 | Cookie + Session | JWT Token |
|---|---|---|
| 数据存储位置 | 服务端(Session 存数据) | 客户端(Token 自带数据) |
| 客户端保存 | Cookie(自动携带) | localStorage / sessionStorage / Cookie |
| 请求携带方式 | 浏览器自动 | 手动设置 Authorization 头 |
| 服务端状态 | 有状态(需存储 Session) | 无状态(只验证签名) |
| 跨域支持 | Cookie 受同源策略限制 | Token 可跨域(放在 Header 里) |
| 主动失效 | 删除 Session 即可 | 需要黑名单机制或等过期 |
| 扩展性 | 多服务器需共享 Session 存储 | 天然支持分布式 |
| 适用场景 | 传统 Web 应用、同域系统 | 前后端分离、移动端、微服务 |
测试关注点¶
Cookie 测试:
- 过期时间是否正确:设了 7 天过期,7 天后是否失效。
HttpOnly是否生效:JS 能否读取(document.cookie返回空)。Secure是否生效:HTTP 请求是否不带 Cookie。SameSite配置:跨站请求是否携带 Cookie(防 CSRF)。- Cookie 删除后,访问需登录的页面是否跳转登录。
Session 测试:
- Session 超时:30 分钟无操作后再访问,是否需要重新登录。
- 并发登录:同一账号在两个浏览器登录,是否互踢。
- 服务端重启后 Session 是否丢失(取决于存储方式)。
- 多服务器部署时,Session 是否共享(Redis 存储验证)。
Token 测试:
- Token 过期后请求是否返回 401。
- Token 被篡改(改 Payload 中的 userId)后是否验证失败。
- 刷新 Token 机制:
refreshToken是否能无感续期。 - Token 存储位置安全性:localStorage 有 XSS 风险,Cookie 有 CSRF 风险。
- 退出登录后 Token 是否失效(黑名单 or 客户端清除)。
抓包验证示例¶
# Fiddler 中查看 Cookie
请求头: Cookie: sessionId=abc123; theme=dark
响应头: Set-Cookie: sessionId=abc123; Path=/; HttpOnly; Max-Age=86400
# Fiddler 中查看 Token
请求头: Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJ1c2VySWQi...
# 用 Python 解码 JWT Payload(不要用在线工具传生产 Token)
import base64, json
payload = token.split('.')[1]
# 补齐 Base64 padding
payload += '=' * (4 - len(payload) % 4)
print(json.loads(base64.urlsafe_b64decode(payload)))
# 输出: {'userId': 10001, 'role': 'admin', 'exp': 1719000000}
2.8 HTTPS 加密原理¶
客户端 服务器
│ │
│── ClientHello ──────────────→│ 支持的加密套件
│←─ ServerHello + 证书 ────────│ 选定套件 + 公钥证书
│ │
│ 验证证书(CA 机构签名) │
│ 生成随机密钥 │
│ 用服务器公钥加密发送 │
│── 密钥交换 ──────────────────→│
│ │
│ 双方用协商的密钥加密通信 │
│←───────── 加密数据 ─────────→│
测试关注: - 证书过期 → 浏览器报不安全 - 自签名证书 → 需手动信任 - 证书域名不匹配 → 警告 - Fiddler 抓 HTTPS 需安装根证书
2.9 HTTP 无状态与状态保持¶
HTTP 本身无状态,每次请求独立。状态保持方式:
| 方式 | 原理 |
|---|---|
| Cookie | 客户端存储,自动携带 |
| Session | 服务端存储,Cookie 关联 |
| Token | 客户端存储,手动携带 |
| URL 参数 | 拼在 URL 中(不安全) |
三、DNS 域名解析¶
3.1 DNS 是什么¶
DNS(Domain Name System)将域名转换为 IP 地址。
3.2 解析流程¶
1. 浏览器查自身缓存
2. 操作系统缓存(包括 hosts 文件)
3. 本地 DNS 服务器(ISP 提供)
4. 本地 DNS 没有 → 递归查询:
→ 根 DNS(.)→ 返回 .com 地址
→ .com DNS → 返回 example.com 地址
→ example.com DNS → 返回 www 的 IP
5. 本地 DNS 缓存结果,返回给客户端
3.3 常见 DNS 记录类型¶
| 类型 | 含义 | 示例 |
|---|---|---|
| A | 域名 → IPv4 | example.com → 93.184.216.34 |
| AAAA | 域名 → IPv6 | |
| CNAME | 域名 → 域名(别名) | www.example.com → example.com |
| MX | 邮件服务器 | |
| NS | 域名服务器 | |
| TXT | 文本记录(验证、SPF) |
3.4 测试相关 DNS 问题¶
| 问题 | 表现 | 排查 |
|---|---|---|
| DNS 解析失败 | UnknownHostException |
nslookup 查看 |
| DNS 缓存 | 改了 IP 但还是访问旧的 | 清缓存:ipconfig /flushdns |
| DNS 污染 | 解析到错误 IP | 换 DNS 服务器 |
| 域名未备案 | 被运营商拦截 | 检查备案状态 |
| TTL 过长 | DNS 变更后长时间不生效 | 检查 TTL 设置 |
TTL(Time To Live)详解¶
TTL 是 DNS 记录的"生存时间",单位是秒。它告诉各地 DNS 服务器"这条解析结果可以缓存多久"。
| TTL 设置 | 效果 |
|---|---|
TTL = 300(5 分钟) |
改了 DNS 记录,最多 5 分钟后全球生效 |
TTL = 86400(24 小时) |
改了 DNS 记录,最多要等 24 小时才全球生效 |
测试中的典型场景:你把域名指向了新 IP,但因为之前设的 TTL 太长(比如 24 小时),各地 DNS 服务器还在用旧的缓存结果,导致变更迟迟不生效。
操作建议:计划迁移服务器前,提前把 TTL 调低(比如 300 秒),等旧 TTL 过期后再做切换,切换完成后可以调回正常值。
# 查看当前域名的 TTL(秒数)
nslookup -type=A example.com
# Windows 清除本地 DNS 缓存
ipconfig /flushdns
# Linux 清除本地 DNS 缓存
sudo systemd-resolve --flush-caches
3.5 测试中操控 DNS¶
修改 hosts 文件(本地测试):
# Windows: C:\Windows\System32\drivers\etc\hosts
# Linux/Mac: /etc/hosts
192.168.1.100 api.example.com # 强制解析到测试服务器
用 curl 指定 DNS:
这条命令的用途: 绕过 DNS,直接用 IP 访问服务器。
-H "Host: ..."手动指定 Host 头,让服务器以为你在访问域名(虚拟主机场景必需)。
四、代理与抓包原理¶
4.1 正向代理¶
客户端通过代理访问服务器,服务器不知道真实客户端。
用途: 抓包、出口代理、缓存、访问控制
4.2 反向代理¶
客户端不知道真实服务器,请求被代理转发到后端。
用途: 负载均衡、SSL 卸载、安全防护
4.3 中间人代理(MITM)¶
Fiddler/Charles 的工作原理:
HTTPS 抓包原理:
- Fiddler 拦截客户端请求
- Fiddler 用自己的证书与服务器建立 HTTPS
- Fiddler 用另一个证书与客户端建立 HTTPS
- 客户端需安装 Fiddler 的根证书才能信任
4.4 代理配置方式¶
系统代理:
浏览器代理: FoxyProxy 扩展快速切换
代码代理:
import requests
proxies = {
"http": "http://127.0.0.1:8888",
"https": "http://127.0.0.1:8888"
}
requests.get("https://example.com", proxies=proxies)
4.5 抓包工具对比¶
| 工具 | 平台 | 特点 |
|---|---|---|
| Fiddler Classic | Windows | 免费,功能全 |
| Charles | Mac/Win | 商业,Mac 首选 |
| mitmproxy | 全平台 | 命令行,可编程 |
| Wireshark | 全平台 | 底层(TCP/IP),最强大 |
| Chrome DevTools | 浏览器内置 | 无需安装 |
五、网络排障命令¶
5.1 ping¶
测试网络连通性:
ping baidu.com # 发送 ICMP 包
ping -c 4 baidu.com # Linux 发 4 个包(-c 表示 count,发送次数)
ping -n 4 baidu.com # Windows 发 4 个包(-n 表示 number of echoes)
ping -t baidu.com # Windows 持续 ping(-t 表示 continuous,Ctrl+C 停止)
参数拆解:
| 参数 | 含义 |
|---|---|
-c 4 |
发送 4 个包后停止(count) |
-t |
持续发送,直到手动停止(Ctrl+C) |
-i 1 |
间隔 1 秒发送一次(Linux,默认 1 秒) |
-s 64 |
发送 64 字节的数据包 |
-W 2 |
等待 2 秒超时(Linux) |
结果解读:
time越小越好(< 100ms 正常)- 丢包率应为 0%
- TTL 可粗略判断操作系统(Linux 64,Windows 128)
5.2 traceroute / tracert¶
追踪路由路径:
可看到每个跳的延迟和经过的路由器。
5.3 telnet / nc¶
测试端口连通性:
5.4 nslookup / dig¶
DNS 查询:
5.5 curl¶
HTTP 请求测试(Linux / Mac / Windows 命令相同,但 Windows CMD 用 ^ 换行,PowerShell 用反引号 `):
# GET 请求
curl https://api.example.com/user/1
# 显示响应头
curl -i https://api.example.com/user/1
# 详细输出(调试)
curl -v https://api.example.com/user/1
# POST JSON(Linux/Mac 用 \ 换行)
curl -X POST https://api.example.com/login \
-H "Content-Type: application/json" \
-d '{"username":"test","password":"123"}'
# 带 Token
curl -H "Authorization: Bearer eyJhbGc..." \
https://api.example.com/user
# 跳过 SSL 校验
curl -k https://192.168.1.100/api
# 测量响应时间
curl -o /dev/null -s -w "Total: %{time_total}s\nDNS: %{time_namelookup}s\nConnect: %{time_connect}s\n" \
https://api.example.com/test
curl 参数拆解:
| 参数 | 含义 |
|---|---|
-o /dev/null |
丢弃响应体内容(/dev/null 是 Linux 的"黑洞",写了就消失),只关心耗时 |
-s |
隐藏进度条(适合写脚本时用) |
-w "..." |
自定义输出格式,%{time_total} 等是 curl 内置变量 |
-k |
跳过 SSL 证书校验(自签名证书测试用) |
-v |
详细模式,显示完整的握手和请求过程 |
-I |
只显示响应头,不显示内容 |
-i |
显示响应头 + 内容 |
-X POST |
指定请求方法(GET/POST/PUT/DELETE) |
-H "..." |
添加请求头 |
-d "..." |
发送请求体数据 |
-F "..." |
表单提交(用于文件上传) |
-L |
跟随重定向(301/302 自动跳转) |
-c cookie.txt |
保存 Cookie 到文件 |
-b cookie.txt |
从文件读取 Cookie |
Windows 注意:
/dev/null改为NUL,反斜杠\换行改为^。
Windows 10+ 自带 curl,语法基本一致。注意:Windows CMD 用
^换行(不是\),/dev/null改为NUL。
5.6 netstat / ss¶
查看网络连接:
5.7 ipconfig / ifconfig¶
查看网络配置:
5.8 综合排障流程¶
1. ping 目标 → 通?→ 网络层正常
不通?→ 检查 IP、路由、防火墙
2. telnet 端口 → 通?→ 端口正常
不通?→ 检查服务是否启动、防火墙
3. curl 接口 → 正常?→ 应用层正常
异常?→ 检查请求参数、服务日志
4. 用抓包工具 → 看具体请求/响应
六、常见网络问题¶
6.1 连接超时¶
表现: Connection timed out
原因: - 目标服务器不可达 - 防火墙拦截 - 端口未开放 - 网络抖动
排查:
6.2 连接拒绝¶
表现: Connection refused
原因: - 服务未启动 - 端口未监听 - 防火墙拒绝
排查:
# 在服务器上检查端口是否监听
netstat -an | findstr :8080 # Windows
netstat -tlnp | grep 8080 # Linux
# 检查服务是否运行
sc query nginx # Windows
systemctl status nginx # Linux
6.3 DNS 解析失败¶
表现: UnknownHostException、Name or service not known
排查:
nslookup 域名 # 能解析?
ping 8.8.8.8 # DNS 服务器可达?
# 检查 hosts 文件有无干扰
cat /etc/hosts # Linux / Mac
type C:\Windows\System32\drivers\etc\hosts # Windows CMD
Get-Content C:\Windows\System32\drivers\etc\hosts # PowerShell
6.4 SSL 证书错误¶
表现: SSL certificate problem
原因: - 证书过期 - 自签名证书未信任 - 域名不匹配
排查:
6.5 跨域问题(CORS)¶
表现: 浏览器控制台报 No 'Access-Control-Allow-Origin' header
原因: 前端域名与接口域名不同,浏览器安全策略阻止。
排查:
# 检查响应头
curl -I https://api.example.com/data
# 看是否有:
# Access-Control-Allow-Origin: *
# Access-Control-Allow-Methods: GET,POST
测试关注: - 接口是否返回正确的 CORS 头 - OPTIONS 预检请求是否正确响应 - 带 Cookie 的请求 CORS 配置是否正确
6.6 HTTP 与 HTTPS 混合内容¶
表现: 页面加载了 HTTP 资源(图片、JS),浏览器报 Mixed Content
排查: F12 → Console 查看被阻止的资源。
七、WebSocket¶
7.1 WebSocket 是什么¶
WebSocket 是全双工通信协议,基于 TCP,允许服务器主动推送数据。
7.2 WebSocket vs HTTP¶
| 维度 | HTTP | WebSocket |
|---|---|---|
| 通信方向 | 单向(请求-响应) | 双向 |
| 连接 | 请求-响应模式,可复用连接 | 长连接 |
| 协议 | http:// / https:// | ws:// / wss:// |
| 开销 | 每次带完整 Header | 首次握手后轻量帧 |
| 适用 | 普通接口 | 实时通讯、推送、游戏 |
7.3 WebSocket 握手¶
WebSocket 通过 HTTP 升级:
GET /chat HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
7.4 测试 WebSocket¶
Postman: 支持 WebSocket 请求(New → WebSocket Request)
命令行工具 wscat:
浏览器 F12: Network → WS 标签查看 WebSocket 消息。
测试要点: - 连接建立/断开 - 消息收发正确性 - 心跳机制是否正常 - 断线重连逻辑 - 大消息/高频消息处理
八、CDN 基础¶
8.1 CDN 是什么¶
CDN(Content Delivery Network)将内容缓存到全球边缘节点,用户就近获取。
8.2 CDN 工作原理¶
1. 用户请求 static.example.com/logo.png
2. DNS 解析到最近的 CDN 边缘节点
3. 边缘节点有缓存 → 直接返回
4. 边缘节点无缓存 → 回源站获取 → 缓存 → 返回
8.3 测试关注点¶
| 关注点 | 测试方法 |
|---|---|
| 缓存命中 | 查看响应头 X-Cache: HIT |
| 缓存更新 | 修改源文件,检查 CDN 是否同步 |
| 回源逻辑 | 清除 CDN 缓存后是否正确回源 |
| 多区域访问 | 不同地区访问同一资源 |
| HTTPS | CDN 证书是否正确 |
| URL 参数 | 带参数的 URL 缓存行为 |
8.4 常见 CDN 响应头¶
X-Cache: HIT # 命中缓存
X-Cache: MISS # 未命中(回源)
X-Cache-Lookup: HIT # CDN 节点有缓存
Age: 1234 # 缓存已存在秒数
Cache-Control: max-age=3600 # 缓存有效期
九、HTTP/2 与 HTTP/3¶
9.1 HTTP/2 特性¶
| 特性 | 说明 |
|---|---|
| 多路复用 | 一个 TCP 连接并行多个请求 |
| 头部压缩 | HPACK 压缩 Header |
| 服务器推送 | 服务器主动推送资源 |
| 二进制分帧 | 数据以帧传输 |
对比 HTTP/1.1:
9.2 HTTP/3(QUIC)¶
HTTP/3 基于 QUIC 协议(UDP),解决 TCP 队头阻塞。
| 维度 | HTTP/2 | HTTP/3 |
|---|---|---|
| 传输层 | TCP | UDP(QUIC) |
| 握手 | TCP 1 RTT + TLS(1.3 为 1 RTT,1.2 为 2 RTT)= 2-3 RTT | 1 RTT(甚至 0 RTT) |
| 队头阻塞 | TCP 层有 | 无 |
| 连接迁移 | 不支持 | 支持(Connection ID) |
测试关注: - 浏览器是否启用 HTTP/3(Chrome DevTools → Protocol 列) - Fiddler Classic 不支持 HTTP/3(QUIC 基于 UDP) - 需禁用 QUIC 才能用 Fiddler 抓包
9.3 检测协议版本¶
# curl 查看协议
curl -sI --http2 https://example.com
curl -sI --http3 https://example.com # 需 curl 版本和编译特性都支持 HTTP/3
# Chrome DevTools
# Network → 右键列头 → 勾选 Protocol
十、负载均衡¶
10.1 负载均衡是什么¶
将请求分发到多台服务器,提高可用性和性能。
10.2 常见算法¶
| 算法 | 说明 |
|---|---|
| 轮询 | 依次分发 |
| 加权轮询 | 按权重分发 |
| 最少连接 | 分给连接最少的服务器 |
| IP Hash | 同 IP 固定到同一服务器 |
| 一致性哈希 | 缓存场景,节点变化影响小 |
10.3 负载均衡类型¶
| 类型 | 层级 | 工具 |
|---|---|---|
| 四层(L4) | TCP/UDP 传输层 | LVS(Linux 内置)、F5(商业硬件) |
| 七层(L7) | HTTP 应用层 | Nginx、HAProxy |
四层只看 IP 和端口转发,速度快;七层能根据 URL 路径、Cookie 等内容智能分发,功能更强。
10.4 测试关注点¶
| 场景 | 测试方法 |
|---|---|
| 负载分发 | 连续请求,观察是否分发到不同服务器 |
| 会话保持 | 同一用户的请求是否在同一服务器 |
| 健康检查 | 摘掉一台服务器,请求是否自动切换 |
| 故障转移 | 一台宕机,服务是否中断 |
| 加权验证 | 权重高的服务器是否接收更多请求 |
十一、网络安全基础¶
11.1 防火墙¶
防火墙控制网络流量的进出。
类型: - 包过滤防火墙:基于 IP/端口 - 应用层防火墙:基于协议内容 - WAF(Web Application Firewall):专门防护 Web 攻击
测试关注:
# 检查端口是否被防火墙拦截
telnet 192.168.1.100 8080
# 查看防火墙规则
iptables -L -n # Linux(传统)
firewall-cmd --list-all # Linux(CentOS/RHEL)
netsh advfirewall show allprofiles # Windows
# 开放端口(需管理员)
firewall-cmd --permanent --add-port=8080/tcp && firewall-cmd --reload # Linux
netsh advfirewall firewall add rule name="Open 8080" protocol=TCP localport=8080 action=allow # Windows
11.2 WAF(Web 应用防火墙)¶
WAF 防护 Web 攻击:SQL 注入、XSS、CC 攻击等。
测试关注: - WAF 是否拦截了正常请求(误报) - WAF 是否漏过了恶意请求(漏报) - 修改 Payload 绕过 WAF(安全测试)
11.3 VPN¶
VPN(Virtual Private Network)在公网上建立加密隧道。
测试场景: - VPN 连接后访问内网资源 - VPN 断开后的行为 - VPN 对网络延迟的影响
11.4 ACL(访问控制列表)¶
ACL 定义谁能访问什么资源。
测试关注: - 是否按规则正确放行/拒绝 - 规则优先级是否正确 - 默认策略是否合理
十二、微服务网络¶
12.1 API 网关¶
API 网关是微服务的统一入口。
网关功能: - 路由转发 - 负载均衡 - 认证鉴权 - 限流熔断 - 日志监控
测试关注: - 路由规则是否正确 - 鉴权是否生效 - 限流是否按预期触发 - 超时配置是否合理
12.2 服务发现¶
微服务动态注册/发现,不硬编码 IP。
测试关注: - 服务注册/注销是否正常 - 服务下线后是否自动摘除 - 服务发现延迟
12.3 服务网格(Service Mesh)¶
服务网格在每个服务旁边部署代理(Sidecar),处理服务间通信。
常见实现: Istio、Linkerd
测试关注: - 流量路由规则 - 熔断降级策略 - mTLS 加密通信 - 分布式追踪
12.4 消息队列¶
服务间异步通信。
测试关注: - 消息发送/接收正确性 - 消息顺序 - 消息持久化 - 消费失败重试 - 死信队列
附录:速查表¶
网络排障流程¶
常用端口¶
80/443 HTTP/HTTPS
22 SSH
3306 MySQL
6379 Redis
8080 HTTP 备用
27017 MongoDB
5672 RabbitMQ
9200 Elasticsearch
HTTP 状态码速查¶
200 OK 201 Created
301 永久重定向 302 临时重定向 304 未修改
400 参数错误 401 未认证 403 无权限
404 未找到 405 方法不允许 408 超时
429 请求过多 500 内部错误 502 网关错误
503 不可用 504 网关超时
常用命令¶
学习建议
网络知识不需要精通底层原理,重点掌握 HTTP 协议、常用排障命令、常见问题排查。遇到网络问题时按"ping → telnet → curl → 抓包"的顺序逐步定位。
推荐下一步¶
根据你的学习进度,选择下一步:
- 如果你想学接口测试:学习 接口测试方法论,掌握用例设计和安全测试
- 如果你想学性能测试:学习 JMeter 性能测试,掌握压测方法
- 如果你想检验工具基础:做 Linux 基础测验 和 SQL 基础测验,检验学习效果
通关检查¶
完成本阶段后,使用 第2阶段-工具实战通关 检查是否可以进入下一阶段。