StarryNet
Abstract
介绍
StarryNet(https://github.com/SpaceNetLab/StarryNet)模拟器是清华网安学院SpaceNetLab实验室开发的卫星网络模拟器
installation
# 介绍
[StarryNet](https://github.com/SpaceNetLab/StarryNet)模拟器是清华网安学院SpaceNetLab实验室开发的卫星网络模拟器
# installation
极大概率遇到无法下载image的情况,推荐使用付费的docker镜像网站下载
[轩辕镜像](https://xuanyuan.cloud),购买流量后,推荐生成一个**专属域名**,将这个专属域名直接添加到镜像列表中,即可顺利下载所需的image
# 支持的API
> 这些 API 围绕“建网—编排—测量—控制—清理”全流程:通过 CLI 或 `StarryNet` 类加载配置与轨道数据,在远端 Linux 上用 Docker 批量创建卫星/地面站节点并按生成的延迟矩阵建立星间/星地子网,启动 Bird 路由;支持查询指定时刻的距离、邻居、连通地面站、位置与 IP,记录主机资源利用;提供按时间片的仿真控制,包括链路损伤/恢复、设置下一跳,以及在指定时刻执行 ping 与 iperf3 性能测试,并通过 `tc netem` 动态注入时延/丢包/带宽以反映拓扑变化;可随时启动/停止仿真,所有测量与配置结果落盘到工作目录,便于回放与分析。
**Python 接口(StarryNet 类)**
在py文件中,创建StarryNet类,可以直接调用以下API
| 名称 | 参数 | 功能说明 |
| ------------------- | ------------------------------------------------------------------ | -------------------------------------------------- |
| StarryNet | `configuration_file_path, GS_lat_long, hello_interval=10, AS=[]` | 初始化星座参数、远端连接、生成位置与延迟、路由配置 |
| create_nodes | 无 | 重置远端环境并创建/重命名所有容器节点 |
| create_links | 无 | 将首个延迟矩阵与编排器下发到远端,建立初始链路 |
| run_routing_deamon | 无 | 在所有容器中分发并启动 Bird 路由 |
| get_distance | `sat1_index, sat2_index, time_index` | 返回指定时刻两节点的距离(公里) |
| get_neighbors | `sat_index, time_index` | 返回指定时刻该节点的邻居列表 |
| get_GSes | `sat_index, time_index` | 返回指定时刻与该卫星相连的地面站列表 |
| get_utility | `time_index` | 记录远端机器的资源利用信息 |
| get_position | `sat_index, time_index` | 返回指定时刻该节点的 LLA 字符串 |
| get_IP | `sat_index` | 返回节点容器内各网络接口的 IP 列表 |
| set_damage | `damaging_ratio, time_index` | 设定在指定时刻随机损伤的比例 |
| set_recovery | `time_index` | 设定在指定时刻恢复损伤 |
| check_routing_table | `sat_index, time_index` | 在指定时刻导出路由表到文件 |
| set_next_hop | `sat_index, des, next_hop_sat, time_index` | 指定时刻为源卫星到目的地设置下一跳 |
| set_ping | `sat1_index, sat2_index, time_index` | 在指定时刻对两节点执行 ping 测试 |
| set_perf | `sat1_index, sat2_index, time_index` | 在指定时刻对两节点执行 iperf3 测试 |
| start_emulation | 无 | 启动仿真主循环,按拓扑变化/事件更新远端网络 |
| stop_emulation | 无 | 停止仿真并清理远端资源 |
# ISL
**建立流程**
- 邻接选择固定:每颗卫星与两类邻居建立 ISL——同轨“下一个”以及跨轨“右邻”,形成规则化的网格拓扑。
- 批量创建:链路初始化时为所有卫星并行创建两条 ISL,分别对应同轨与跨轨邻接,提升建链效率与一致性。
- 二层网络映射:每条 ISL对应一个独立的二层网络(虚拟子网),两端容器分别接入该子网,实现链路级隔离与精确控制。
- 接口规范化:容器内将链路接口重命名为统一格式(如“本端ID-对端ID”),并置为启用状态,便于路由与整形的统一管理。
- 物理特性注入:依据初始时延数据为每条 ISL两端配置队列规则(延迟、丢包、带宽),用网络整形模拟物理层特性。
**handover 机制**
- 邻居不切换:ISL 的邻接集合在仿真期间保持固定,不进行对端切换,避免重建大量链路带来的抖动。
- 平滑演进:随卫星相对位置变化,系统周期性更新现有 ISL 的队列规则,使链路时延随几何变化而连续调整,等效于“无缝 handover”。
- 故障与恢复:支持把某节点的链路临时设置为高丢包(模拟中断)或恢复到既定丢包率,影响可达性与路由收敛,但不改变邻接集合。
**地址与接口约定**
- 子网与命名:同轨与跨轨 ISL 使用有区分的网络命名与固定前缀的子网规划,确保不同链路的隔离与可辨识。
- IP 分配:同轨链路两端使用约定的地址对(如一端“.40”、另一端“.10”);跨轨链路使用不同的地址对(如“.30”与“.20”),便于脚本化管理。
- 接口命名:统一采用“本端ID-对端ID”的接口名,便于在路由与整形规则中进行精确匹配。
**时延与路由**
- 动态时延更新:按时间片根据最新时延矩阵对既有 ISL 执行“变更”而非重建,降低扰动并保持拓扑稳定。
- 路由行为:链路特性变化会改变度量与路径选择;由于邻接固定且接口规范一致,路由协议可快速收敛并维持网络连通性。
# GSL
**建立流程**
- 可见性与选择:观测器按秒计算地面站对卫星的可见集合,依据最大可见距离、纬度窗口与天线数量,选择最近的若干卫星并生成传播时延矩阵。
- 初始建链:链路初始化流程将首帧时延矩阵与编排脚本下发到远端,编排器为所有“卫星—地面站”对创建对应的二层网络并接入两端容器。
- 默认网络:为每个地面站创建其默认管理网络与接口,便于路由与管理。
**handover 机制**
- 拓扑变化生成:观测器把每秒的连通性二值化,比较相邻时间片,生成包含“新增/删除链路”的拓扑变化描述文件。
- 增删执行:仿真主循环按时间片读取拓扑变化,遇到“新增”就动态创建网络并接入两端、重命名接口与设置整形;遇到“删除”就下线接口、断开并删除网络。该过程即为地面站的可见性驱动切换。
**地址与接口约定**
- 每条 GSL 映射为独立的二层网络,使用固定的子网前缀规划(以地面站与卫星编号组合生成),两端容器分配约定的 IP(卫星侧与地面站侧各一)。
- 容器内接口统一重命名为“本端ID-对端ID”的规范化格式,便于路由与队列规则管理。
**时延与可靠性事件**
- 时延动态更新:除增删链路外,系统会按设定周期根据当前时延矩阵更新已有链路的队列规则(`tc netem`),使时延随几何关系变化。
- 损伤/恢复:支持在指定时刻将目标节点的所有接口设为高丢包或恢复到既定丢包率,用于模拟链路中断与修复;不改变可见性选择,但影响可达性与路由收敛。
评论
使用 GitHub 登录参与讨论,评论公开可见。
评论加载失败,请刷新页面重试。
在 GitHub 查看讨论 ↗