AFSIM通信基础模型代码库分析¶
1、代码情况¶
代码组织结构¶
comm/
├── 核心通信类 (Core Communication)
├── 网络层实现 (Network Layer)
├── 协议栈实现 (Protocol Stack)
├── 路由器组件 (Router Components)
├── 传输介质 (Medium)
├── 消息处理 (Message Handling)
└── 工具类 (Utilities)
2、依赖关系¶
2.1 外部依赖¶
工具库依赖(Ut前缀)¶
UtCallback.hpp - 回调机制
UtCallbackHolder.hpp - 回调容器
UtCloneablePtr.hpp - 智能指针扩展
UtGraph.hpp - 图算法库
UtInput.hpp - 输入处理
UtScriptAccessible.hpp - 脚本接口
UtTable.hpp - 表结构
框架依赖(Wsf前缀)¶
WsfArticulatedPart.hpp - 部件基类
WsfAuxDataEnabled.hpp - 辅助数据支持
WsfComponent.hpp - 组件基类
WsfEvent.hpp - 事件系统
WsfMessage.hpp - 消息基类
WsfPlatform.hpp - 平台支持
WsfRandomVariable.hpp - 随机变量
WsfScenario.hpp - 场景管理
WsfSimulation.hpp - 仿真引擎
2.2 内部模块依赖关系¶
graph TD
A[WsfComm] --> B[WsfCommProtocolStack]
A --> C[WsfCommRouter]
A --> D[WsfCommAddress]
B --> E[WsfCommLayer]
E --> F[WsfCommNetworkLayer]
E --> G[WsfCommDatalinkLayer]
E --> H[WsfCommPhysicalLayer]
C --> I[WsfCommProtocolInterface]
I --> J[WsfCommProtocolOSPF]
I --> K[WsfCommProtocolRIPv2]
A --> L[WsfCommMedium]
L --> M[WsfCommMediumGuided]
L --> N[WsfCommMediumUnguided]
3、模型架构¶
3.1 OSI七层模型实现¶
该代码库实现了完整的OSI七层网络模型:
-
物理层 (Physical Layer)
WsfCommPhysicalLayer.hpp/cpp- 处理信号传输和硬件接口
-
数据链路层 (Data Link Layer)
WsfCommDatalinkLayer.hpp/cpp- 负责帧处理和错误检测
-
网络层 (Network Layer)
WsfCommNetworkLayer.hpp/cpp- 处理路由和寻址
-
传输层 (Transport Layer)
WsfCommTransportLayer.hpp/cpp- 提供端到端的可靠传输
-
会话层 (Session Layer)
WsfCommSessionLayer.hpp/cpp- 管理会话建立和维护
-
表示层 (Presentation Layer)
WsfCommPresentationLayer.hpp/cpp- 数据格式转换和加密
-
应用层 (Application Layer)
WsfCommApplicationLayer.hpp/cpp- 提供应用程序接口
3.2 核心组件¶
3.2.1 WsfComm类(主通信类)¶
class Comm : public WsfArticulatedPart
{
// 通信类型定义
enum CommType {
cCT_XMT_ONLY, // 仅发送
cCT_RCV_ONLY, // 仅接收
cCT_XMT_RCV // 收发双向
};
// 多播支持级别
enum class MulticastConformanceLevel {
cLEVEL_0, // 不支持多播
cLEVEL_1, // 仅支持发送
cLEVEL_2 // 完全支持
};
};
主要功能: - 管理通信设备的基本属性(地址、网络归属) - 处理消息的发送和接收 - 支持组件化架构 - 集成路由器功能
3.2.2 协议栈管理(ProtocolStack)¶
class ProtocolStack {
// 层级管理
Layer* AddLayer(std::unique_ptr<Layer> aLayerPtr);
bool RemoveLayer(size_t aLayerIndex);
Layer* InsertLayer(size_t aLayerIndex, std::unique_ptr<Layer> aLayerPtr);
// 消息处理
virtual bool Receive(double aSimTime, Comm* aXmtrPtr, Message& aMessage);
virtual bool Send(double aSimTime, Message& aMessage);
};
特点: - 动态层级管理 - 支持运行时协议栈修改 - 层间消息传递机制
4、网络拓扑支持¶
4.1 支持的网络拓扑类型¶
-
点对点网络 (Point-to-Point)
WsfCommNetworkPointToPoint.hpp/cpp- 两个节点直接连接
-
网状网络 (Mesh)
WsfCommNetworkMesh.hpp/cpp- 全连接或部分连接拓扑
-
星型网络 (Star)
WsfCommNetworkStar.hpp/cpp- 中心节点与多个外围节点
-
环形网络 (Ring)
WsfCommNetworkRing.hpp/cpp- 节点串联成环
-
Ad-Hoc网络
WsfCommNetworkAdHoc.hpp/cpp- 动态自组织网络
- 支持运行时拓扑变化
-
通用网络 (Generic)
WsfCommNetworkGeneric.hpp/cpp- 灵活的网络配置
4.2 网络管理器(NetworkManager)¶
class NetworkManager : public WsfSimulationExtension {
// 网络拓扑类型
enum class NetworkTopology {
cPOINT_TO_POINT,
cMESH,
cSTAR,
cRING,
cDIRECTED_RING
};
// 核心功能
- 管理所有通信设备地址映射
- 维护网络拓扑图
- 支持多播组管理
- 提供路径查询功能
};
5、路由协议实现¶
5.1 支持的路由协议¶
-
OSPF (Open Shortest Path First)
WsfCommProtocolOSPF.hpp/cpp- 链路状态路由协议
- 支持区域划分
- DR/BDR选举机制
- 约2000行实现代码
-
RIPv2 (Routing Information Protocol v2)
WsfCommProtocolRIPv2.hpp/cpp- 距离向量路由协议
- 周期性路由更新
-
IGMP (Internet Group Management Protocol)
WsfCommProtocolIGMP.hpp/cpp- 多播组管理协议
- 支持组成员管理
-
Legacy协议
WsfCommProtocolLegacy.hpp/cpp- 传统路由实现
-
Ad-Hoc路由
WsfCommProtocolAdHoc.hpp/cpp- 自组织网络路由
5.2 路由器架构¶
class Router : public WsfPlatformPart {
// 发送数据封装
class SendData {
Comm* GetXmtr();
std::vector<Message>& GetMessages();
};
// 核心路由方法
virtual bool Receive(...);
virtual bool Send(...);
// 协议管理
ComponentList& GetComponents();
};
6、传输介质支持¶
6.1 介质类型¶
-
有线介质 (Guided Medium)
WsfCommMediumGuided.hpp/cpp- 支持点对点连接
- 确定性传输特性
-
无线介质 (Unguided Medium)
WsfCommMediumUnguided.hpp/cpp- 广播特性
- 支持电磁传播模型
-
无线电收发器
WsfRadioXmtrRcvr.hpp/cpp- 专门的无线电通信支持
6.2 介质管理¶
7、消息处理机制¶
7.1 消息结构¶
class Message : public UtScriptAccessible, public WsfAuxDataEnabled {
// 核心组成
- 源消息指针 (mSrcMessagePtr)
- 消息头栈 (mHeaders)
- 消息尾栈 (mTrailers)
- 路由追踪 (mTraceRoute)
- TTL控制 (mTTL)
- 传输特性 (mTransportFeature)
// 消息标识符
class Identifier {
unsigned int GetSerialNumber();
const Address& GetSource();
const Address& GetDestination();
};
};
7.2 层间消息传递¶
namespace layer {
class Message {
// 层间控制消息
static constexpr Message cDOWN_ACK_SEND;
static constexpr Message cDOWN_NACK_SEND;
static constexpr Message cUP_ACK_RECEIVE;
static constexpr Message cNETWORK_FORWARD;
static constexpr Message cDATALINK_READY;
};
}
8、地址管理¶
地址类(WsfCommAddress)¶
- 支持多种地址格式
- 层次化地址结构
- 子网掩码支持
- 地址转换功能
保留地址管理¶
9、设计模式¶
组件模式(Component Pattern)¶
// 所有组件的基类接口
class WsfComponent {
virtual WsfComponent* CloneComponent() const = 0;
virtual const int* GetComponentRoles() const = 0;
virtual void* QueryInterface(int aRole) = 0;
virtual int GetComponentInitializationOrder() const = 0;
};
应用实例:
- WsfComm
- WsfCommRouter
- 所有Protocol类
策略模式(Strategy Pattern)¶
// 路由策略接口
class ProtocolInterface {
virtual bool Send(double aSimTime, Router::SendData& aData) = 0;
virtual bool Receive(...) = 0;
virtual std::vector<Address> Routing(...) = 0;
};
// 具体策略实现
class ProtocolOSPF : public ProtocolInterface { ... }
class ProtocolRIPv2 : public ProtocolInterface { ... }
装饰器模式(Decorator Pattern)¶
// 消息装饰
class Message {
void PushHeader(MessageHeader* aHeader);
void PushTrailer(MessageTrailer* aTrailer);
MessageHeader* PopHeader();
MessageTrailer* PopTrailer();
};
观察者模式(Observer Pattern)¶
// 事件通知机制
class Event : public WsfEvent {
virtual void Execute(WsfSimulation& aSim) = 0;
};
// 回调注册
UtCallbackHolder mCallbacks;
10、关键算法¶
10.1 路由算法¶
Dijkstra最短路径算法¶
位置:WsfCommGraph.cpp
// 使用优先队列实现的Dijkstra算法
void Graph::ComputeShortestPaths(const Address& aSource) {
// 初始化距离表
// 优先队列处理
// 更新邻接节点
}
OSPF链路状态算法¶
- DR/BDR选举算法
- LSA泛洪算法
- SPF树计算
10.2 地址管理算法¶
子网掩码计算¶
class Address {
bool IsInSubnet(const Address& aSubnet, const Address& aMask);
Address GetNetworkAddress(const Address& aMask);
Address GetBroadcastAddress(const Address& aMask);
};
10.3 队列管理算法¶
11、性能优化¶
11.1 内存管理¶
- 智能指针使用
std::unique_ptr<Layer> mLayer;
std::shared_ptr<OSPF_Area> mArea;
ut::CloneablePtr<WsfMessage> mMessage;
-
对象池技术
- 消息对象复用
- 事件对象池
-
移动语义
11.2 算法优化¶
- 哈希表应用
-
缓存机制
- 路由表缓存
- 地址解析缓存
-
延迟计算
- 按需更新路由表
- 事件驱动的状态更新
12、线程安全性¶
12.1 潜在并发点¶
-
多平台仿真
- 不同平台的通信设备可能并行执行
- 需要同步的共享资源:
- NetworkManager
- 全局路由表
- 多播组成员表
-
事件调度
- 并发事件处理
- 事件队列访问
12.2 同步机制¶
目前代码未见显式的互斥锁或同步原语,可能采用:
- 单线程事件循环
- 时间步进同步
- 仿真引擎层面的同步
13、扩展考虑¶
13.1 协议扩展点¶
13.2 网络类型扩展¶
13.3 介质类型扩展¶
14、配置与脚本接口¶
14.1 脚本类注册¶
14.2 输入处理¶
15、测试与调试¶
15.1 调试功能¶
- 消息追踪
- 状态查询
-
统计信息
- 消息计数
- 路由跳数
- 延迟统计
15.2 测试点¶
- 事件注入
- 故障模拟
- 性能度量点