跳转至

网络知识教程(软件测试人员专用)

本教程面向软件测试工程师,系统讲解测试工作中需要的网络知识,从 TCP/IP 基础到 HTTP 协议、DNS、代理、WebSocket、CDN、负载均衡、微服务网络等。


前置要求

无前置要求,零基础可直接学习。


新手导读

网络知识很容易越学越底层。测试新人第一遍不需要深挖协议实现,先掌握 HTTP 请求如何发出、DNS 如何解析、代理如何抓包、常见网络错误如何排查。

建议优先理解:

  1. URL、域名、IP、端口分别是什么。
  2. GET、POST、PUT、DELETE 有什么差别。
  3. 状态码 200、301、400、401、403、404、500 大致代表什么。
  4. Cookie、Session、Token 用来解决什么问题。
  5. 遇到访问失败时,按 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 位,用点分十进制表示

192.168.1.100
│          │
│          └── 主机号
└── 网络号

特殊地址:

地址 含义
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 类

子网掩码: 区分网络号和主机号

255.255.255.0  →  /24(前 24 位是网络号)
192.168.1.100/24  →  同网段:192.168.1.0 ~ 192.168.1.255

1.3 端口

端口是应用的"门牌号",范围 0-65535。

端口 服务
80 HTTP
443 HTTPS
22 SSH
3306 MySQL
6379 Redis
8080 常用 HTTP 备用
27017 MongoDB

查看端口占用:

netstat -anp | grep 8080    # 查看谁占了 8080
lsof -i:8080                # 精准查端口(显示进程名)
ss -tlnp | grep 8080        # 查看监听状态
netstat -ano | findstr :8080          # 查看谁占了 8080(只显示 PID)
tasklist | findstr <PID>              # 根据 PID 查进程名(需两步)

Windows 没有 lsofssnetstat -ano + tasklist 是标准做法。

参数拆解:

参数 含义
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 二进制流

这三者都是 HTTP 状态保持的方式,但原理和适用场景不同。测试人员必须理解它们的区别,才能正确测试登录态、鉴权和会话管理。

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 地址。

www.example.com → DNS 查询 → 93.184.216.34

3.2 解析流程

浏览器缓存 → 系统缓存 → hosts 文件 → 本地 DNS 服务器 → 根 DNS → 顶级域 DNS → 权威 DNS
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 访问
curl -H "Host: api.example.com" http://192.168.1.100/api/test

这条命令的用途: 绕过 DNS,直接用 IP 访问服务器。-H "Host: ..." 手动指定 Host 头,让服务器以为你在访问域名(虚拟主机场景必需)。


四、代理与抓包原理

4.1 正向代理

客户端通过代理访问服务器,服务器不知道真实客户端。

客户端 → 代理服务器 → 目标服务器
     Fiddler/Charles 就是正向代理

用途: 抓包、出口代理、缓存、访问控制

4.2 反向代理

客户端不知道真实服务器,请求被代理转发到后端。

客户端 → 反向代理(Nginx) → 后端服务器 A
                            → 后端服务器 B

用途: 负载均衡、SSL 卸载、安全防护

4.3 中间人代理(MITM)

Fiddler/Charles 的工作原理:

客户端 ←──→ Fiddler ←──→ 服务器
     拦截、查看、修改

HTTPS 抓包原理:

  1. Fiddler 拦截客户端请求
  2. Fiddler 用自己的证书与服务器建立 HTTPS
  3. Fiddler 用另一个证书与客户端建立 HTTPS
  4. 客户端需安装 Fiddler 的根证书才能信任

4.4 代理配置方式

系统代理:

Windows: 设置 → 网络 → 代理 → 手动设置
Mac: 系统偏好设置 → 网络 → 高级 → 代理

浏览器代理: 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)

结果解读:

Reply from 93.184.216.34: bytes=32 time=15ms TTL=52
                              ↑              ↑
                           数据量          延迟
  • time 越小越好(< 100ms 正常)
  • 丢包率应为 0%
  • TTL 可粗略判断操作系统(Linux 64,Windows 128)

5.2 traceroute / tracert

