因功能要求,需要在Exata上移植一个网络层协议,并且验证路由表的正确性,实现卫星之间数据包可达。
介绍
Exata是一款网络仿真软件,主要用于仿真卫星通信网络。它由美国北卡罗来纳州立大学计算机科学系的研究人员开发,旨在模拟和评估卫星通信网络在各种条件下的性能。
Exata软件能够模拟各种卫星通信网络,包括地球轨道卫星网络、地面站网络、航空器网络和海洋平台网络。它支持不同的网络拓扑结构和协议,并能够模拟各种不同的信道和干扰条件。
使用Exata进行卫星通信仿真,可以评估网络性能和带宽利用率、确定网络拓扑结构和协议、预测网络覆盖范围和可靠性、分析网络容量和负载平衡等。Exata还可以通过可视化工具实时显示仿真结果,帮助用户更直观地理解和分析网络性能。
网络层设计
一般来说,路由器的三层指的是物理层、数据链路层和网络层。物理层主要负责物理传输介质的传输;数据链路层负责将数据封装成帧并进行错误检测和纠正;而网络层则负责网络之间的路由选择和地址转换。
在卫星组网中,每颗卫星既是接受服务的主机,同时也是路由器。
具体的网络层内部模块如下:
按照功能分类,可以划分为以下几个部分:
- 初始化模块:初始化各种参数,包括路由表、路由表项存活时间、路由表周期广播时间、路由表触发广播时间等。另外还有函数对数据包的发送功率、延迟、优先级等参数进行初始化,我在项目中暂时没有用到。
- 上行模块(本项目协议栈丢弃了传输层,网络层直接对接应用层):网络层接收数据包给应用层、应用层发送数据包给网络层。这一步中,IP协议会为上行数据包解析IP包头,为下行数据包添加IP包头。
- 路由功能模块:接收数据链路层的上行包,以及应用层的下行包,查找路由表确定下一跳发送的卫星节点。
- 路由表更新模块:包括定时更新和触发更新。定时更新通过设置定时器实现,周期性地广播当前卫星的所有路由表信息。当卫星收到了一个路由包,就会解析并且更新自己的路由表,如果发现某一项路由表项失效,就会调用触发更新广播自身的路由表。另外,路由表项的生存时间由定时器控制,当路由表项超时后,也会调用触发更新。
- 下行模块:网络层发送数据包给数据链路层,数据链路层发送数据包给网络层。这一步中,数据链路层会为上行数据包解析mac包头,IP协议会为下行数据包添加IP包头。
查询路由表
该项目中,路由表使用双向链表存储表项。路由功能模块向路由表查询后,得到如下的结构体指针。
参数项 | 类型 | 说明 |
srcID | unsigned short | 本节点ID |
destID | unsigned short | 目标节点ID |
nextID | unsigned short | 下一跳节点ID |
metric | unsigned char | 跳数 |
routeState | ROUTE_STATE | 该路由表项是否有效 |
serialNumber | unsigned int | 序列号 |
aliveTimeout | unsigned int | 路由表项生存时间 |
triggerFlag | bool | 是否需要触发更新 |
quality | unsigned short | 质量(未使用) |
prior | ROUTE_ENTRY_TYPE* | 前一项路由表项 |
next | ROUTE_ENTRY_TYPE* | 后一项路由表项 |
下图是一个6节点卫星拓扑:
运行仿真,打印出节点1的具体路由表。可以发现,节点1到节点6、4、2、5都是一跳可达,而到节点3需要两跳,经过节点2转发。
目的节点 | 下一跳 | 总跳数 | 路由表项是否有效 | 序列号 | 表项存活时间 | 质量 |
1 | 1 | 0 | 1 | 28 | 60000 | 0 |
6 | 6 | 1 | 1 | 26 | 57000 | 0 |
4 | 4 | 1 | 1 | 28 | 60000 | 0 |
2 | 2 | 1 | 1 | 28 | 59000 | 0 |
3 | 2 | 2 | 1 | 24 | 56000 | 0 |
5 | 5 | 1 | 1 | 28 | 59000 | 0 |
实验
通过实验,验证了移植的网络层协议能够正常工作,卫星之间最多两跳满足互相连通。