linhaijing - sinsuet/hymn GitHub Wiki
卫星通信仿真平台使用手册
目录
6.9.4 配置选项:AT_FREQ、AT_ANGLE、AT_RADIUS 96
编制历史
文档版本 | 使用状态 | 修改简述 | 修订人 | 审核人 | 修订日期 |
---|---|---|---|---|---|
V1.0 | 废止 | 完成初稿 | 陈锦智 | 2023-09-13 | |
V1.1 | 废止 | 更新内容 | 陈锦智 | 2023-11-06 | |
V1.2 | 废止 | 架构升级 | 陈锦智 | 2024-06-18 | |
V1.3 | 正常 | 优化文档 | 陈锦智 | 2024-09-03 | |
V1.4 | 正常 | 增加非Web部分、更改标题 | 祝有霖 毛文俊 |
2024-09-28 |
*文档版本
从V1.0开始,每修改一次在小数点后加1;
*使用状态
废止:已经不再使用
限制使用:特殊版本,有限条件下使用,需要在对应的修改简述里面描述清楚限制条件;
正常:正在使用的版本
*审核人
如果是多个审核人或多人评审,填写主要审核人或负责人
本文档主要介绍广州爱浦路网络技术有限公司卫星通信仿真平台系统(SCEPS,以下简称仿真平台)的使用方法。
目前仿真平台的使用方式主要有两种,一种是通过浏览器登录Web端对用户预想的卫星通信场景(scenario)进行配置、可视化查看和运行;第二种是通过登录仿真平台服务器使用命令行参数和配置文件对用户预想的卫星通信场景进行配置和运行。两种使用方式可独立使用,也可同时互相参照在功能上形成互补,各有优缺点。
使用Web端的主要优点是对不熟悉命令行操作的用户更友好,且可通过可视化功能查看创建的场景,每个节点可以独立点击进行配置。缺点是在大规模场景下批量配置的功能支持不够完善,容易卡顿;以及对复杂卫星或终端模型的支持不够完善。
使用命令行操作的主要优点是能够较完美支持各种复杂卫星或终端模型和场景的配置,各种场景的配置速度更快、批量配置功能更完善。缺点是有操作门槛以及没有可视化功能让用户查看创建的场景。
本文档首先介绍仿真总体概念、其次介绍仿真平台Web端的使用、再介绍仿真平台命令行操作的使用、再介绍仿真结果的查看、最后介绍目前仿真平台主要使用的内置模块。其中Web端的使用先对每个页面的功能进行简要概述,再尝试描述二个完整的仿真场景创建过程以帮助用户理解。其中命令行操作的使用首先介绍各个配置文件的作用和内容、再给出二个配置案例帮助用户理解。
最后,练习使用仿真平台就像学习一门编程语言。仿真每个模块就像编程语言的关键字,特性较多,以学习编程语言的心态来看待这件事,似乎是个不错的选择。
- **仿真器:**由Go语言实现的用于运行各种用户自定义场景的可执行程序,其内置实现了多种功能模块,所有用户场景构建于这些模块之上,排列组合,运行产生效果和结果。
- **位置模板:**用于描述一段时间内一组节点的位置状态所使用的算法和参数。如静态位置、飞机轮船、使用SGP4算法和TLE两行参数推算卫星位置、一组时间位置序列等。
- **功能模板(节点模型):**用于描述一个节点拥有的功能和功能互相交互连接的配置。
- **节点配置:**功能模板(节点模型)中的各个功能可以设置不同的运行参数,从而每个节点拥有不同的具体行为。如卫星天线设备的参数、基站连接核心网的参数。
- **仿真节点:**功能模板绑定位置模板,再完成节点配置,形成一个拥有完整行为的仿真节点。这些通过场景配置完成。
- **仿真场景:**多个不同的仿真节点互相影响、交互,形成一个仿真场景。
- **仿真结果:**仿真场景中各个节点的行为及交互的数据和记录。
- **核心网:**核心网是一个集合,是很多具有特定功能的设备的统称,可以视为一个“非常复杂的加强版路由器”,主要负责将来自接入网的呼叫请求或数据请求接续到不同的网络(DN)上。
- DN:(Data Network,数据网络),内容和服务提供者,访问这些内容和服务是终端的主要目标。
仿真APP -- 核心网 -- DN
↓
虚拟仿真场景 -- 核心网 -- DN
↓
卫星终端 -- 卫星基站(接入网) -- 核心网 – DN
↓
卫星终端 -- 卫星基站(接入网) -- 卫星网络(承载网|传输网) -- 核心网 – DN
下面从上往下依次对仿真平台Web端页面的功能进行简要介绍。
列出用户在使用仿真平台时已创建的卫星通信场景,将鼠标移至场景面板上可进一步点击运行、编辑、删除、导出等操作。
点击场景的运行操作进一步配置运行参数,目前能配置场景起始时刻、场景时间流速以及场景运行时长(现实时间)。进一步点击“运行”或“运行并打印日志”来运行仿真场景。
点击场景的编辑操作会跳转页面,其中能修改节点配置。
从场景列表中永久删除场景。
场景配置数据以三个配置文件打包成的一个.zip压缩包文件导出,具体内容略。
在界面左侧栏目中输入场景名称、场景描述、从模板元素列表中双击想要加入到场景中的节点。在界面右侧的管理列表中点击删除以删除节点、点击节点名称定位到节点位置。在界面右侧下方点击新增完成场景的基本创建。
点击“新建场景”后,如图上所示。填写场景名称、描述,双击鼠标左键选取模板元素(包括:信关站、卫星、终端,可以多选;选取成功后,会显示在右侧的“管理列表”中;若选错,可在“管理列表”中点击删除,如下图所示),然后点击右下方的“新增”按钮,即可完成场景的初始化。
在“管理列表”中,勾选一整个模板,即可对该模板里面的所有实体的配置进行批量编辑、删除。
从管理列表勾选选定的模板里面的所有实体,进行配置。配置表单分为三部分:运算变量(定义运算公式)、批量配置(把运算公式应用到具体的配置项)、是否删除已有配置(一个实体可以有多条配置项,如果选择保留,则添加当前的配置项时,对原有的配置项没有任何影响;如果选择删除,则添加当前的配置项时,会删除原有的所有的配置项)。例如:配置10个终端的IP地址(连续的),如图:(n表示第n个实体)
删除选定的模板里面的所有实体的某一个数据流的某一个配置项。一般是在对场景进行修改时用到,先是在此处删除配置项,然后在批量节点配置中,重新配置。
在“管理列表”中,勾选某个模板里面的一个实体,即可对该模板里面的这个实体进行配置。点击“节点配置”表单的右侧的“-”按钮,可以删除对应的数据流的对应配置项;点击底部的“+”按钮,可以增加一条配置项(选择数据流,然后选择配置项,最后填写值);完成后,点击“保存”按钮即可。
点击“隐含模块”,可以对场景的模块进行配置,或者增加隐含模块。如图所示。隐含模块:指当前场景中,构建模板时没有关联到的,但是实际运行场景时需要的模块。其中“bindUL/bindDL”:在创建的场景中,模块没有显式设置上行或下行的下一个模块,则会根据数据方向查找bindUL或bindDL作为下一个模块,如果bindUL或bindDL不存在,数据会被丢弃。
命令行运行场景包含6个文件:mType.conf、dType.conf、nType.conf、tle.loc、static.loc
导如文件基于以上6个文件修改,改后的文件包含3个文件:scene.conf、static.conf、tle.loc
scene.conf 格式如下图:
info : 场景信息
name:场景名称
describe:场景描述
nType: 直接复制 nType.conf 中的内容
dType: 直接复制 dType.conf 中的内容
mType: 直接复制 mType.conf 中的内容
scenario: 直接复制 scenario.conf 中的内容
name :节点名称必须是nType 中的name ,
如本示例中 nType 中有三个节点:
LEO_ENTITY-20212208:卫星节点,
GS_ENTITY-20212208:信关站节点,
UE_ENTITY-20212208:终端节点,
卫星节点对应的卫星位置在tle.loc文件中,信关站节点和终端节点需要再 static.conf 中定义,所以本文件中有两条name;
item:条目
name:节点名称,用于场景中绑定静态位置,如下图,绑定GS_ENTITY-20212208节点中gs1

