sim.cc
构建网络拓扑
-
分配ip一定要在构建拓扑之后,不然会报错
-
时间是10s
-
哑铃状拓扑 Dumbbell d
- .GetLeft() 和 .GetRight() 取哑铃状中间的两个路由器
- .GetLeft( int i ) 和 .GetRight( int i ) 取哑铃状左右叶子的节点
- 先安装中间的节点,再安装两边的
-
哑铃状IP分配
- 左边的所有叶子节点的地址为10.1.1.x,子网掩码为255.255.255.0
- 右边的所有叶子节点的地址为10.2.1.x,子网掩码为255.255.255.0
- 路由器的接口地址为10.3.1.x,子网掩码为255.255.255.0
- 注意路由器有两个device,所以这里的10.3.1.x指的是中间的网段
定义openGym相关
- comment里面注明必须再其他所有的拓扑开始之前设置OpenGym Env相关
- 创建一个openGymInterface的类(的智能指针)并且绑定相应的端口
- openGymPort
- tcpEnvTimeStep定义为0.1s,得是约为一个RTT ,一个时间步进行一次reward和动作(???)的更新
- transport_prot 拥塞控制算法种类
分为TimeBased和EventBased
回调函数
- CountRxPkts绑定PacketSink类的Rx属性跟踪中
tcp-rl-env
- 实际上它就是RL中的环境的定义,只不过ns3-gym中的环境还包括拓扑的搭建(sim.cc)
他这个类的作用就辅助python中的代码可以像调用gym环境一样去调用环境的接口(get_action、step之类的)
OpenGymEnv
- tcp-rl-env里面所有类的基类,抽象类,主要是定义了官方要的七个接口,都是纯虚函数,毕竟opengym_interface也等着调用呢!
- 还有一些别的函数和属性
* SetOpenGymInterface( )
* Notify ( )
* NotifySimulationEnd( )
* Ptr<OpenGymInterface> m_openGymInterface;
- 接口接口,那么都接去哪儿了呢?从哪儿接啊——OpenGymInterface
NotifySimulationEnd()和Notify()
- 调用的OpenGymInterface的里面对应的函数
SetOpenGymInterface
- 调用的OpenGymInterface里面的函数,把OpenGymInterface的回调函数设置成自己类里面的一系列
void
OpenGymEnv::SetOpenGymInterface(Ptr<OpenGymInterface> openGymInterface)
{
NS_LOG_FUNCTION (this);
m_openGymInterface = openGymInterface;
openGymInterface->SetGetActionSpaceCb( MakeCallback (&OpenGymEnv::GetActionSpace, this) );
openGymInterface->SetGetObservationSpaceCb( MakeCallback (&OpenGymEnv::GetObservationSpace, this) );
openGymInterface->SetGetGameOverCb( MakeCallback (&OpenGymEnv::GetGameOver, this) );
openGymInterface->SetGetObservationCb( MakeCallback (&OpenGymEnv::GetObservation, this) );
openGymInterface->SetGetRewardCb( MakeCallback (&OpenGymEnv::GetReward, this) );
openGymInterface->SetGetExtraInfoCb( MakeCallback (&OpenGymEnv::GetExtraInfo, this) );
openGymInterface->SetExecuteActionsCb( MakeCallback (&OpenGymEnv::ExecuteActions, this) );
}
opengym_interface
class OpenGymSpace; //Space类
class OpenGymDataContainer; //数据存储(比如说Observation的值得存储)
class OpenGymEnv;
init()
- 创建一个ns3opengym(which使用了zmq等通信框架),把信息(obsSpace和actionSpace的初始化信息)通过ns3opengym传递给python并设置m_initSimMsgSent为真
- 然后收python那边传来的ACK
NotifyCurrentState()
- 把ns3这边的数据收集起来( Obersavation、reward、Done(IsGameOver)、ExtraInfo )传递给python
IsGameOver
- 返回gameOver或者m_simEnd
NotifySimulationEnd
- 应该是再模拟结束的时候调用?
- 设置m_simEnd为真
- 结束有两种方式,一种就是仿真时间到了,一种就是IsGameOver返回True
- 如果m_initSimMsgSent为真
OpenGymInterface(uint32_t port)
- 初始化一些属性
m_port(port), m_zmq_context(1), m_zmq_socket(m_zmq_context, ZMQ_REQ),
m_simEnd(false), m_stopEnvRequested(false), m_initSimMsgSent(false)
DoGet(uint32_t port)和 Get( uint32_t port )
- 使用单例模式返回一个interface的ptr
WaitForStop()
- 调用NotifyCurrentState()
NotifySimulationEnd()
- 设置m_simEnd为真
- 如果已经初始化发过信息(m_simEnd为真),调用m_simEnd
Notify()
- 设置回调函数(设置成OpenGymEnv 的一系列动作)
SetGetGameOverCb( MakeCallback (&OpenGymEnv::GetGameOver, entity) );
SetGetObservationCb( MakeCallback (&OpenGymEnv::GetObservation, entity) );
SetGetRewardCb( MakeCallback (&OpenGymEnv::GetReward, entity) );
SetGetExtraInfoCb( MakeCallback (&OpenGymEnv::GetExtraInfo, entity) );
SetExecuteActionsCb( MakeCallback (&OpenGymEnv::ExecuteActions, entity) );
TcpGymEnv [ 还是个抽象类 ]
-
继承OpenGymEnv ,所以一定要实现那OpenGymInterface对应的七个接口
-
还要求了另一些多的接口
- track packet
* TxPktTrace() * RxPktTrace
- TCP拥塞控制算法
GetSsThresh() IncreaseWindow() PktsAcked() CongestionStateSet() CwndEvent()
-
还有一些属性用于记录AGENT
m_nodeId 哪个节点是AGENT
m_socketUuid 这个节点上的哪个socket
TcpEventGymEnv
- 继承TcpGymEnv
TcpTimeStepGymEnv
- 继承TcpGymEnv
存疑
- 动作的更新也在每一个Step里面?
- openGym的接口是什么时候被自动调用的?
- NotifySimulationEnd什么时候调用呢
- 还有一些属性用于记录AGENT 这个是不是用来设置相应的变化的