Core 仿真架构

Core架构

主要组件

  • Core守护(服务)进程 (core-daemon)

    • 该程序是利用小型C二进制文件来创建节点的Python仿真程序
    • 管理网络节点、链路的仿真会话
    • 使用Linux命名空间创建节点
    • 链路是由Linux网桥和虚拟以太网设备TAP等创建的
    • 链路数据包是通过流量控制来操纵的
    • 仿真过程可以由CORE GUI控制
    • 提供自定义TLV API和gRPC API
  • Core-gui

    • GUI和守护进程通过自定义TLV API进行通信
    • 拖放节点和链接的创建
    • 可以在运行的会话中启动仿真节点的终端
    • 可以保存/打开场景文件重新创建以前的会话
    • TCL/TK 程序
  • Coresendmsg

    • 用于将TLV API消息发送到核心守护进程的命令行实用程序
  • 虚拟命令终端 (vcmd)

    • 用于向节点发送shell命令的命令行实用程序

会话Sessions

CORE可以同时创建和运行多个模拟会话,下面表格从左向右概述了典型GUI交互期间会话将转换的状态。

定义初始化配置参数安装模拟节点运行仿真数据采集停止仿真
XML/IMN 会话 Gui绘制脚本配置hooks、配置服务、配置移动性和WLAN、配置Emance创建节点、接口桥接链路、启动服务移动性仿真、交互shell、状态设定脚本关闭服务销毁接口、桥接链路、节点

工作原理

CORE框架运行在Linux上,并使用Linux命名空间创建节点容器。这些节点使用Linux网桥和虚拟接口连接在一起。CORE会话是一组节点和链接,它们出于特定目的一起工作。Linux网络名称空间(也称为netns: Linux network namespaces )是CORE使用的主要技术。大多数最新的Linux发行版都具有开箱即用的支持名称空间的内核。每个命名空间都有自己的进程环境和私有的网络堆栈。网络名称空间在CORE中共享相同的文件系统。CORE将这些名称空间与Linux以太网桥接结合起来,形成网络。使用Linux Netem排队规则应用链接特性。Ebtables是Linux桥上的以太网帧过滤方法,通过使用ebtables规则控制哪些接口可以发送和接收来模拟无线网络。

之前的工作

Tcl/Tk CORE GUI最初起源于萨格勒布大学的开源IMUNES项目,作为波音研究与技术网络技术研究小组2004年的一个定制项目。从那时起,他们开发了使用Linux命名空间的CORE框架,开发了一个Python框架,并进行了大量的用户和内核空间开发,例如支持无线网络、IPsec、分布式仿真、仿真集成等等。IMUNES项目还包括用户空间和内核组件。

开源项目和资源

CORE已经由波音在BSD许可下发布给开源社区。如果您发现CORE对您的工作有用,请返回到项目中。贡献可以像报告bug、向邮件列表提供鼓励或技术建议一样简单,也可以包括提交补丁或维护工具的各个方面。

Python API

关键要理解上面的架构图,就能明白下面这些api的具体实现

使用Python API可以完全控制仿真的所有方面,这些python脚本需要以 root 权限运行,因为它们会创建新的网络命名空间。

一般情况下 使用这些python api 的CORE Python 程序不会连接到 CORE daemon(可以理解为它自己就是一个core-daemon),实际上,core-daemon 只是另一个使用 CORE Python api 模块并与 GUI 交换消息的 Python 脚本。相关api文件查看该路径 core/daemon/core/emulator/data.py 的 InterfaceData类。

具体例子就不分析了,直接看使用gRPC协议的 api 如何使用。

gRPC API

core-pygui 与 coredaemon 的界面交互就是通过 gRPC api 来驱动core的所有功能,所以调用这些api需要启动 core-daemon。可以从包含在 CORE 中的原始生成的 grpc 文件创建一个 python client,或者可以利用 core 源码中 提供的 gRPC api 来帮助封装一些功能做进一步的开发。

gRPC api是指使用了gRPC框架通信协议的api,其代码实现可以是python c++等语言(这里使用的还是python语言)与上述的Python api并非同种api。

CoreGrpcClient 提供了一个 python 客户端包装器其封装了一些常用的api调用,下面的示例就是调用的它。由于 gRPC 基于 HTTP2,代理配置可能会导致问题。默认情况下,gRPC 客户端禁用代理支持以避免启用代理时出现问题。Proto 文件用于定义用于与此 API 接口的 API 和 protobuf 消息。 可以在此处找到它们以查看正在发生的事情的细节以及将返回的响应消息值。

具体例子和python api的例子在同一目录中,可以看到其api的调用与功能与python api非常相似,个人猜测是原有的 coresendmsg core-gui 等程序调用的 tlv 协议作者想一步步弃用,所以为了兼容降低学习成本根据原来tlv格式的api使用方法 来设计封装 gRPC api。该上级目录其中还包含了docker、lxd映射到core仿真中的某个节点的示例,后续有可能会进行相关的开发。