追踪路由路径:

# Linux/Mac
traceroute baidu.com

# Windows
tracert baidu.com

可看到每个跳的延迟和经过的路由器。

5.3 telnet / nc

测试端口连通性:

telnet 192.168.1.100 8080         # 测试 8080 端口
nc -zv 192.168.1.100 8080         # nc 更现代,推荐
nc -zv 192.168.1.100 8000-9000    # 扫描端口范围
telnet 192.168.1.100 8080         # 需先启用:控制面板 → 启用 Windows 功能 → Telnet 客户端
Test-NetConnection 192.168.1.100 -Port 8080    # PowerShell,推荐

Windows 没有 nc,PowerShell 的 Test-NetConnection 功能更强,还显示端口是否开放。

5.4 nslookup / dig

DNS 查询:

nslookup baidu.com
nslookup baidu.com 8.8.8.8    # 指定 DNS 服务器
dig baidu.com                  # 更详细,推荐
dig baidu.com +short           # 简洁输出
dig baidu.com A                # 查 A 记录
dig baidu.com MX               # 查邮件记录
nslookup baidu.com
nslookup baidu.com 8.8.8.8    # 指定 DNS 服务器
Resolve-DnsName baidu.com     # PowerShell,输出更丰富

Windows 没有 dignslookup 够用;PowerShell 的 Resolve-DnsName 功能更全。

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,反斜杠 \ 换行改为 ^

# 下载文件
curl -O https://example.com/file.zip

Windows 10+ 自带 curl,语法基本一致。注意:Windows CMD 用 ^ 换行(不是 \),/dev/null 改为 NUL

5.6 netstat / ss

查看网络连接:

netstat -an                           # 查看所有连接
netstat -tlnp                         # 查看监听端口
ss -tlnp                              # ss 更现代,推荐
netstat -an | grep 8080               # 查看特定端口
netstat -ant | grep ESTABLISHED | wc -l    # 统计连接数
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -rn    # 连接状态分布(awk 取第6列,sort 排序,uniq -c 计数,sort -rn 倒序)
netstat -an                           # 查看所有连接
netstat -ano                          # 带 PID,推荐
netstat -ano | findstr :8080          # 查看特定端口
netstat -ano | findstr ESTABLISHED    # 查看已建立连接
netstat -an | find /c "ESTABLISHED"   # 统计连接数

Windows 没有 ssnetstat -ano 是标配。findstr 替代 grepfind /c 替代 wc -l

5.7 ipconfig / ifconfig

查看网络配置:

ifconfig                    # 传统命令(部分系统需安装 net-tools)
ip addr show                # 推荐,现代写法
ipconfig
ipconfig /all               # 详细信息(含 MAC、DNS)
ipconfig /flushdns          # 清 DNS 缓存

5.8 综合排障流程

1. ping 目标 → 通?→ 网络层正常
   不通?→ 检查 IP、路由、防火墙

2. telnet 端口 → 通?→ 端口正常
   不通?→ 检查服务是否启动、防火墙

3. curl 接口 → 正常?→ 应用层正常
   异常?→ 检查请求参数、服务日志

4. 用抓包工具 → 看具体请求/响应

六、常见网络问题

6.1 连接超时

表现: Connection timed out

原因: - 目标服务器不可达 - 防火墙拦截 - 端口未开放 - 网络抖动

排查:

ping 目标IP              # 网络可达?
telnet 目标IP 端口        # 端口通?
traceroute 目标IP         # 路径正常?

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 解析失败

表现: UnknownHostExceptionName 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

原因: - 证书过期 - 自签名证书未信任 - 域名不匹配

排查:

# 查看证书信息
openssl s_client -connect api.example.com:443

# 跳过校验(仅测试)
curl -k https://api.example.com

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,允许服务器主动推送数据。

HTTP:  客户端请求 → 服务器响应(单向)
WebSocket:客户端 ←→ 服务器(双向)

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:

npm install -g wscat
wscat -c wss://ws.postman-echo.com/raw
> hello
< hello

浏览器 F12: Network → WS 标签查看 WebSocket 消息。

