VivianSobers/Link-Failure-Detection-and-Recovery
GitHub: VivianSobers/Link-Failure-Detection-and-Recovery
一个基于 SDN 的链路故障自动检测与恢复方案,通过 Ryu 控制器实现流量无损切换。
Stars: 0 | Forks: 0
# 链路故障检测与恢复
一个软件定义网络项目,能够实时检测链路故障并自动重新路由流量,无需人工干预。
## 问题
网络会失效。电缆会被割断,端口会宕机,硬件会损坏。在传统网络中,恢复速度缓慢且需要手动操作。而在 SDN 控制的网络中,控制器可以看见一切并即时做出反应。
本项目正是展示了这一点。当链路断开时,Ryu 控制器会检测到故障,移除旧的流规则,并在丢包发生前通过备份路径推送新的规则,从而立即恢复连接。
当链路恢复时,控制器会检测到恢复状态并切换回主路径。
## 工作原理
网络拓扑由三个交换机和两个主机组成:
```
h1 --- s1 --- s2 --- h2
\ /
s3
```
**主路径:** h1 → s1 → s2 → h2
**备份路径:** h1 → s1 → s3 → s2 → h2
Ryu 控制器在启动时预安装所有交换机上的显式流规则。当 s1-s2 链路失效时,控制器检测到端口状态变化,删除现有流规则,并安装更高优先级的备份规则,通过 s3 立即恢复连接。
当链路重新恢复时,控制器检测到恢复并切换回主路径。
## 技术栈
- **Mininet** — 网络仿真
- **Ryu** — SDN 控制器(OpenFlow 1.3)
- **Open vSwitch** — 虚拟交换
- **Wireshark / iperf3** — 流量分析与验证
## 安装
### 前置条件
- Ubuntu 24.04(原生或虚拟机)
- Python 3.11
- Mininet 2.3.0
- Ryu 4.34
### 安装步骤
```
# 安装 Mininet
sudo apt install mininet -y
# 安装 Python 3.11
sudo add-apt-repository ppa:deadsnakes/ppa -y
sudo apt update
sudo apt install python3.11 python3.11-venv -y
# 在虚拟环境中设置 Ryu
python3.11 -m venv ~/ryu-env
source ~/ryu-env/bin/activate
pip install setuptools==58.0.0
pip install dnspython==2.3.0 eventlet==0.33.3
pip install ryu
# 安装工具
sudo apt install wireshark iperf3 -y
```
## 运行项目
你需要两个终端。
**终端 1 — 启动 Ryu 控制器:**
```
source ~/ryu-env/bin/activate
ryu-manager controller.py
```
**终端 2 — 启动 Mininet 拓扑:**
```
sudo python3 topology.py
```
## 演示
### 场景 1 — 正常运行
```
mininet> pingall
```
预期结果:0% 丢包。流量通过主路径 h1 → s1 → s2 → h2 传输。
### 场景 2 — 链路故障与恢复
```
mininet> link s1 s2 down
mininet> pingall
```
预期结果:0% 丢包。控制器检测到故障并通过 h1 → s1 → s3 → s2 → h2 重新路由。
```
mininet> link s1 s2 up
mininet> pingall
```
预期结果:0% 丢包。控制器检测到恢复并切换回主路径。
## 预期输出
**故障期间的控制器终端:**
```
==================================================
LINK FAILURE DETECTED on s1-s2! Switching to backup path.
==================================================
ACTIVE PATH: h1 -> s1 -> s3 -> s2 -> h2 (Backup)
==================================================
```
**恢复期间的控制器终端:**
```
==================================================
LINK RESTORED on s1-s2! Switching back to primary path.
==================================================
ACTIVE PATH: h1 -> s1 -> s2 -> h2 (Primary)
==================================================
```
## 验证
- `pingall` 确认故障前后丢包率为 0%
- `ovs-ofctl dump-flows` 确认每个交换机的流规则变化
- Wireshark 捕获确认实时流量路径切换
- iperf3 确认在重新路由期间吞吐量保持稳定
## 执行证明
### 网络启动 — 主路径活跃

### 场景 1 — 正常 pingall(0% 丢包)

### 链路故障检测 — 切换到备份路径

### 场景 2 — 链路故障期间的 pingall(0% 丢包)

### 链路恢复 — 返回主路径

### iperf3 — 正常运行(15.2 Gbits/sec)

### iperf3 — 链路故障期间(16.8 Gbits/sec)

### Wireshark — ICMP 捕获

### Wireshark — ICMP 过滤(正常)

### Wireshark — ICMP 过滤(故障期间)

## 作者
Vivian Sobers E
标签:iperf3, Mininet, OpenFlow, Open vSwitch, Python, Ryu控制器, SDN, Wireshark, 句柄查看, 备份路径, 实时检测, 实验环境搭建, 无后门, 显式流规则, 流规则更新, 流量重路由, 端口状态, 网络仿真, 网络弹性, 网络自动恢复, 软件定义网络, 逆向工具, 链路故障恢复, 链路故障检测, 高可用网络