直接用原文件就可以,不用修改
注:nType 、scenario、和 static.conf 中的节点名称一定要一样(static.conf 节点数量少,单名称要一样)
打开 【场景列表】鼠标放入【创建仿真场景】上,点击【导入场景】出现如下弹窗:
选择对应的文件导入,点击【导入】按钮完成
基于核心网AMF网元的数据,可查看实时的在线基站数、注册用户数、连接态和空闲态用户数、以及各种信令消息指标。
仿真的部分运行数据支持以表格文件方式下载和查看。如果配置了抓包,抓包文件也可下载查看。
设计或导入卫星、终端、信关站三种节点类型的位置模板。卫星位置模板主要需要导入TLE参数。终端位置模板可以选择静态或移动,静态位置时可批量生成终端,动态位置可手动设置轮船、飞机、高铁的运行轨迹。信关站位置模板主要为静态位置。
路径:模板设计-->位置模板-->卫星
预览某个模板的星座分布情况:进入该页面后,鼠标在“卫星模板列表”中的任意一个模板悬停,其右侧会有“☑”出现,点击即可。如图所示。
新建一个星座模板:点击“卫星模板列表”的“⊕”,出现“新建模板”弹窗,填写名称、选择在功能模板配置好的节点,此时可以通过导入文件或者手动粘贴文本到输入框,进行星座TLE的填写,填写完成后,点击“确定”即可完成新建操作。如图所示。
路径:模板设计-->位置模板-->终端
预览某个模板的终端分布情况:进入该页面后,鼠标在“终端模板列表”中的任意一个模板悬停,其右侧会有“☑”出现,点击即可。如图所示
新增终端模板基础操作:
- 首先点击“⊕”新建一个终端模板。
- 然后点击蓝色框的加号进行单个终端的新增,或者点击红色框的按钮进行批量终端的新增。批量新增时,只需用鼠标左键在地图上选取多个点,即可选定一块区域进行批量增加。
- 最后点击黄色框的按钮,进行保存。
**批量新增终端:**按照上述基础步骤执行的基础上,点击红色框按钮后,出现对话框,根据自身需要,选择绘制类型、分布方式、数量方式,填写名称、数量,然后在地图中,用鼠标左键单击选点,双击完成选点,由此圈选出某个空间进行批量撒点。
最后点击表单的确定按钮,即可得到下图的结果。
**新增高铁/火车类型的终端:**按照上述基础步骤执行的基础上,在新建模板时,“模板类型”选择“高铁”,然后确定,再点击“+”号按钮后,出现图如下图所示的对话框,填写名称和速度(km/h),再在地图上单击鼠标左键选点,双击完成选点,点击表单的新增按钮。
**新增船只类型的终端:**按照上述基础步骤执行的基础上,在新建模板时,“模板类型”选择“船只”,然后确定,再点击“+”号按钮后,出现下图对话框,填写名称和速度(km/h),再在地图上单击鼠标左键选点,双击完成选点,点击表单的新增按钮。
**新增航线类型的终端:**按照上述基础步骤执行的基础上,在新建模板时,“模板类型”选择“航线”,然后确定,再点击“+”号按钮后,出现下图对话框,填写名称、速度(km/h)、飞行高度,再在地图上单击鼠标左键选起始点,再次单击选定终点,完成航线选取后,点击表单的新增按钮。
**新增移动模型的终端:**按照上述基础步骤执行的基础上,在新建模板时,“模板类型”选择“移动模型”,再选择移动类型(低速、低中速、中速、中高速、高速),然后确定,再点击“+”号(单个添加)或者“交叉”符号(批量添加)按钮后,出现下图对话框,填写名称,再在地图上单击鼠标左键选起始点,运动轨迹由仿真器自动生成,完成选取后,点击表单的新增按钮。
路径:模板设计-->位置模板-->信关站
预览某个模板的信关站分布情况:进入该页面后,鼠标在“信关站模板列表”中的任意一个模板悬停,其右侧会有“☑”出现,点击即可。如图所示
新增信关站:
- 首先点击页面右上角的加号,然后填写信息,创建一个模板。
- 再在创建好的模板中,点击地图上某一位置,新增信关站。(可连续新增多个信关站)
- 最后点击右侧列表的黄色按钮,即可保存成功。
仿真平台会列出可用的模块,用户根据模块排列创建设备,再使用设备排列创建节点,节点就是功能模板,也可称为节点模型。
路径:模板设计-->功能模板-->模块
**说明:**每个模块处理特定的消息事件。
**查看模块及其配置项:**进入该页面后,鼠标点击列表中某行左侧的“>”,其配置项会在下方展开。如图所示
路径:模板设计-->功能模板-->设备
**说明:**每个设备处理特定的功能。
**查看设备详情:**点击页面左侧列表任意一行,页面右侧会显示对应设备的详情。
新增设备:
在页面右侧表单(新增设备),填写名称、描述,然后按从高到低的数据流向,添加(选择)相应模块,点击保存即可完成。
注意:
- 若页面处于显示设备详情,是没有新增设备表单的,此时需要点击下图中的切换开关。
- 模块的改动可以通过页面中的“+”、“-”按钮进行修改。
删除设备:
在左侧设备列表中,点击需要删除的某个设备,然后在右侧设备详情表单中点击删除按钮即可。如图所示。
修改设备:
在左侧设备列表中,点击需要修改的某个设备,然后在右侧设备详情表单中修改,最后点击修改按钮即可。如图所示
路径:模板设计-->功能模板-->节点
**说明:**每一个节点对应一种实体的所有功能属性。
**查看节点详情:**点击页面左侧列表任意一行,页面右侧会显示对应节点的详情。
新增节点:
在页面右侧表单(新增节点),填写名称、描述,然后按对应的数据流,添加(选择)相应设备,点击保存即可完成。(红色框内的按钮,用来增删数据流;蓝色框内的按钮,用来增删设备)
注意:
若页面处于显示节点详情,是没有新增节点表单的,此时需要点击下图中的切换开关。
查看节点拓扑:
在左侧节点列表中,点击需要查看的某个节点,然后再在页面右侧的表单底部点击“查看数据流拓扑图”,其拓扑图将在弹窗中显示。如图所示。
删除节点:
在左侧节点列表中,点击需要删除的某个节点,然后在右侧节点详情表单中点击删除按钮即可。
修改节点:
在左侧节点列表中,点击需要修改的某个节点,然后在右侧详情表单中修改,最后点击保存按钮即可。如图所示
仿真平台支持替换的算法可在此页面进行上传,激活生效等操作。
- 创建一个1935颗卫星、1个信关站组网并选择其中10颗卫星执行PING核心网服务器的场景。
- 创建一个216颗卫星、1个信关站、10个随机位置终端接入的场景。
- 从浏览器(建议使用Chrome浏览器、火狐浏览器或者Edge浏览器),使用默认提供本系统后端服务的服务器的IP地址和端口(8810)打开Web登录页面,利用5GC网管默认提供的账号和密码,或者在5GC网管中配置好的账号和密码登录Web系统。
- 按顺序(模块、设备、节点)配置功能模板。
- 配置位置模板。
- 设计场景。
- 在场景列表中选择场景进行仿真。
- 查看仿真结果数据。
分析场景特征,主要有卫星和信关站二种节点,需要配置二种功能模板,二种位置模板,批量配置每个节点的运行参数,然后单独设置10个卫星节点进行PING业务,最后运行验证。
按照惯例,每一个卫星的模型首先拥有前后左右加馈电五个链路,另外由于只做PING业务,所以本次创建的模型卫星只要再加一个路由旁路并在旁路上添加PING功能模块。具体为什么和原理,需要对仿真平台每个模块的特性理解非常清楚才行,这些特性较为复杂难以一一讲明。正常用户可以当作没有“功能模板设计”这个功能,仿真平台安装时会自带一些常用的模型。
- 模块
首先,创建一个卫星需要用到SAT_FACILITY模块,从功能模板->模块页面可查看SAT_FACILITY的模块描述和选项及选项描述。此模块包含星间链、馈电链功能,也包含卫星路由功能和将数据转发到路由旁路的功能。当路由数据包的目的地址是卫星自身时将数据包转发到旁路。
旁路进行简单的PING包处理收发,用ICMP4模块。
- 设备
设备将模块简单重命名一遍,不需要模块间组合。这里将ICMP4 重命名为BYPASS_ICMP。
- 节点
五个链路加一个路由旁路,共六个数据流,如下:
信关站至少有一个馈电链路,用于与卫星建立连接。另外信关站提供仿真与外部实物设备进行通信的网卡IO操作。
- 模块
创建一个信关站只需要用GS_FACILITY模块,其包含馈电链路功能和网卡IO操作功能。
- 设备
设备将模块简单重命名一遍,不需要模块间组合。
- 节点
信关站只需要配置一个数据流,这一个数据流同时提供馈电链路功能和网卡IO功能不产生冲突。
- 需要提前准备好所有卫星的TLE 2行参数的文件或文本。
- 操作步骤
- 完成快照
- 操作步骤
- 信关站快照
操作步骤
① 填写场景名称
② 填写场景描述
③、④ 左侧栏从已创建的位置模板列表中双击选取用于构建场景的卫星、信关站模板
⑤ 点击新增,初步保存场景
- 场景列表
返回场景列表能看到已经创建的场景,鼠标移动到场景面板上可选择编辑操作
- 配置信关站
信关站数量只有一个且业务相对简单,先配置信关站的运行参数。
① 管理列表勾选要进行配置的信关站节点
② 点击绿色[+]加号能为信关站信关站添加一条配置选项
③ 选择数据流 -> 选择配置项 -> 填写配置值
④ POS_COMBINE用于信关站绑定位置模板, “static:gs1”表示静态类型、名称为gs1的位置模板
⑤ NIC_BIND用于信关站绑定使用的网卡,“dpdk:eth0”表示使用基于dpdk的网卡,在dpdk中该网卡的名称为eth0
- dpdk接管的网卡在核心网网管查看(配置好的前提下)
- 批量配置卫星
① 运算变量:提供一个从1递增的变量n,可对n进行算数运算,并命名该运算
② 选取数据流、选取配置项、填写变量值,其中变量值可以用‘${运算变量名}’进行引用和字符串拼接。
③ 卫星节点1到6数据流分别配置SAT_FACILITY.PORT_TYPE(端口类型)为“pre、left、next、right、gs、bypass”
④ 数据流6配置SAT_FACILITY.POS_COMBINE为“tle:${tle}-229”,其引用了运算变量“tle”进行字符串拼接,运算式为“20000+((n+44)/45)*100+((n+44)%45)+1”,具体是根据导入的TLE 2行参数的特征来定的。
⑤ 数据流6配置SAT_FACILITY.IPADDR为“172.16.${f3}.${f4}”,其中“f3”运算式为“18+(n/256)”,“f4”运算式为“n%256”,具体意图为给每个卫星配置IPADDR的值从172.16.18.1连续递增。
- 独立配置卫星
① 管理列表展开卫星随机选取(勾选)其中一个,展开其配置项
② 数据流6,配置BYPASS_ICMP.SESSION的值为“172.16.18.10:172.17.50.2:20”,表示该卫星节点配置用自身IP地址自动PING 172.17.50.2的业务,PING包的长度为400字节, 每2秒执行一次。
③ 随机再选9个卫星节点进行相同配置
- 运行配置
根据TLE 2行参数特征,设置场景起始时刻为2024/08/16 12:00:00
设置运行时长10分钟
- Web端运行并打印日志
- 直接从服务器查看日志文件
tail -f /runtime/log/sceps/out_srv_satemu.log
- 模块
相比上一个场景,增加2个模块分别为:TCPIP4v4、SAT_AN。
基站业务比简单PING业务复杂很多,现在路由旁路需要处理传输层协议,并且卫星要装载基站逻辑,上述两个模块分别处理传输层协议和基站逻辑。
- 设备
从两个模块简单创建两个设备。
- 节点
卫星基站配置9个数据流,前5个与上一个场景一样;
第6个数据流将路由旁路转给传输层处理模块,再进一步转给基站内核,作为基站N2端口;
第7个数据流作为基站与终端的无线传输端口;
第8个数据流作为基站与终端的无线广播端口;
第9个数据流作为基站与UPF连接传输用户面数据的N3端口;
与上一个场景使用相同的信关站模型。
- 模块
主要用到两个模块:UE_FACILITY、SAT_UE,分别处理终端的无线传输、信令面(接入和切换)与数据面(数据锚点与传输)。
- 设备
简单重命名
- 节点
终端模型配置2个数据流,分别处理广播无线消息收发与非广播无线消息收发。
提前准备好216颗卫星的TLE 2行参数文本或文件,然后使用与上一场景同样的方式导入生成卫星位置模板。
与上一个场景使用使用相同的信关站位置模板
操作步骤
其中步骤⑨为在步骤⑧选择绘制类型的基础上,在地图上双击生成对应类型的起始点,如果是多边形在后续单击选择下一个点右击取消上一个点,最后再双击完成闭环绘制;
步骤⑩输入随机生成节点的数量;
步骤12保存创建的位置模板。
与上一个场景的创建步骤一致,选择正确的模板元素然后创建。
- 配置信关站
与上一个场景使用相同的配置参数。
- 批量配置基站
其中特别注意的是:
① 数据流1~6的PORT_TYPE按照惯例配置为“pre、left、next、right、gs、bypass”;
② 数据流6配置SAT_FACILITY.POS_COMBINE 为“tle:${tle}-081”绑定卫星移动模板;
③ 数据流6配置BYPASS_L4.SESSION为“sctp:${本地地址}:${核心网AMF的N2地址}”,其中本地地址为“卫星IP地址:端口0”,端口0会随机分配端口,核心网AMF的N2地址根据实际部署情况,这里为“172.17.50.2:38412”
④ 数据流7和数据流8分别配置基站接入和广播两部分的无线配置,主要包括天线频率、覆盖角度和信号范围半径。角度的配置“100pi/180”单位为弧度值,为“100乘π除以180”,表示角度值100°。
所有配置如下
- 批量配置终端
- 独立配置终端
为了确认终端成功上线且会话建立且能够进行端到端业务传输,随机选择一个终端为其配置PING业务。基于实际的部署情况,这里配置数据流2的UE_CORE.PING为“172.17.0.3:500:20”,当终端会话建立成功后,终端会使用核心网为其分配的IP地址,通过接入的卫星基站,自动向172.17.0.3发送PING请求,包长为500字节,周期为2秒。
其中的目的IP地址172.17.0.3,是整个实验网络中DN(数据网络)中的一个服务器,根据实际部署情况确定,部署要达到完整的终端能够收到服务器应答的效果,包含很多高深知识点与操作,没几个人能学懂,此处略。
- 运行配置
根据TLE 2行参数特征,设置场景起始时刻为2022/03/02 12:00:00
设置运行时长10分钟
- 从服务器查看日志
tail -f /runtime/log/sceps/out_srv_satemu.log
从日志可以看出多个终端已成功获取核心网分配的IP地址,并且ue3会话建立后开始自动发送ping业务,并且收到并打印了ping的回显。
命令行操作无法回避对各种文件进行操作,可分类为可执行程序及依赖、配置、日志几种。
- 路径
在使用RPM包方式安装仿真平台情况下,默认的可执行程序以及依赖存放路径为:
/opt/net/firmware/active/sceps
- 文件树
/opt/net/firmware/active/sceps
├── bin
│ ├── satemu # 仿真器可执行程序
│ └── satsim_server # 仿真后端可执行程序
├── lib # 依赖文件夹
│ ├── lib5gairsim.so # 5gas动态库
│ ├── libaec.so.0
│ ├── libarmadillo.so.9
│ ├── libarpack.so.2
│ ├── libblas.so.3
│ ├── libgfortran.so.3
│ ├── libgodpe.so # dpdk动态库
│ ├── libhdf5_hl.so.8
│ ├── libhdf5.so.8
│ ├── liblapack.so.3
│ ├── libmodRouterImpl.so
│ ├── libopenblaso.so.0
│ ├── libquadmath.so.0
│ ├── libsatlas.so.3
│ ├── libsuperlu.so.5.1
│ ├── libsz.so.2
│ ├── libtatlas.so.3
└── loadInfo.txt
- 其它依赖
使用dpdk网卡时,用到其它路径的依赖(动态库)文件:
/opt/net/firmware/active/plt/lib
/opt/net/firmware/active/cmn/lib
/opt/net/firmware/active/dpdkproc/lib
- 路径
仿真平台运行时会默认读取一些配置文件,路径:
/opt/net/sceps
- 文件树
/opt/net/sceps
├── cplugin # 忽略
│ ├── libmodRouterImpl.so
│ └── memoryso.so
├── du_parameter.ini # 5gas读取的配置文件
├── pcap # 自动抓包存放路径
├── satemu.conf # 仿真器读取的配置文件
├── satserv.yaml # 仿真后端读取的配置文件
└── TLE
├── 216leo.tle
├── leo1935orb43.tle
└── Leo1935Simple.tle
- supervisor
用于维护仿真后端程序的进程生命周期(启动、维持后台运行、停止、重启),严格来说本章与命令行操作跑场景关系不大。
- 仿真后端的supervisor配置文件路径
/opt/net/supervisor/satsim_server.conf
- 文件内容
(其中environment=xxx是supervisor为进程独立设置的环境变量,例如C语言使用getenv()读取环境变量值)
cat /opt/net/supervisor/satsim_server.conf
directory=/opt/net/firmware/active/sceps
command=/opt/net/firmware/active/sceps/bin/satsim_server
numprocs=1
startsecs=1
;startretries=5
;stopsignal=TERM
exitcodes=0
autostart=true
priority=1
stdout_logfile=/runtime/log/sceps/out_%(program_name)s.log
stderr_logfile=/runtime/log/sceps/err_%(program_name)s.log
environment=LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/opt/net/firmware/active/plt/lib:/opt/net/firmware/active/cmn/lib:/opt/net/firmware/active/dpdkproc/lib:/opt/net/firmware/active/sceps/lib",
LOG_LEVEL_5GAS="ERROR",
CONFIG_DIR="/opt/net/sceps",
SCEPS_MOD_ISOLATE_NODE=1,
SCEPS_UE_FEWER_HO=1,
SCEPS_UE_CONGESTION_CTRL_RATE=150,
SCEPS_SAN_DISABLE_PAGING=1,
SCEPS_NET_DELAY_FACTOR=0,
SCEPS_ROUTER_EXPORT_DISABLE=0
- 路径
/runtime/log/sceps
- 文件
/runtime/log/sceps/out_srv_satemu.log # 运行仿真场景仿真器打印的日志
/runtime/log/sceps/out_satsim_server.log # 仿真后端的标准输出打印
/runtime/log/sceps/err_satsim_server.log # 仿真后端的错误输出打印
/opt/net/firmware/active/sceps/bin/satemu -h
Usage of /opt/net/firmware/active/sceps/bin/satemu:
-c string
the conf source of satemu is redis or file[ redis | file ] (default "redis")
-f string
global conf file to read for satemu, you can also set the value by ENV as key = SATEMU_CONF
-p string
uu,n2,xn口抓包选项,(例如:如果要抓uu和n2的包,则填入'uu|n2'), 若不填改参数,则为全抓
-runid string
每次运行的run_id
-s string
running speed, time scale
-scen_comment string
备注
-scenid uint
运行的scenario_id
-t string
running duration of satemu(e.g. 1d3h20m15s) (default "40s")
下面详细介绍仿真器在命令行场景运行时的每个配置文件。
仿真器的命令行参数‘-c’可设置读取加载仿真场景是从redis还是从配置文件,当使用‘-c file’时,仿真器会尝试从文件读取和加载场景,这时首先要读取的文件是satemu.conf。
仿真器依次尝试以以下4种方式读取satemu.conf,分先后顺序:
① 存在时,命令行参数‘-f’配置的值
② 存在时,环境变量“SATEMU_CONF”配置的值
③ 尝试从当前工作路径查找是否存在satemu.conf
④ 默认文件路径/opt/net/sceps/satemu.conf
satemu.conf文件格式为yaml,示例内容及注释:
log_level: info # 日志等级:error、info、debug
time_anchor: 2022-03-02T12:00:00+08:00 # 场景的起始时刻
time_scale: 1 # 场景的时间流速,一般不改
meta_files: # 模型文件,对应web的功能模板:
module_type: ./conf/mType.conf # 从此文件读取场景要用到模块
device_type: ./conf/dType.conf # 从此文件读取由模块设计组成的设备
node_type: ./conf/nType.conf # 从此文件读取由设备设计组成的节点(模型)
scene_file: ./conf/scenario.conf # 节点绑定位置、每个节点的运行参数
tle:
file: ./conf/leo216.loc # 从此文件读取TLE参数(卫星位置模板)
time_start: 2022-03-02T12:00:00+08:00 # 位置外推起始时刻(一般与上面一样)
time_granularity: 1s # 位置外推粒度
time_duration: 1h30m # 位置外推总时长
static_file: ./conf/static_xyz.loc # 从此文件读取静态位置模板(终端和信关站)
redis:
addr: 127.0.0.1:6379 # redis
passwd: 123456
mysql:
addr: 127.0.0.1:3306 # mysql
user: root
passwd: 123456
对应satemu.conf的meta_files >> module_type需要读取的文件,也对应web的“3.1.2.5隐含模块(忽略)”章节。
主要用于配置在仿真器支持的所有模块中,当前场景需要初始化和使用的模块。因为不是所有模块都加载和初始化,所以需要配置。
mType.conf文件格式为yaml,示例内容及注释:
(所有模块的信息可在web端查看,对应3.1.6.1章节)
-
name: GS_FACILITY # 该场景需要用到GS_FACILITY(地面站设施)模块
-
name: SAT_FACILITY # SAT_FACILITY(卫星设施)模块
-
name: UE_FACILITY # UE_FACILITY(终端设施)模块
-
name: SAT_AN # SAT_AN(基站内核)模块
-
name: SAT_UE # SAT_UE(终端内核)模块
-
name: TCPIP4v4 # TCPIP4v4(传输层处理)模块
-
name: SAT_MAP_GW # SAT_MAP_GW(星上设备映射)模块
对应satemu.conf的meta_files >> device_type需要读取的文件,也对应web的“3.1.6.2设备”章节。
① dType.conf文件格式为yaml;
② path标注设备使用的模块,一个设备可由多个模块前后拼接组成;
③ 数据在模块/设备之间流动,仿真将数据分为上下行两个方向/概念,在path配置中越先出现的模块越处于“底层”,数据向上层流动称为上行,反之为下行;
④ path配置中模块之间用“-”(减号)连接,如: TCPIP4v4 - SAT_AN。数据从TCPIP4v4向SAT_AN流动称为上行。
示例内容及注释:
-
name: SAT_FACILITY # 本文件内所有设备都只有一个模块直接组成
path: SAT_FACILITY
-
name: UE_FACILITY
path: UE_FACILITY
-
name: AN_CORE
path: SAT_AN
-
name: UE_CORE
path: SAT_UE
-
name: SAT_BYPASS
path: TCPIP4v4
-
name: GS_FACILITY
path: GS_FACILITY
-
name: SAT_MAP_GW
path: SAT_MAP_GW
对应satemu.conf的meta_files >> node_type需要读取的文件,也对应web的“3.1.6.3节点”章节。
nType.conf文件格式为yaml,一个示例内容及注释:
-
name: LEO_ENTITY # 设计节点模型名称为LEO_ENTITY,对应3.2.4.1章节
paths: # 节点可由多个数据流组成
-
value: SAT_FACILITY # 用于前后左右星间链路
-
value: SAT_FACILITY
-
value: SAT_FACILITY
-
value: SAT_FACILITY
-
value: SAT_FACILITY # 用于信关站馈电链路
-
value: SAT_FACILITY - SAT_BYPASS - AN_CORE # 旁路、传输层和基站信令,N2端口
-
value: SAT_FACILITY - AN_CORE # 基站无线接入和数据传输端口
-
value: SAT_FACILITY - AN_CORE # 基站无线广播端口
-
value: SAT_BYPASS - AN_CORE # 基站N3端口
-
-
name: LEO_LOADER # 星上设备映射节点模型,可以“load”实物设备流量到卫星上
paths:
-
value: SAT_FACILITY # 前后左右星间链路和馈电链路
-
value: SAT_FACILITY
-
value: SAT_FACILITY
-
value: SAT_FACILITY
-
value: SAT_FACILITY
-
value: SAT_FACILITY - SAT_MAP_GW # 旁路转到映射网关
-
-
name: GS_ENTITY # 信关站节点模型对应3.2.3.2章节
paths:
- value: GS_FACILITY
-
name: UE_ENTITY # 终端节点模型对应3.2.4.3章节
paths:
-
value: UE_FACILITY - UE_CORE # 无线接入和数据传输数据流
-
value: UE_FACILITY - UE_CORE # 无线广播处理数据流
-
参考本文档web使用部分的介绍,略。
主要保存静态位置坐标,每个坐标设定一个名称,节点配置运行参数时一般使用POS_COMBINE=static:${名称}来绑定坐标,坐标以ECEF参考系标定(历史遗留,有需求即优化)。
文件格式为自定义文本,用空格隔开第1列为名称,第2、3、4列分别为ECEF坐标系的X、Y、Z值,单位为千米。
示例:
gs1 4015.3186 -838.170376 -4884.190737
ue0 4082.0983 -3058.0260 3816.7270
ue1 3963.8934 -2969.4751 4005.2817
ue2 3982.7978 -2946.1355 4003.7737
ue3 4003.2231 -2924.5266 3999.2734
ue4 4024.8472 -2904.9893 3991.8518
ue5 4047.3290 -2887.8316 3981.6258
ue6 4070.3140 -2873.3241 3968.7568
ue7 4093.4395 -2861.6955 3953.4474
ue8 4116.3408 -2853.1292 3935.9393
ue9 4138.6567 -2847.7601 3916.5083
ue10 4160.0351 -2845.6731 3895.4608
ue11 4180.1389 -2846.9008 3873.1287
自动变量是每取一次值就会变化的变量,主要用于在场景需要配置很多节点的情况下,只要少量“配置脚本”就能将每个节点配置好,例如给每个节点的名称添加不同的序号后缀、给每个节点配置不同的IP地址。
格式为:${变量类型}:${自定义变量名}=${变量格式}
下面是每种自动变量的特性。
- 自动变量:int或int64或uint64
说明:整数
格式:${start}:${step}
作用:从start开始,每取一次值递增一次,递增的值等于step
- 自动变量:ip4或ipv4
说明:IP地址
格式:${startIP}:${step}
作用:从startIP开始,每取一次值IP地址递增一次,递增的值等于step。其中startIP必须要是IP地址字符串的格式。
- 自动变量:seq
说明:跳变整数(int不够全面)
格式:${num1|seq1}[,[!]${num2|seq2}]
格式说明:num是一个数,seq是用'-'(减号)连接两个数形成的连续序列,!是不选择之后的数或序列
格式示例:seq:id=1-100,120,201-300,!150-160,!220,!280
作用:可以达到从一个连续的大序列中,剔除几个数或几段序列的效果。比int更丰富
- 自动变量:formula
说明:能使用数字进行算数运算,支持:'+'(加)、'-'(减)、*(乘)、/(除)、%(取余)、'()'(括号)
格式:${hold}:${算式}
格式说明:使用数字进行算数运算,得出新的数字,且可以引用int型和seq型的变量进行计算,但需要注意这些变量的改变,其中hold可以让formula类型算出的结果保持hold次不变
格式示例:
① formula:idHold = 3:id
② formula:freq4 = 12211 + ((orbH+1) % 12) * 18 + iHold % 18
③ formula:num = 3: ((orbH+1) % 12) * 18
对应3.2.3.6、3.2.4.8等章节,示例内容及注释:
-
type: GS_ENTITY # 信关站配置
items:
-
name: gs_1
paths:
-
id: 0
options:
-
GS_FACILITY.POS_COMBINE=static:gs1 # 绑定gs1静态位置
-
GS_FACILITY.NIC_BIND=dpdk:eth0 # 使用dpdk的eth0网卡
-
GS_FACILITY.GS_POLICY=172.17.50.2 # 策略:目的地址172.17.50.2的流量放行
-
-
-
-
type: UE_ENTITY # 终端配置
items:
-
name: ue${id} # 使用id这个自动变量进行拼接
number: 9 # 批量配置9个
auto-var: # 自动变量
-
int:id=1:1 # 整型,从1开始步长为1递增
-
int:locId =1:1
paths:
-
id: 0 # 配置第0个path
options:
- UE_CORE.USE_ENTRY=UU
#- UE_CORE.DN_RULE=172.17.0.3/32 # 数据面业务:生成TUN网卡真实通信
-
UE_CORE.DNN=net # 终端注册和会话建立使用的DNN为net
-
UE_FACILITY.PORT_TYPE=ACC
-
UE_FACILITY.AT_ANGLE=pi
-
UE_FACILITY.AT_RADIUS=2250
-
UE_FACILITY.POS_COMBINE=static:ue${locId} # 绑定静态位置
-
id: 1
options:
-
UE_CORE.USE_ENTRY=BC
-
UE_FACILITY.PORT_TYPE=BC
-
UE_FACILITY.AT_FREQ=19999
-
UE_FACILITY.AT_ANGLE=pi
-
UE_FACILITY.AT_RADIUS=2250
-
-
-
name: ueTun # 另一种终端配置
number: 1
auto-var:
paths:
-
id: 0
options:
-
UE_CORE.USE_ENTRY=UU
-
UE_CORE.DN_RULE=172.17.0.3/32 # 该终端数据面配置了到DN的规则
-
UE_CORE.DNN=net # 会在仿真器生成TUN网卡,与DN通信
-
UE_FACILITY.PORT_TYPE=ACC
-
UE_FACILITY.AT_ANGLE=pi
-
UE_FACILITY.AT_RADIUS=2250
-
UE_FACILITY.POS_COMBINE=static:ue101
-
-
id: 1
options:
-
UE_CORE.USE_ENTRY=BC
-
UE_FACILITY.PORT_TYPE=BC
-
UE_FACILITY.AT_FREQ=19999
-
UE_FACILITY.AT_ANGLE=pi
-
UE_FACILITY.AT_RADIUS=2250
-
-
-
-
type: LEO_ENTITY # 卫星配置
items:
-
name: leo_${id}
number: 216 # 数量216,对应TLE的条数
auto-var:
-
int:id = 1:1
-
int:i2 = 0:1
-
int:i3 = 0:1
-
formula:freq6 = 800000 + i2 # 自动变量类型为formula,算数运算
-
ip4:satIP = 172.12.18.1:1 # 自动变量类型为IP地址,步长为1递增
-
ip4:sessIP = 172.12.18.1:1
-
int:tle = 1:1
paths:
-
id: 0
options:
- SAT_FACILITY.PORT_TYPE=pre
-
id: 1
options:
- SAT_FACILITY.PORT_TYPE=left
-
id: 2
options:
- SAT_FACILITY.PORT_TYPE=next
-
id: 3
options:
- SAT_FACILITY.PORT_TYPE=right
-
id: 4
options:
- SAT_FACILITY.PORT_TYPE=gs
-
id: 5
options:
-
SAT_FACILITY.PORT_TYPE=BYPASS # 旁路
-
SAT_FACILITY.IPADDR=${satIP} # 卫星的IP地址
-
SAT_FACILITY.POS_COMBINE=tle:${tle}-081 # 位置绑定TLE
-
SAT_BYPASS.SESSION=sctp:${sessIP}:0:172.17.50.2:38412 # 传输层会话
-
-
id: 6
options:
-
SAT_FACILITY.PORT_TYPE=access
-
SAT_FACILITY.AT_FREQ=${freq6}
-
SAT_FACILITY.AT_ANGLE=110pi/180
-
SAT_FACILITY.AT_RADIUS=2250
-
-
id: 7
options:
-
SAT_FACILITY.PORT_TYPE=broadcast
-
SAT_FACILITY.AT_FREQ=19999
-
SAT_FACILITY.AT_ANGLE=110pi/180
-
SAT_FACILITY.AT_RADIUS=2250
-
-
id: 8
options:
- AN_CORE.USE_ENTRY=data # 基站的N3端口
-
-
- 创建一个1935颗卫星、1个信关站组网并选择其中10颗卫星执行PING核心网服务器的场景。
- 创建一个216颗卫星、1个信关站、10个随机位置终端接入的场景。
准备好仿真器的可执行程序、需要调用的动态库、场景配置文件、运行脚本,然后按照下面的格局组织文件。
tree . # 其中.可以是任何路径,如:/root/sceps
.
├── bin
│ ├── lib5gairsim.so # 5gas动态库(本次2个场景可忽略)
│ ├── libgodpe.so # dpdk动态库
│ └── satemu # 仿真器可执行程序
├── case1_ping # 目录存放第一个场景的配置文件
│ ├── dType.conf
│ ├── mType.conf
│ ├── nType.conf
│ ├── satemu.conf
│ ├── scenario.conf
│ ├── static_xyz.loc
│ └── tle1935orb43.loc
├── case2_access # 目录存放第二个场景的配置文件
│ ├── dType.conf
│ ├── leo216.loc
│ ├── mobile.loc
│ ├── mType.conf
│ ├── nType.conf
│ ├── satemu.conf
│ ├── scenario.conf
│ └── static_xyz.loc
├── conf -> case1_ping # 软链接(> ln –s case1_ping conf)(等于设置别名)
└── run.sh # 为了便于运行编写的脚本
上述文件树中的run.sh文件内容。编写完成后用chmod +x run.sh给文件添加运行权限。
pwd
/root/sceps
cat run.sh
#!/bin/bash
workingDir=pwd
export LD_LIBRARY_PATH="/opt/net/firmware/active/plt/lib:/opt/net/firmware/active/cmn/lib:/opt/net/firmware/active/dpdkproc/lib:/opt/net/firmware/active/sceps/lib"
export SCEPS_DPDK_LCOREID=1 # dpdk相关
export SCEPS_ROUTE_DEBUG=0 # 路由算法debug(这里没开)
export LOG_LEVEL_5GAS=INFO # 5gas的日志等级
export SCEPS_MOD_ISOLATE_NODE=1 # 模块协程优化
export SCEPS_DISABLE_CONTENTION_RA=0 # 关闭基于竞争的随机接入(这里不关)
export SCEPS_UE_FEWER_HO=1 # 终端切换算法优化
export SCEPS_UE_CONGESTION_CTRL_RATE=150 #控制终端上线并发量(最多150个每秒)
export SCEPS_SAN_RR_NUM=5000 # 卫星基站无线资源数量(最大可接入终端数)
export SCEPS_UE_STATS_SERVICE=0 # 终端某些指标的统计写入文件(这里没开)
export SCEPS_MOD_STATS_SERVICE=0 # 模组的包处理统计写入文件(这里没开)
export SCEPS_SAN_DISABLE_PAGING=1 # 卫星基站关闭寻呼
export SCEPS_NET_DELAY_FACTOR=-1 # 卫星网络基于距离的时延模拟(-1为关闭)
export SCEPS_ROUTER_EXPORT_DISABLE=1 # 关闭路由导出(通过http导出)
export SCEPS_5GAS_LOAD="$workingDir/bin/lib5gairsim.so"
export SCEPS_DPDK_LOAD="$workingDir/bin/libgodpe.so" # 同上
export SCEPS_ENABLE_TBS_EFFECT=0 # 启动5GAS的TBS生效(这里没开)
./bin/satemu -c file -f conf/satemu.conf -runid 4396 -t 15m
log_level: info # 日志等级:error、info、debug
time_anchor: 2024-08-16T10:00:00+00:00 # 场景的起始时刻
time_scale: 1 # 场景的时间流速,一般不改
meta_files: # 模型文件,对应web的功能模板:
module_type: ./conf/mType.conf # 从此文件读取场景要用到模块
device_type: ./conf/dType.conf # 从此文件读取由模块设计组成的设备
node_type: ./conf/nType.conf # 从此文件读取由设备设计组成的节点(模型)
scene_file: ./conf/scenario.conf # 节点绑定位置、每个节点的运行参数
tle:
file: ./conf/tle1935orb43.loc # 从此文件读取TLE参数(卫星位置模板)
time_start: 2024-08-16T10:00:00+00:00 # 位置外推起始时刻(一般与上面一样)
time_granularity: 1s # 位置外推粒度
time_duration: 1h30m # 位置外推总时长
static_file: ./conf/static_xyz.loc # 从此文件读取静态位置模板(终端和信关站)
redis:
addr: 127.0.0.1:6379 # redis
passwd: 123456
mysql:
addr: 127.0.0.1:3306 # mysql
user: root
passwd: 123456
-
name: GS_FACILITY # 信关站设施
-
name: SAT_FACILITY # 卫星设施
-
name: ICMP4 # 卫星旁路处理ICMP协议
-
name: SAT_FACILITY # 设备简单重命名,无需模组组合
path: SAT_FACILITY
-
name: SAT_BYPASS
path: ICMP4
-
name: GS_FACILITY
path: GS_FACILITY
-
name: LEO_ENTITY # 卫星实体模型
paths:
-
value: SAT_FACILITY # 前后左右馈电
-
value: SAT_FACILITY
-
value: SAT_FACILITY
-
value: SAT_FACILITY
-
value: SAT_FACILITY
-
value: SAT_FACILITY - SAT_BYPASS # 旁路转到(ICMP4)
-
-
name: GS_ENTITY # 信关站实体模型
paths:
- value: GS_FACILITY
只要一个信关站的坐标。
gs1 -2850.9601 4670.6224 3265.8935
-
type: GS_ENTITY
items:
-
name: gs_1
paths:
-
id: 0
options:
-
GS_FACILITY.POS_COMBINE=static:gs1
-
GS_FACILITY.NIC_BIND=dpdk:eth0
-
-
-
-
type: LEO_ENTITY
items:
-
name: leo${id}
number: 1925 # 数量1925个(选去10个做PING业务)
auto-var: # 自动变量
-
seq:i = 1-1935,!10,!20,!30,!1000-1006 # 跳变序列,1到1935用'!'去掉10个数
-
formula:id = 3:I # 算数运算,3:表示值取3次才会变
-
formula:freq6 = 800000 + id
-
ip4:satIP = 172.16.18.1:1 # IP地址从172.16.18.1开始
-
formula:tle = 20000 + ((id+44)/45)*100 + ((id+44)%45) + 1
paths:
-
id: 0
options:
- SAT_FACILITY.PORT_TYPE=pre
-
id: 1
options:
- SAT_FACILITY.PORT_TYPE=left
-
id: 2
options:
- SAT_FACILITY.PORT_TYPE=next
-
id: 3
options:
- SAT_FACILITY.PORT_TYPE=right
-
id: 4
options:
- SAT_FACILITY.PORT_TYPE=gs
-
id: 5
options:
-
SAT_FACILITY.PORT_TYPE=BYPASS
-
SAT_FACILITY.IPADDR=${satIP} # 绑定IP
-
SAT_FACILITY.POS_COMBINE=tle:${tle}-229 # 位置绑定tle
-
-
-
name: leo${id} # 第二种卫星不同配置
number: 10 # 数量10个
auto-var:
-
seq:i = 10,20,30,1000-1006 # 跳变序列:上面去掉的10个数
-
formula:id = 3:i
-
formula:freq6 = 800000 + id
-
ip4:satIP = 172.16.17.0:1 # IP地址从172.16.17.1开始
-
ip4:sessIP = 172.16.17.0:1
-
formula:tle = 20000 + ((id+44)/45)*100 + ((id+44)%45) + 1
paths:
-
id: 0
options:
- SAT_FACILITY.PORT_TYPE=pre
-
id: 1
options:
- SAT_FACILITY.PORT_TYPE=left
-
id: 2
options:
- SAT_FACILITY.PORT_TYPE=next
-
id: 3
options:
- SAT_FACILITY.PORT_TYPE=right
-
id: 4
options:
- SAT_FACILITY.PORT_TYPE=gs
-
id: 5
options:
-
SAT_FACILITY.PORT_TYPE=BYPASS
-
SAT_FACILITY.IPADDR=${satIP}
-
SAT_FACILITY.POS_COMBINE=tle:${tle}-229
-
SAT_BYPASS.SESSION=${sessIP}:172.17.50.2:50 # 每5秒PING 172.17.50.2
-
-
-
cd /root/sceps/
./run.sh
unlink conf
ln –s case2_access conf
参考4.3.1章节。
参考4.3.2章节。
参考4.3.3章节。
参考4.3.4章节。
参考4.3.6章节。
参考4.3.7章节。
cd /root/sceps/
./run.sh
保持当前运行窗口,使用ssh连接工具另起一个连接窗口连接到仿真服务器。
- 查看服务器的网卡和IP
ip a # 命令ip addr的缩写
其中c1Tun是终端数据面生成的虚拟网卡,网卡下配置了一个IP地址20.0.12.245,实际上是核心网分配给“ueTun”这个终端的IP(通过分析日志)。
- 查看服务器的路由
ip r # 命令ip route的缩写
其中“172.17.0.3 dev c1Tun src 20.0.12.245”这条路由与虚拟网卡一样是仿真器自动配置的,意味着目的地址是172.17.0.3的业务,自动选择20.0.12.245这个IP作为源地址,并且通过c1Tun网卡发送。
- 与目的服务器通信
分别执行ping目的服务器、使用scp命令向目的服务器发送文件、使用scp命令从目的服务器下载文件三种传输操作。
其中ping是icmp网络层协议,scp是基于tcp传输层协议,实际上基于IPv4的任何协议都可以。
ping 172.17.0.3
scp randomfile.bin [email protected]:~/
scp [email protected]:~/randomfile.bin .
略
略
说明:提供查看仿真可视化界面
路径:仿真场景 --> 仿真列表
在运行仿真场景时,点击“可视化”按钮即可跳转到可视化界面。
需要在/opt/net/supervisor/satsim_server.conf删除或配置环境变量:
SCEPS_ROUTER_EXPORT_DISABLE=0
图7.2-1 可视化
参考3.1.6.1章节可查看所有模块信息。
其中目前版本主要使用的为(实际就是前面案例章节中出现过的几个,有的模块是历史遗留已无法正常运行):
GS_FACILITY
ICMP4
SAT_AN
SAT_FACILITY
SAT_MAP_GW
SAT_UE
TCPIP4v4
UE_FACILITY
作用:组成信关站。数据网关功能:作为虚拟卫星网络与实物地面网络之间的网关;与卫星建立虚拟的馈电链路;控制实际网卡IO与实物设备收发数据包;
交互:独立就能组成信关站,不需要与其它模块组合。
需求:有创建信关站的需求就得用此模块。
节点的地址(卫星节点应当只部署一个路由器)
配置的值为一个IP地址。目前一般不用配置,因为仿真器会将信关站的地址默认设置为“1.1.1.1”,能正常运行。
卫星网络中路由器使用的路由算法。(整个卫星网络使用的路由算法)
配置的值为字符串,不配置、空值、“centralized”、“central”时使用dijkstra最短路径算法的中心路由算法。配置值“plugin”会读取/opt/net/sceps/cplugin/libmodRouterImpl.so这个动态库文件,调用其中的代码函数。用户可以根据头文件自行编码实现一个路由算法,然后编译成动态库再放到对应路径,从而实现用户自定义路由算法的功能。当前的头文件定义为:
// 作用: 执行整个路由算法的初始化
// 1. 参数 defaultGw: 网络的默认网关地址
// 返回值: 0指示成功, 其它指示失败
int init_route(uint32_t defaultGw);
// 作用: 往路由算法中添加一个节点
// 1. 参数 verIdx: 当前需要添加或更新的路由节点的地址
// 2. 参数 edgeNum: 当前路由节点拥有的边数量, 边与别的路由节点连接并能收发数据包
// 返回值: >=0 指示节点添加/更新成功, 返回其索引值, <0 指示添加/更新失败
int route_add_vertex(uint32_t verAddr, int edgeNum);
// 作用: 节点添加或更新一条边
// 1. 参数 verIdx: 当前需要操作的节点的索引
// 2. 参数 edgeIdx: 当前需要操作的边的索引
// 3. 参数 peerAddr: 更新的边的对端新地址
// 4. 参数 cost: 添加/更新的边的权重, 值越大看作该边表示的路径越长
// 返回值: 被操作的边的索引
int route_update_edge(int verIdx, int edgeIdx, uint32_t peerAddr, int cost);
// 作用: 获取边对端的地址
// 1. 参数 verIdx: 当前需要操作的节点的索引
// 2. 参数 edgeIdx: 当前需要操作的边的索引
// 返回值: 边对端的地址
uint32_t get_peer_addr(int verIdx, edgeIdx);
// 作用: 判断是否是一个可用包, 并返回包的类型, 定义的类型有:
// #define ROUTE_PK_UNKNOWN 0 //错误包或未知类型的包, 一般会丢弃
// #define ROUTE_PK_CONTROL 1 //路由控制包, 路由算法内部信令消息
// #define ROUTE_PK_TOUS 2 //发给路由节点自己的包
// #define ROUTE_PK_FORWARD 3 //不是上述任何一种, 尝试转发出去
// 1. 参数 verIdx: 当前需要操作的节点的索引
// 2. 参数 pkPtr: 包的首地址
// 3. 参数 pkLen: 包的长度
// 返回值: 包类型
int resolve_pk(int verIdx, uint8_t pkPtr, int pkLen*);
// 作用: 处理路由控制包
// 1. 参数 verIdx: 当前需要操作的节点的索引
// 2. 参数 edgeIdx: 收到此包的边的索引
// 3. 参数 pkPtr: 包的首地址
// 4. 参数 pkLen: 包的长度
// 5. 参数 cost: 边的权重, 值越大看作改变表示的路径越长
// 返回值: 如果要往当前边发送返回消息, 则返回大于零的值作为包长, 而参数pkPtr存储发送的内容
int handle_control(int verIdx, int edgeIdx, uint8_t pkPtr, int pkLen, int cost*);
// 作用: 给节点索引和定目的地址, 返回节点到该地址需要走的边的索引
// 1. 参数 verIdx: 当前需要操作的节点的索引
// 2. 参数 dstAddr: 给定目的地址
// 返回值: 节点到目的地址需要走的边的索引
int get_next_port(int verIdx, uint32_t dstAddr);
// 作用: 立即更新指定节点的路由策略
// 1. 参数 verIdx: 当前需要操作的节点的索引
// 返回值: 无
void update_policy(int verIdx);
// 作用: 获取指定节点需要定时发送的广播消息
// 1. 参数 verIdx: 当前需要操作的节点的索引
// 2. 参数 buf: 用于存放广播消息的包的首地址
// 返回值: 包长
int get_broadcast(int verIdx, uint8_t buf*);
// 作用: 获取指定节点定时发送广播消息的周期, 单位100ms
// 1. 参数 verIdx: 当前需要操作的节点的索引
// 返回值: n百毫秒
int get_broadcast_period(int verIdx);
// 作用: 打印整个路由拓扑, 或者别的自定义打印
// 使用环境变量SCEPS_ROUTE_DEBUG=1启用, 每10秒调用一次此函数
void print_route****();
卫星网络是否自动组网。
配置的值可以是任何值,只要这个配置选项存在则会将卫星网络自动组网的标志位设置为真。这个配置选项的作用不明显,一般使用AT_FREQ配置选项来判断是否自动组网。
所谓自动组网,就是仿真器根据卫星的轨道(TLE)特性,自动判断卫星之间的前后左右关系和链路连接关系,然后卫星之间互相连接组成连通的卫星网络。区别于手动组网,手动组网要手动配置每一颗卫星前后左右连接什么卫星,较麻烦。
根据轨道特性判断前后左右关系的策略算法:说来话长,略。
节点绑定位置参数。
信关站一般是绑定静态坐标:POS_COMBINE=static:${坐标名}
配置设备频率。(与卫星连接的无线设备的频率)
这个配置选项一般不用。特性是,不配置或配置值为0时,将卫星网络自动组网的标志位设置为真。
设置使用的网卡模块[kernel|dpdk](内核网卡或dpdk网卡),e.g. kernel:eth1。
配置的值为${[kernel|dpdk]}:${网卡名},kernel网卡名可使用操作系统命令查看(如:ip addr或ifconfig),dpdk网卡名需要通过网管查看。
kernel网卡与dpdk网卡的主要区别是性能,使用dpdk网卡时网络的时延是2ms左右,使用kernel网卡时时延达到100ms以上(暂时没有优化需求)。
但部署dpdk需要物理网卡的支持,且部署dpdk较为复杂。所以在虚拟机部署或者对性能要求不高的时候可以不用dpdk。
从原理上kernel网卡是操作系统管理的网卡,仿真器使用操作系统提供的raw socket进行数据包读写操作,为了减少干扰包,使用的kernel网卡一般不配置任何IP地址,这样就不会有任何不相关的包主动发往这张网卡;dpdk网卡是dpdk用户进程(区别于内核)管理的网卡, dpdk是一种网络加速技术,拥有独立的守护进程,仿真器使用dpdk提供的api接口进行数据包读写操作。被dpdk接管的网卡内核(命令行)是看不到的。
网卡收到IPv4数据包时,目的地址与某策略匹配才会放行,否则丢弃。
配置的值是一个IP地址,或一个地址范围:${起始IP}:${数量}。
对于卫星的IP地址和星上设备映射的地址,仿真器会自动配置策略,将数据包放行,但在某些应用场景下,需要手动放行。
一个应用场景为:星上UPF的场景。使用星上设备映射功能将一个UPF映射到某个卫星上时,系统外的核心网网元SMF需要与该UPF通信,当SMF向UPF发送请求消息,因为自动配置了星上UPF的策略,请求消息的目的地址是UPF能够通过没有问题,但是当UPF向SMF发送回复消息,因为是星上设备映射,这个消息从星上的网卡读取进来,目的地址是没有配置过的SMF,如果没有配置过SMF的策略,消息将会被丢弃。
这个配置对于kernel网卡和dpdk网卡都有作用。
启用信关站抓包。无此配置选项、空值、0值时信关站不启用抓包。其它任何值都会启用。
启用时任何通过信关站进出卫星网络的数据包都会被抓取。
抓包保存文件为:/opt/net/sceps/pcap/gateway_scene${场景id}_${运行id}.pcap
配置场景是否启用5GAS。无此配置选项、空值、0值时不启用。值大于0时作为5GAS的MAC调度周期,单位为ms(毫秒),调度周期主要根据性能进行调整。
5GAS是仿真平台对基站与终端之间无线通信底层协议的仿真的模块,主要为仿真MAC层,通过资源、距离、信道等参数和不同调度算法来计算无线通信的TBS(Transport Block Size,传输块大小)。
在5GAS启用的同时,使用环境变量SCEPS_ENABLE_TBS_EFFECT=1,可以让仿真器在基站和终端之间的无线传输过程中使用这个由MAC调度算法产生的TBS值,这会严重影响仿真过程中基站和终端的带宽。
作用:收发ICMP协议消息,即ping命令使用的协议,实现的协议是规范的,能与任何实物设备交互。协议数据包层级为[ipv4:icmp:payload]
交互:只与更低层的模块交互,即只能接收上行的数据包,和发送下行的数据包,而不能从更高层的模块接收下行数据包和发送上行数据包。
需求:一般在卫星装载简单的PING业务时使用。最主要的使用方式是作为卫星路由旁路。
创建ICMP会话[自己IP(必选):对端IP:周期100ms] e.g. 192.168.16.87:192.168.16.137:50
配置的值为用':'(英文冒号)隔开的字符串,第一个字段为IP地址,为了数据包正确路由,值应当为与SAT_FACILITY.IPADDR相同的自身地址;第二个字段为IP地址,设置为需要PING的对端的地址,如地面核心网的地址;第三个字段为正整数,用于更改自动PING的周期,单位为100ms(毫秒),默认值为10。
如果只配置了第一个字段自身的IP,则不会主动发PING请求,但是能接收PING请求并回复。如果配置了第二个字段对端IP,会按照一定周期向对端主动发PING请求,并处理回复,默认周期为1秒,也能接收PING请求并回复。如果配置了第三个字段周期则按周期发送PING请求,周期的单位为100ms。
作用:拥有一个通信基站的逻辑功能,提供广播、终端接入、终端移动性管理、终端数据面传输等功能;处理NGAP、RRC等信令协议消息。
交互:① 与TCPIP4v4模块交互,从该模块接收经网络层和传输层处理的应用层消息,以及向该模块发送应用层消息,然后由该模块将消息封装好; ② 与SAT_FACILITY模块交互,收发广播和与终端之间的无线消息。
需求:基站信令内核,有创建基站的需求就得用此模块。
设置卫星基站的无线资源数量。
配置的值为一个正整数,如果不配置或配置0值,默认设置成1000,也可通过环境变量SCEPS_SAN_RR_NUM来设置。优先级为配置选项 > 环境变量 > 默认1000。
准确功能是控制卫星能接入的最大终端数量,当卫星接入的终端达到设置的数量后,其它卫星终端将无法再接入该卫星基站(但是切换能切)。
绑定当前数据流所属的基站接口[N2|UU|BC|UP]。
配置的值为特定名称字符串,大小写均可,一共四种基站接口(数据流类型),值分别为:
① N2:N2连接AMF;
② UU:与终端之间无线信令和数据传输;
③ BC或BROADCAST:发送基站无线广播,和部分随机接入;
④ UP或N3或DATA:用户面/N3连接UPF/数据面;
区分数据流名称主要是基站有多个业务接口,需要区分收到的消息是从哪个接口接收的,然后使用对应的处理逻辑去处理消息,以及要向某接口发送消息的时候将消息正确传到该接口。
额外特性:数据流UP可以配合节点设计配置多条,使基站能够同时连接多个UPF,例如在星上UPF的场景下,接入该基站的终端一部分使用地面UPF锚点,一部分使用星上UPF锚点。
基站抓包。
配置的值为字符串,不配置、空值、零值该基站不会抓包,其它值都会启用抓包。
配置了此选项了的基站节点抓包,能够抓到基站N2和UU接口的数据包,N2接口是NGAP协议,UU接口是RRC协议。
抓包保存文件为/opt/net/sceps/pcap/satan_scene${场景id}_${运行id}.pcap
作用:卫星设施,用于装载各种星上设备。① 与周围节点建立星间链路或馈电链路;② 拥有数据包路由功能;③ 将目的地址是自身的数据包传给旁路;④ 为配合基站,拥有无线(设备)收发功能;
交互:作为最底层,与SAT_AN(基站内核)、ICMP4、SAT_MAP_GW等模块交互。
需求:创建卫星节点必须基于此模块。
绑定数据流端口类型[LAN[pre|next|left|right|gs]|bypass|bc|acc],LAN=普通路由转发,BYPASS=转到旁路。
配置的值为特定名称字符串,大小写均可,一共9种数据流类型,值分别为:
① PRE:前向星间链路;
② NEXT:后向星间链路;
③ LEFT:左向星间链路;
④ RIGHT:右向星间链路;
⑤ GS:馈电链路连接信关站;
⑥ BYPASS:路由旁路;
⑦ BC或BROADCAST:无线广播和接入;
⑧ ACC或ACCESS:无线信令和业务传输;
⑨ LOADER:星上设备映射功能;
其中上述PRE、NEXT、LEFT、RIGHT、GS都属于LAN类型的数据流,分别标识卫星的前、后、左、右星间链路和馈电链路5种链路的数据流。
LAN即局域网类型,整个卫星网络可以看作一个“局域网”,卫星节点和信关站节点都是局域网中参与路由转发的节点,而星间链路和馈电链路是路由节点之间的数据传输通路。从图论角度描述,卫星和信关站是图中的“节点”,而星间链路和馈电链路是图中的“边”。收集到整个卫星网络的节点和边信息构建出网络拓扑图,即可使用最短路径算法等计算路由。
BYPASS是路由旁路,具体特性是当卫星收到一个目的地址是自身的数据包时,应当去处理这个数据包而不是再路由转发出去,卫星通过这个数据流将数据包转到能正确处理数据包的模块。
BC是广播数据流,为了配合卫星基站(SAT_AN)模块的发送无线广播的功能,将广播消息正确传到参数匹配的对等节点的设备上。配置了BC数据流时基站的USE_ENTRY=BC可以省略。广播数据流需要配合三个“AT”参数实现完整配置。
ACC是无线信令和数据传输数据流,为了配合卫星基站(SAT_AN)模块的无线信令和数据传输功能,将无线消息正确传到参数匹配的对等节点的设备上。配置了ACC数据流时基站的USE_ENTRY=UU可以省略。信令和数据传输数据流需要配合三个“AT”参数实现完整配置。
LOADER是为了支持卫星上既装载基站功能又进行星上设备映射时(是基站的同时又是MEC),增加的配置,因为BYPASS已经被基站的N2占用了所以使用LOADER将数据包通过SAT_MAP_GW转到映射的实物设备上。
节点的地址。
配置的值为一个IP地址。整个卫星网络是根据IP地址寻址的,这个配置的IP地址会作为节点的路由地址。因为每个卫星都默认携带路由功能(不带路由是伪命题),所以每个卫星都应该配置这个选项。
节点绑定位置参数名。
卫星一般绑定tle位置:POS_COMBINE=tle:${卫星编号}-${年内天数}。
其中“卫星编号”是TLE 2行参数第1行中第3~7字符组成的值,如下方示例TLE中的“43622”
“年内天数”是TLE 2行参数第1行中第21~23字符组成的值,如下仓示例TLE中的“283”
之所以要加年内天数后缀,是因为同一颗卫星会每隔一段时间更新一次TLE,更新之后的TLE的“卫星编号”字段是相同的,增加年内天数字段便于区分。
BEIDOU-3 M13
1 43622 U 18072 A 18283.00000000.00000000 00000-0 00000-0 0 9990
2 43622 55.0238 156.3850 0003195 302.7978 179.2407 01.86239813 000
无线设备频率。
AT_FREQ是Antenna Frequency的缩写。
配置的值是一个正整数。主要卫星基站的BC和ACC两个数据流使用。SAT_FACILITY在一个节点的数据流中一般是处于最“底层”的模块,当模块有下行发送数据时,SAT_FACILITY需要将数据通过“无线”传输到其它拥有匹配条件的节点的设备上,参数一共有三个,分别为“AT_FREQ、AT_ANGLE、AT_RADIUS”三个配置项的值,需要三个参数的匹配条件都满足才算设备匹配。类似于收音机需要调整频率才能正常收音。AT_FREQ表示“频率”条件,频率值相等则匹配。
无线设备信号辐射范围(圆锥角度)。
配置的值是一个弧度值,也支持简单算数表达式,算数表达式支持“pi”关键字,“pi”的值等于圆周率,例如“60pi/180”等价于角度制60°。
在AT_FREQ的介绍中,AT_ANGLE是三个参数匹配条件中的一个,表示“覆盖”条件,在空间上一个如果一个天线发射的信号是“向下”,覆盖的圆锥角度是60°,当接收设备在发射设备的“上方”,是无法接收到发射设备的信号的。对于卫星来说,天线发射信号的方向默认指向地心。
设备信号覆盖半径。
配置的值是一个浮点数,单位为千米。在AT_FREQ的介绍中,AT_RADIU是三个参数匹配条件中的一个,表示“距离”条件,当天线发射一定功率的信号,接收设备接收到的信号的功率是随着距离不断下降的,当接收功率下降到无法识别,则接收设备无法完整接收发射设备的消息。
设置带宽。
卫星路由器可以设置一定的转发带宽,当转发流量达到设定的带宽大小,超出的部分的数据包会被丢弃。
半波束角,波束数量根据配置自动判断。
配置的值为一个浮点数序列,为角度制。主要用于卫星的多波束功能,表示每个波束的“半波束角”,配置示例:
BEAM_HALF_ANGLE=15.31,15.31,15.31,15.31,15.31,15.31,15.31,15.31,15.31,15.31,15.31,15.31,15.31,15.31,15.31,15.31
表示卫星配置16个波束,每个波束的“半波束角”为15.31°,即每个波束的辐射范围圆锥角度是30.62°。
方位角,正北为0°,顺时针为正,即偏离Y轴的角。
配置的值为一个浮点数序列,为角度制,且序列的数量应当等于BEAM_HALF_ANGLE配置的数量。主要用于配合BEAM_HALF_ANGLE和BEAM_OFF_AXIS配置卫星的多波束功能,与BEAM_OFF_AXIS共同决定每个波束的指向。几何意义为波束的指向所成的直线,投影到地面上,与指向正北方向的直线所形成的夹角。配置示例:
BEAM_AZIMUTH=0,0,60,120,180,240,300,0,40,80,120,160,200,240,280,320
实际上轨迹可以形成2个同心圆。
离轴角,朝向地心为Z轴,朝东为X轴,朝北为Y轴,离轴角是波束指向偏离Z轴的角。
配置的值为一个浮点数序列,为角度值且序列的数量应当等于BEAM_HALF_ANGLE配置的数量。主要用于配合BEAM_HALF_ANGLE和BEAM_OFF_AXIS配置卫星的多波束功能,与BEAM_AZIMUTH共同决定每个波束的指向。几何意义为波束的指向与卫星到地心连成的直线形成的夹角。配置示例:
BEAM_OFF_AXIS=0, 27,27,27,27,27,27, 46,46,46,46,46,46,46,46,46
作用:作为星上设备映射功能的“网关”,通过网卡IO,将实物设备的流量的锚点放在一颗虚拟的卫星上。
交互:一般作为SAT_FACILITY的BYPASS或LOADER数据流,与SAT_FACILITY交互。
需求:有星上设备映射需求,用此模块。
配置星上设备的IP,如果有多个IP,可以配置多次该配置项,例:192.168.1.10。
星上设备映射功能,即将一个实物设备——上面可能运行着某种服务如核心网UPF网元或者HTTP服务器等,流量映射到一颗卫星上,相当于这颗卫星拥有了实物设备的功能。
在部署上实物设备应当和星上设备绑定的网卡有物理连接。然后使用本配置选项填写实物设备的IP地址。可以将多个实物设备映射到同一颗卫星上,
实现星上设备绑定的网卡,只支持dpdk,e.g. dpdk:eth0
配置的值与GS_FACILITY.NIC_BIND一样,但是只支持dpdk类型。因为星上设备功能是与实物设备对接,所以需要进行网卡IO,星上设备可以使用dpdk管理的与信关站相同或不同名称的网卡,具体绑定哪一个与实际部署有关(物理连接)。从性能表现以及实现原理上星上设备与信关站使用不同的dpdk网卡更好。
作用:卫星终端模块,处理终端信令消息流程和数据面。
交互:交互,与底层UE_FACILITY交互。
需求:创建终端节点需要使用此模块。
绑定当前数据流所属的终端接口[UU|BC]。
配置的值为特定名称字符串,大小写均可,一共二种接口(数据流类型),值分别为:
① UU:与基站之间无线信令和数据传输;
② BROADCASE或BC:接收基站的广播消息;
使用的DNN。
配置的值为字符串,包括空值,不配置的默认值为“net”。
DNN是Data Network Name的简写,与核心网有关,终端向核心网请求建立会话时会携带DNN,可用于选择为终端服务的核心网网元,主要为UPF网元。UPF是数据面锚点。仿真平台常用的场景是部署星上UPF的情况下,在SMF上配置不同的DNN选择不同的UPF,即可实现终端的数据面锚点是在地面UPF还是星上UPF,一般来说星上UPF的端到端链路更短速度更快。
使用的切片值NSSAI e.g. 01-010101
配置的值为特定格式的字符串。会改变终端在上线和会话建立时携带给核心网的切片值,这可能会改变核心网对该终端的服务。
对应切片系统的productOrderId。
需要配合切片系统使用,会改变卫星对该流量的带宽限制。
设置节点自动执行PING业务${dst}[:${pkLen}:${period*100ms}], 与DN_RULE、UE_RULE、IPERF冲突
配置的值为用':'(英文冒号)隔开的字符串,第一个字段为IP地址,第二和第三个字段为正整数。
第一个字段为终端需要自动PING的目的IP地址,可以是DN的一个服务器;第二个字段为PING的包长,单位字节,可以不配置,默认值为100字节;第三个字段为PING的周期,单位100ms,可以不配置,默认值为10(乘100ms=1秒)。
下面的几个配置项都是关于数据面使用相关的。
设置对DN的路由规则e.g. 192.168.0.0/24。
配置的值为一个IP地址,或一个IP段:${ip}/${netmask}。
作用是基于所属的终端节点,自动配置到DN的路由规则。具体可见4.4.5.10章节。
设置UE的代理规则,若某流量包的源地址与本规则匹配,会转换成UE的地址去访问DN eg. 10.10.10.10或者tcp:10.10.10.10:8810。
配置的值为一个${sIP}地址或用':'(英文冒号)隔开的字符串:${proto}:${sIP}:${port},其中的协议名只要是iptables命令支持的都行,主要为“tcp、udp”。
实际上此配置选项会在Linux系统中调用iptables命令来设置SNAT规则,具体命令为:
iptables -t nat -A POSTROUTING -s ${sIP} -j SNAT --to ${ueIP}
或
iptables -t nat -A POSTROUTING -s ${sIP} -p ${proto} --sport ${port} -j SNAT --to ${ueIP}
上述两种命令对应两种不同的配置格式,分别是无条件地址转换和基于地址、协议以及端口的地址转换,命令中的${ueIP}是核心网给终端分配的IP。
SNAT的作用是操作系统将要转发的数据包,如果源地址与SNAT规则匹配,则会将数据包的源地址替换为规则设定的地址。在仿真中一般是将某些流量的源地址替换成终端的地址,使得某些外部应用的流量可以“冒充”终端的流量。
一个需要注意的点是要使用iptables进行地址替换需要启用内核的IP转发功能:
net.ipv4.ip_forward = 1
iptables和SNAT可以自己去学,此配置项用于实现某些特殊数据面需求,具体看用户的理解和发挥。
设置简单目的地址转换规则。
配置的值为:${sIP}:${dIP}。sIP和dIP都是IP地址。
实际上此配置选项会在Linux系统中调用iptables命令来设置DNAT规则,具体命令为:
iptables -t nat -A PREROUTING -d ${dIP} -j DNAT --to ${dIP}
DNAT的作用是操作系统在接收数据包时,如果目的地址与DNAT规则匹配,则会将数据包的目的地址替换为规则设定的地址。
iptables和DNAT可以自己去学,此配置项用于实现某些特殊需求,具体看用户的理解和发挥。
作用:处理网络层和传输层协议,维护传输层连接会话。
交互:目前主要作为SAT_AN(基站内核)的底层,维护N2的SCTP连接会话和N3的GTP会话。
需求:创建基站需要使用此模块。
创建(传输层)会话,e.g. sctp:192.168.1.2:0:192.168.1.3:38412
配置的值为':'(英文冒号)隔开的字符串:
① 第一个字段为协议类型字符串,支持的协议类型有sctp、tcp、udp、gtp,大小写均可;
② 第二个字段为自身IP,为了数据包正确路由,值应当与SAT_FACILITY.IPADDR相同;
③ 第三个字段为协议使用的本端端口,可设置为0然后自动随机分配端口;
④ 第四个字段为协议需要连接的对端的IP地址;
⑤ 第五个字段为协议需要连接的对端的端口;
本模块使用的技术为TUN设备,可以“窃取”内核的传输层协议而不需要自行实现,其中只有gtp协议是自行实现的,这里贴图简单示意其原理:
标记本Path为默认的底层出口:一个节点可能使用到多条数据流(SCTP连接,UDP连接),也就是本模块会分支,需要一个默认的汇流,在卫星上一般是汇聚到路由上,然后数据被路由转发到正确节点。
当节点设计中有两个数据流本模块都接有更底层模块,下行的数据包需要传给正确的底层模块,使用本配置选项来标识汇聚的下行数据流。
目前的版本几乎不用这个配置选项,因为只在卫星上使用本模块进行传输层处理,而本模块只与卫星的旁路连接,其它数据流可以设置本模块为最"底层",这样只有一个数据流连接更底层模块,本模块会自动选择该数据流作为汇聚下行出口。
作用:用户设备设施,UE底层。为SAT_UE(终端内核)提供无线收发的能力。
交互:作为底层模块与SAT_UE交互。
需求:创建终端节点需要基于此模块。
绑定数据流端口类型[acc|bc]
配置的值为特定名称字符串,大小写均可,一共2种数据流类型,值分别为:
① ACC或ACCESS:终端用于与基站收发信令和数据的数据流;
② BC或BROADCAST:终端用于接收基站广播的数据流;
节点绑定位置参数名。
大多数情况下节点也是绑定静态坐标:POS_COMBINE=static:${坐标名}
研发用,略。
分别配置设备频率、设备信号辐射范围(圆锥角度)、设备信号覆盖半径。
见SAT_FACILITY模块的相同配置。
与卫星不同的是终端的天线默认指向非地心。
路径:自定义模块-->算法
说明:用户可以通过此页面,实现路由算法的替换。
对于仿真程序来说,启动必须依赖一个libmodRouterImpl.so的依赖文件(该文件实现了仿真程序的路由相关的接口),所以需要在该界面要启用libmodRouterImpl.so文件,如果该文件还依赖了其他文件,也需要一起启用。在路由的模块参数设置为DISTRIBUTION=plugin时,会使用libmodRouterImpl.so中实现的路由接口。
在此页面中,可以执行下载、删除、停/启用操作,执行方法:只需在列表的操作列中,点击对应的按钮即可。
上传算法文件:
点击页面左上角的“上传算法文件”按钮,出现上传文件的窗口,把单个文件按提示填入,点击上传按钮即可。上传完毕后,按需启用即可让算法文件生效。
参考第6.2.2章节信关站的配置选项DISTRIBUTION。
附带源码案例(dijkstra.cc文件开头给出编译命令,使用Linux系统下的GCC):
djikstra.cc文件顶部提示编译方法:
g++ -std=c++11 -I. -I.. -fPIC -c dijkstra.cc route_manager.cc
g++ -shared -o libmodRouterImpl.so route_manager.o dijkstra.o
[root@localhost cimpl]# tree ..
..
├── cimpl
│ ├── dijkstra.cc
│ ├── ip4.h
│ ├── route_manager.cc
│ └── route_manager.h
└── route_plugin.h
- 上传算法文件后,查看路径/opt/net/sceps/cplugin下是否上传成功
- 配置路由参数 :DISTRIBUTION=plugin
- 运行仿真器,可看到路由模块正常运行,终端正常上线,终端ping 业务正常
路由模块正常运行:
终端上线:
终端ping业务正常:
- 更改算法中的一部分内容(打印提示),重新上传
- 运行仿真器,对比日志打印
仿真正常运行:
更改前日志:
更改后日志:
通过以上步骤可以验证,路由替换后,仿真能正常运行,并且使用的替换后的路由模块
跑简单终端接入、切换和数据通信的场景,终端接入和切换没问题,但数据面通信PING不通:
按照经验首先检查DN是否处于在线状态:发现其配置改变了。所以对应的,配置中修改DN的配置以匹配DN真正的地址:
(发现现在DN配置的地址是172.17.50.5)
顺便检查一下DN的路由和网络连通性,以确定核心网到DN这一段的网络配置是正常的:
- 因为DN对接的是核心网的N6口,在本次部署中核心网N6的地址为172.17.50.3。检查路由:目的地址为UE的地址段的数据包下一跳转到172.17.50.3,正常;检查DN本机能和核心网N6互通(PING),正常。
继续,修改配置:
场景中修改终端对DN的规则,改为对应的172.17.50.5/32:
重新跑场景然后PING,依然不通,按照经验从DN抓包,检查PING的数据包是否发送到DN且DN正确回复:
DN收到了来自终端的数据包且回复了,回复是否正确发到核心网保持怀疑:
进一步从核心网抓包,检查核心网是否收到了DN的回复包并且正确将这些数据包进行封装GTP并发送给基站:
第一次抓包使用icmp过滤发现没有任何显示,意识到核心网的UPF是使用DPDK部署的,需要使用DPDK的抓包工具才能抓到:
/opt/net/firmware/active/dpdkproc/bin/dpdkdump out 1130.pcap
从核心网的抓包可以看到UPF收到了基站发送的GTP,解封装发送出去,收到回复,封装GTP且发送出去,整个流程已经闭环,保持怀疑的点是GTP是否正确发送给仿真平台(基站):
进一步检查怀疑的点,看抓包中发送给基站的GTP包其链路层地址是否正确:检查到不正确,也就是整个链路中从核心网回到仿真平台基站的这一段不通:
(UPF的DPDK在链路层不知道发给谁,填了0地址,是错误的)
按照经验是核心网DPDK不知道目的地址的下一跳路由,或者没有收到下一跳节点回复的ARP请求。没有收到ARP说明大概率是物理上不通。但这里抓包是核心网DPDK没有发送ARP请求,就无所谓是否收到回复了。没有发送ARP请求首先检查核心网DPDK的路由配置:
现在的场景基站们用的地址段是172.16.0.0/16,所以需要给核心网DPDK配上172.16.0.0/16的下一跳指向仿真器。然后再跑场景:
这时候验证数据面是通的:
查看核心网SMF配置的星上UPF是哪一个,然后找到相关设备进行检查是否在线:
检查星上UPF是否在线且跑的时候抓包:
星上UPF设备正常在线。
星上UPF抓包的同时仿真器的DPDK抓包,然后跑场景:
星上UPF的抓包,从抓包来看都是正常接收到SMF的N4消息并且回复了:
仿真器DPDK的抓包,检查第一条PFCP HeartBeat Reuqest和第四条PFCP HeartBeat Response的链路层地址,是匹配的,并且已经走到了HeartBeat流程,说明前面的PFCP建立连接的流程是走通了的,也就是推断双方已经实现互通了,网络没有问题,需要再检查核心网:
核心网检查,抓包正常:
猜测是SMF中关于UPF配置的问题:
修改DNN为cmnet,权重为100,重启SMF重试:发现还是不行,并且查看smf的日志,从n4日志中发现smf尝试通过nrf选择upf,说明smf又没有正确选上我们想要的星上upf:
需要继续改SMF关于UPF的配置,尝试把DNN行去掉:
修改后重新跑后发现仿真日志中终端已经成功以星上UPF作为数据面锚点注册会话(,然后SMF中那个配置的作用机制目前笔者也还不清楚):
终端的地址也正确配置到虚拟网卡中:
接下来进一步验证测试星上UPF的数据面是否正常连接。
配置中该仿真星上UPF的终端配置了到每个星上MEC的规则,从而预期中使用该终端生成的虚拟网卡能访问到每一个星上MEC:
配置中其它关于星上UPF和星上MEC的配置,从中可以确认这个场景中星上UPF和星上MEC是分布在不同卫星上的,简单的UPF上星场景是逻辑组网上UPF和MEC处于同一个卫星上,这样路由会简单很多:
-
name: leo_upf1
number: 1
auto-var:
-
int:id = 416:0
-
ip4:satIP = 172.16.17.1:1
-
ip4:sessIP = 172.16.17.1:1
paths:
……
-
SAT_FACILITY.PORT_TYPE=loader
-
SAT_MAP_GW.NIC_BIND=dpdk:eth2
-
SAT_MAP_GW.APP_IP=UPF:172.16.255.2
-
-
name: leo_upf2
number: 1
auto-var:
-
int:id = 414:0
-
ip4:satIP = 172.16.17.2:1
paths:
……
-
SAT_FACILITY.PORT_TYPE=loader
-
SAT_MAP_GW.APP_IP=UPF:172.16.250.2
-
-
name: leo_mec1
number: 1
auto-var:
-
int:id = 415:0
-
ip4:satIP = 172.16.17.3:1
……
-
SAT_FACILITY.PORT_TYPE=loader
-
SAT_MAP_GW.APP_IP=172.16.251.3
-
-
name: leo_mec2
number: 1
auto-var:
-
int:id = 371:0
-
ip4:satIP = 172.16.17.4:1
……
-
SAT_FACILITY.PORT_TYPE=loader
-
SAT_MAP_GW.APP_IP=172.16.252.3
-
-
name: leo_mec3
number: 1
auto-var:
-
int:id = 461:0
-
ip4:satIP = 172.16.17.5:1……
-
SAT_FACILITY.PORT_TYPE=loader
-
SAT_MAP_GW.APP_IP=172.16.253.3
-
-
-
name: leo_mec4
number: 1
auto-var:
-
int:id = 369:0
-
ip4:satIP = 172.16.17.6:1……
-
SAT_FACILITY.PORT_TYPE=loader
-
SAT_MAP_GW.APP_IP=172.16.254.3
-
-
-
name: leo_mec5
number: 1
auto-var:
-
int:id = 459:0
-
ip4:satIP = 172.16.17.7:1……
-
SAT_FACILITY.PORT_TYPE=loader
-
SAT_MAP_GW.APP_IP=172.16.255.3
-
-
确认把每个星上MEC都启动在线:
开机后发现mec1到mec4都ping不通各自的网关(仿真器的dpdk),推断是仿真器的dpdk设置问题:
需要给仿真器dpdk的eth2添加上几个作为其它mec网关的地址:
尝试跑场景,待星上UE上线稳定后在仿真器的DPDK抓包,然后用该UE生成的地址去PING每个MEC,查看状态:
发现MEC都ping不通,这样需要查看分析DPDK的抓包,看什么状态。
抓包分析结果是大概率是仿真DPDK需要配置路由:30.0.0.0/8(ue地址段) via 172.16.255.2(upf n6):
配置完之后再跑,同时抓包:
数据面验证已经通了:
抓包数据正常:
但查看ping 172.16.255.3这个MEC的时候,有点不正常,这是因为星上UPF判断到这个网段的地址跟自己是同网段的,就将数据包直接发送给该MEC了,而不是走默认路由,从而将数据导入卫星网络。
这个是小问题,在UPF上加一个强制路由就行:ip route add 172.16.255.3/32 via 172.16.255.1 dev eth0
(加了之后发现其它的MEC不通了,是个bug。最好的解决方案是让这个MEC与UPF的网段不一样。或者就当是星上UPF与MEC在同一卫星上的场景。具体不再操作)
验证从UE到星上MEC的TCP文件传输,TCP文件传输能通几乎数据面就没问题了:
启动debug看看:
有些节点绑定了同一个卫星,是自动变量使用的问题,因为是大规模节点配置,需要使用自动变量,但可能自动变量功能不够完备有时候会出问题:
修改自动变量的用法后重复绑定的问题几乎没有出现,但是还是没有运行成功。
经过多轮测试和日志调试,调试到卫星自动组网算法的问题,需要修改代码修复。修复完成之后再跑:
场景中设置了10个卫星对地面服务器进行PING,通过。
进一步地,从地面服务器主动ping随机卫星,需要在配置中添加地面服务器的放行策略。
运行随机ping 172.16.17.99,发现数据进入了仿真的卫星处理逻辑中,但是显示节点不可达,检查配置文件:
注意到并确认对于ICMP模块,即使不主动ping也需要设置SESSION这个配置选项才行,否则不处理:
所以配置文件添加上:
再运行:发现出现了报错,需要代码修复:
修复后测试通过:
日志:
先进行8000个终端的接入和切换,后面再递进添加2000终端持续做业务:
在运行脚本的环境变量中事先设置了控制UE的上线速率最大为150ps
最多7991个终端,考虑到核心网可能因为其它项目改了终端的一些配置,检查好像没有发现问题,可能就是因为下面有小部分拒绝,然后终端没有重新上线。
默认模式已经是双连接。信关站会分辨卫星的升降轨关系,双连接是分别连接一个升轨、一个降轨卫星,从而优化网络路由。
更进一步的测试场景是关闭信关站双连接,然后创建场景让两个处于相近区域但不同升降轨的卫星去PING地面服务器,能够看到两个卫星的时延有较大差别。当启用信关站双连接后,原本时延较大的卫星的时延将会得到较大优化:
- 从前端查看2022-03-22 06:00:00时刻两个相近的卫星
- 仿真的时间配置为相同时刻,并配置该选中的二个卫星执行PING业务
默认是双连接
使用环境变量SCEPS_DISABLE_GS_DUAL_LINK=1关闭信关站双连接:
效果不明显,打开网络时延模拟,使用环境变量SCEPS_NET_DELAY_FACTOR=0(效果明显,这里日志是DEBUG模式):
在时延模拟的状态下重新打开双连接进行测试(可以看到215号卫星的跳数和时延得到了较大优化):
实际部署中一般是多信关站在全球或国内各地组网,仿真平台支持这个功能
- 修改配置,设置两个信关站,一个在上海,一个在欧洲,并且分别选取上海附近和欧洲附近的卫星执行任务
运行后,信关站经纬度:
跳数按照链路反向栈打印,其中一个卫星的数据经过2跳从leo152下信关站,另一个的数据经过1跳从64下信关站:
1)原有的216卫星的TLE起始时刻是2022年3月,但已有的星上UE的起始时刻是2024年5月,在一起运行会产生错误,所以这次测试使用1935颗卫星的星座,加上待验证的3个星上UE的TLE。
2)修改终端的配置,自动PING DN服务器
3)第一次运行有一部分基站连不上核心网AMF,但有一部分能连上,可能是核心网异常,尝试重启一下再跑
4)重启没有解决,看现象可能是大量基站上线太快,使用环境变量限制基站上线的速度SCEPS_L4CONN_BURST=10(限制L4层级协议SCTP的并发量,否则核心网会拒绝服务):
5)再运行发现并发数为10还是不行改为5,所有基站能正常上线:
5)从日志分析:三个星上UE都正常上线并且数据面正常,之后satue1触发了切换从leo1658切换到leo994。切换完成后可以看到satue1的数据面时延发生了明显变化。
1)设置星上MEC5的默认路由指向星上UPF,这样它的任何流量都会直接发往星上UPF(通过交换机),不经过仿真卫星网络,可仿真星上MEC与星上UPF在同一卫星上
2)设置星上MEC1的默认路由指向仿真器,流量先发往仿真器,经由仿真卫星网络转向星上UPF,可仿真星上MEC与星上UPF在不同卫星上
3)设置终端的配置,通过DNN=cmnet选择数据面锚点为星上UPF,并且分别设置自动PING业务,分别PING星上MEC1和星上MEC5。
4)卫星随机选二颗出去分别作为星上UPF和星上MEC1
5)星上UPF抓包,仿真器抓包,并运行场景,终端成功上线并建立会话。
6)分析星上UPF的包:
正常封装与解封装转发,如果指定网卡抓包并进一步分析的话,预计结果是从星上MEC1发送过来的包,链路层的源地址是仿真器的DPDK而不是星上MEC1系统自身的链路层地址。
7)分析仿真器DPDK抓的包,两种架构的路由路径不同:
1)让2个终端绑定相同的静态位置,并设置不同的DNN以选择不同的UPF作为其数据面锚点,并且分别PING星上MEC和地面DN。因为绑定相同的静态位置,2个终端大概率会从同一个基站接入,而数据面因为DNN而选择到2个不同的UPF,如果2个UE的数据面都正常通信,说明基站支持同时连接多个UPF。
2)运行的时候在仿真器抓包
3)运行日志显示2个终端建立会话成功且同一个基站(基站id=212)连接到了不同的UPF,且2个终端正常PING通各自的目标服务器:
4)抓包看基站发给UPF的GTP包,两种GTP包从同一基站发往不同UPF,GTP封装的是不同UE发往不同目的IPv4数据包:
1)在上个测试的场景配置基础上,把UE的业务选项改为DN_RULE,然后验证SCP文件传传输:
2)运行发现scp不通,但ping能通
3)从经验上先怀疑网卡配置(ethtool):仿真侧因为是TUN虚拟网卡的流量直接经过dpdk发出,无法设置网卡配置(并且经验上也无需配置);UPF侧的网卡从经验上一般不会有问题,因为其只是转发,问题出在端到端两端;DN侧是目前唯一有操作空间的地方,把DN的宿主机网卡和虚拟机本身的网卡设置好ethtool:
(经验上tcp完全没有速度一般是没有计算tcp checksum),虚拟机:
宿主机:
3)再跑,文件传输能传,但UE到星上MEC上行传输文件的速度看似正常(23.4MB/s),下行却几乎没有速度(33.7KB/s);另一边,UE到地面DN的文件传输上下行都是高速率,这部分没有问题。
4)按照经验,进一步调试星上MEC虚拟机的网卡配置,主要操作为将虚拟机和宿主机的网卡gro都关掉:
没有任何效果:
5)进一步关闭网卡gso:
下行速率涨了一些,几乎没有任何效果:
6)仿真平台这边设备没有操作空间,先尝试把UPF的网卡gro关闭:
上行得到了负优化,但下行恢复了:
7)回退把MEC和宿主机的gso开启(宿主机gso可能影响到了upf虚拟机的gso):
星上部分的速率都达到了可接受水平:
1)基于验证卫星基站能同时连接多个UPF的场景,static:ue1第一次连接的卫星是id为212、绑定tle为leo211的卫星。将此卫星改造为既有基站功能又有UPF功能的卫星,便于在场景开始跑不久就能验证此测试项:
2)运行:日志显示id=218的节点名称为leoupf1,且gtp连接的基站端使用的地址为172.16.18.1,与配置文件中的特定卫星一致,2个终端分别访问星上MEC和地面DN数据面正常:
3)查看仿真器的dpdk抓包,对于星上端,一开始基站的地址是172.16.18.1,一段时间后终端发生了切换,基站的地址变为172.16.17.62,切换后终端的数据面保持正常:
1)在上个场景配置基础上,去掉星上UPF功能,加上每个基站的多波束配置选项,分别为半波束角序列、离轴角序列,方位角序列,每个序列16项,也就是设置了16个波束,这里的配置与AT_ANGLE=110 pi /180相匹配,波束范围±55°:
2)打开DEBUG日志,从日志可以看到终端的波束状态变化
3)ue1一直处于leo62下
1)在信关站的配置中添加5GAS=1:
2)运行前相关路径下无目标文件:
3)从环境变量设置5GAS的日志等级为INFO
4)首次运行,没有配置文件
5)执行文件传输时5GAS开始不断打印调度日志,输出打印RB和TBS:
6)结束运行查看目标文件,不存在:
7)找一个du_parameters.ini放到指定位置,运行,目标文件依然不存在,查看代码发现相关配置是在配置文件中启用:在global_ctx_params域中添加enable_sched_info_report=1这个选项:
8) 这次运行关闭INFO日志等级
9)目标文件生成:
(题外)仿真平台运行时占用的CPU一直是150%,下次在启用5GAS且传输文件前,看占用;再进一步关闭5GAS看占用:
未传文件,相差不大:
未启用5GAS,CPU使用低了100%:
1)目前使用配置文件跑场景方式无法支持移动终端。——已经支持
2)准备在新优化后的仿真器版本通过代码添加这个功能:——已经添加,运行的时候需要使用新版本的可执行文件