1. 测试环境搭建与工具链选择

模拟网络故障是验证离线优先应用容错能力的核心手段。本章将系统性介绍五种主流网络故障模拟工具的原理、适用场景与基础配置方法,帮助你在不同开发阶段快速搭建可信的测试环境。

1.1 工具对比与选型策略

以下表格从原理层、操作层和适用场景三个维度对五种工具进行对比,帮助你根据测试目标选择最合适的工具组合:

工具/命令原理层操作层适用场景
Wireshark基于 libpcap/Npcap 的包捕获引擎GUI 过滤 + 统计问题定位、协议分析
CharlesHTTP/HTTPS 代理 + 带宽节流GUI 限速 + 断点前端调试、API 联调
Network Link ConditionermacOS 内核级网络策略注入GUI 配置文件iOS/macOS 应用开发
tc (traffic control)Linux 内核 QoS 子系统命令行 + 脚本CI/CD、服务端/容器环境
Docker 网络模拟Linux Network Namespace + tcCompose + 自定义网络微服务、容器化离线测试
选型建议:前端/移动端调试优先使用 Charles 和 Network Link Conditioner;服务端和 CI 环境必须掌握 tc;Docker 网络模拟适合微服务架构的端到端离线测试。Wireshark 作为分析工具贯穿始终。

1.2 工具安装与环境验证

1.2.1 Wireshark

安装后需验证捕获权限是否配置正确:

# Linux(以 Ubuntu 为例)
sudo apt-get install wireshark
sudo usermod -a -G wireshark $USER   # 加入组后需重新登录

# macOS(使用 Homebrew)
brew install wireshark

# 验证捕获接口是否可用
tshark -D

1.2.2 Charles

安装完成后需配置 SSL 代理证书,以支持 HTTPS 流量解析:

// Charles 菜单路径
Proxy -> SSL Proxying Settings
  勾选 Enable SSL Proxying
  添加 *:443

// 移动端证书安装:Help -> SSL Proxying
//   -> Install Charles Root Certificate on Mobile Device
常见错误:iOS 14.5+ 安装 Charles 证书后,需在“设置 → 通用 → 关于本机 → 证书信任设置”中手动启用完整信任,否则 HTTPS 流量仍无法解密。

1.2.3 Network Link Conditioner

macOS 系统自带该功能(需安装 Additional Tools for Xcode),可通过以下方式快速启用:

# 通过命令行管理 Network Link Conditioner 配置

# 启用 3G 模拟
sudo networksetup -setlinkconditioner "Wi-Fi" "3G"

# 启用 100% 丢包模拟
sudo networksetup -setlinkconditioner "Wi-Fi" "100% Loss"

# 查看当前配置
sudo networksetup -getlinkconditioner "Wi-Fi"

# 关闭
sudo networksetup -setlinkconditioner "Wi-Fi" "Off"

1.2.4 tc 命令

tc 是 Linux 内核网络流控工具,基本操作流程如下:

# 查看当前网卡 qdisc
tc qdisc show dev eth0

# 添加 100ms 延迟 + 10% 丢包
tc qdisc add dev eth0 root netem delay 100ms loss 10%

# 添加带宽限制(速率 1Mbps + 突发 32k)
tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms

# 移除所有 qdisc 恢复网络
tc qdisc del dev eth0 root
调试技巧:使用 tc -s qdisc show dev eth0 查看统计信息,包含已发送/丢弃/延迟的包数量,用于验证模拟是否生效。

1.2.5 Docker 网络模拟

通过 Docker Compose 结合 tc 实现容器级网络故障注入:

# docker-compose.yml 示例
version: '3.8'
services:
  app:
    build: .
    networks:
      - testnet

  network-simulator:
    image: alpine:latest
    cap_add:
      - NET_ADMIN
    command: >
      sh -c "ip link set eth0 up && 
             tc qdisc add dev eth0 root netem delay 200ms loss 5% &&
             sleep infinity"
    networks:
      - testnet

networks:
  testnet:
    driver: bridge

1.3 工具链决策流程

网络故障模拟工具选择决策流程 网络故障模拟工具决策流程图 需要模拟哪种网络故障? 前端 / 移动端调试 服务端 / CI 环境 容器化微服务 Charles NLC tc 命令 Docker + tc Wireshark 包分析 💡 工具可组合使用:Charles + Wireshark 用于终端调试

1.4 常见配置错误与排查

问题现象可能原因排查步骤
tc 命令返回 RTNETLINK answers: Operation not permitted缺少 CAP_NET_ADMIN 权限1. 检查是否使用 sudo 或 --cap-add=NET_ADMIN(Docker)
2. 确认内核模块 sch_netem 已加载
Charles 无法捕获 Android 9+ 流量Android 默认不信任用户级证书1. 将 Charles 证书安装为系统证书(需 root)
2. 使用 VirtualXposed 绕过证书锁定
Network Link Conditioner 配置后无效未选中正确的网络接口1. 运行 networksetup -listallnetworkservices
2. 确认服务名(如 "Wi-Fi" 或 "USB 10/100/1000 LAN")
Wireshark 无法捕获所有接口用户未加入 wireshark 组1. groups $USER 检查组成员
2. 重新登录或使用 newgrp wireshark

1.5 环境验证清单

完成工具安装后,执行以下快速验证步骤确保环境就绪:

  1. 基础连通性:ping google.com 确认网络正常工作
  2. Wireshark 抓包:tshark -i any -c 10 应实时显示 10 个包
  3. Charles 代理:启动后浏览器访问 http://chls.pro/ssl 可下载证书
  4. NLC 模拟:启用 100% 丢包配置后 ping 8.8.8.8 应 100% 超时
  5. tc 验证:tc qdisc show dev eth0 | grep netem 应显示延迟和丢包参数
  6. Docker 网络:Compose 部署后 docker exec app ping network-simulator 应显示模拟后的网络特征
稳定性基线:在未注入故障时,所有工具应保证零侵入。使用 tc qdisc del dev eth0 root 和 networksetup -setlinkconditioner "Wi-Fi" "Off" 确认可完全恢复网络环境,防止影响后续测试。