测试要点: - 连接建立/断开 - 消息收发正确性 - 心跳机制是否正常 - 断线重连逻辑 - 大消息/高频消息处理


八、CDN 基础

8.1 CDN 是什么

CDN(Content Delivery Network)将内容缓存到全球边缘节点,用户就近获取。

无 CDN:用户 → 源站(北京)→ 响应(慢)
有 CDN:用户 → 边缘节点(本地)→ 响应(快)

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:

HTTP/1.1:每个请求一个连接(或排队等待)
HTTP/2:一个 TCP 连接并行多个请求,缓解 HTTP/1.1 队头阻塞,但 TCP 层仍可能阻塞

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 负载均衡是什么

将请求分发到多台服务器,提高可用性和性能。

客户端 → 负载均衡器 → 服务器 A
                    → 服务器 B
                    → 服务器 C

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 定义谁能访问什么资源。

允许:192.168.1.0/24 访问 80 端口
拒绝:0.0.0.0/0 访问 22 端口

测试关注: - 是否按规则正确放行/拒绝 - 规则优先级是否正确 - 默认策略是否合理


十二、微服务网络

12.1 API 网关

API 网关是微服务的统一入口。

客户端 → API 网关 → 用户服务
                  → 订单服务
                  → 支付服务

网关功能: - 路由转发 - 负载均衡 - 认证鉴权 - 限流熔断 - 日志监控

测试关注: - 路由规则是否正确 - 鉴权是否生效 - 限流是否按预期触发 - 超时配置是否合理

12.2 服务发现

微服务动态注册/发现,不硬编码 IP。

服务 A 启动 → 注册到注册中心(Nacos/Eureka/Consul)
服务 B → 从注册中心获取服务 A 的地址 → 调用

测试关注: - 服务注册/注销是否正常 - 服务下线后是否自动摘除 - 服务发现延迟

12.3 服务网格(Service Mesh)

服务网格在每个服务旁边部署代理(Sidecar),处理服务间通信。

服务 A ←→ Sidecar A ←→ Sidecar B ←→ 服务 B
            流量管理、熔断、监控

常见实现: Istio、Linkerd

测试关注: - 流量路由规则 - 熔断降级策略 - mTLS 加密通信 - 分布式追踪

12.4 消息队列

服务间异步通信。

生产者 → 消息队列(RabbitMQ/Kafka) → 消费者

测试关注: - 消息发送/接收正确性 - 消息顺序 - 消息持久化 - 消费失败重试 - 死信队列


附录:速查表

网络排障流程

ping → telnet → curl → 抓包
网络层   端口层   应用层   详情

常用端口

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 网关超时

常用命令

ping -c 4 host              # 测试连通性
traceroute host              # 追踪路由
telnet host port             # 测试端口
nc -zv host port             # 测试端口(更推荐)
nslookup domain              # DNS 查询
dig domain                   # DNS 查询(更详细)
curl -v url                  # HTTP 调试
ss -tlnp                     # 查看监听端口
tcpdump -i any port 8080     # 抓包(-i any 监听所有网卡,port 8080 只抓 8080 端口的包)
ping -n 4 host              # 测试连通性
tracert host                 # 追踪路由
telnet host port             # 测试端口(需先启用)
Test-NetConnection host -Port port    # PowerShell 测试端口
nslookup domain              # DNS 查询
curl -v url                  # HTTP 调试(Win10+ 自带)
netstat -ano                 # 查看连接和端口

学习建议

网络知识不需要精通底层原理,重点掌握 HTTP 协议、常用排障命令、常见问题排查。遇到网络问题时按"ping → telnet → curl → 抓包"的顺序逐步定位。

推荐下一步

根据你的学习进度,选择下一步:

  1. 如果你想学接口测试:学习 接口测试方法论,掌握用例设计和安全测试
  2. 如果你想学性能测试:学习 JMeter 性能测试,掌握压测方法
  3. 如果你想检验工具基础:做 Linux 基础测验SQL 基础测验,检验学习效果

通关检查

完成本阶段后,使用 第2阶段-工具实战通关 检查是否可以进入下一阶段。