Born to be proud
4/8
2017

ccnSim 模拟器

本文主要解析 ccnSim 的架构及源码包各文件作用,关于 ccnSim 的各项配置参数,安装方法等 manual 文档中已介绍的内容本文不再介绍。

什么是 ccnSim

ccnSim 是一个可扩展 chunk-level 的网络模拟器,基于OMNeT++框架,使用 C + + 编写,允许在大数量级的场景下模拟 CCN 网络。
ccnSim 模拟步骤以下三个阶段:

  • 编译 ccnSim 源文件, 链接 Omnet + + 框架
  • 编写拓扑描述(通常用户只需要设置 CCN 节点之间的连接)
  • 初始化每个模块的参数。这个可以直接读取 ned 文件或者 omnetpp.ini 初始化文件。
  • 执行仿真

OMNeT ++ 简介

既然想要读懂 ccnSim 的代码,首先要对 Omnet++ 有所了解。OMNeT++是一个免费的、开源的多协议网络仿真软件,在网络仿真领域中占有十分重要的地位。

  • OMNeT + + 是基于模块化的,最底层不可分割的模块是简单模块( simple modules),简单模块可以组成复合模块( compound modules)。
  • 在 OMNeT + + 平台上,用户使用 NED 语言来定义组件的结构,一般一个组件(.h 和其对应的 .cc 文件)同时对应一个.net文件
  • 组件之间通过 Message 进行交互,handleMessage() 方法用来处理消息

不了解 Omnet++ 的可以先读一下软件的 Manual 文档和软件包中附带的 tictoc 示例代码

ccnSim 架构

基本概念

在了解相应代码之前,我们首先需要了解一下 ccnSim 作者在面向对象编程时的思路。

  • 网络由各个节点组成,每个节点都是一个 core_layer 对象,core_layer 又包含了 base_cachestrategy_layer 两个对象。
  • 每个节点可以连接0个或1个 client ,client 代表一组用户,可以向网络发起内容请求。
  • 用户可以在配置文件中设置相关的仿真参数,决定相应的缓存策略,路由策略
    ccnSim

目录,核心文件介绍

  • include: 包含程序的头文件,多数.h文件对应 src 文件夹下的 .cc 文件
    • ccnsim.h 是程序的入口文件,定义了一些全部变量,数据结构及相应的处理方法
    • 需要注意的是缓存决策方法的源代码文件都在此目录下,直接在.h文件中定义了方法,没有与之对应的 src 文件。例如 ProbCache 算法对应 prob_cache.h 文件,LCD 算法对应 lcd_policy.h 文件
  • modules: 模型文件(.ned)目录,所有的模型都由三个文件组成(.ned模型文件,.h声明文件,.cc源代码文件),目录结构与 src 一样,在 src 目录下统一介绍
  • networks:测试用的网络拓扑结构文件(.ned)目录
  • packets: 定义的交换信息格式文件存放的目录。定义时仅需定义 .msg 文件,对应的 .cc.h 文件会在编译时自动产生
  • results 仿真实验结果数据存放目录
  • src 源代码目录
    • clients
      • client.cc 定义 client 对象,client 会发起请求,处理返回的 data 数据,以及相应的数据统计
    • content
      • content_distribution.cc 实现了内容初始化。初始化内容源仓库,内容分配等
      • zipf.cc 实现内容 zipf 分布
    • node
      • cache : 替换算法目录
        • base_cache.cc: base_cache 对象作为节点缓存空间的承载体,是其他缓存替换算法的父类。实现了缓存存取,查找的功能。
        • fifo_cache.cc: 先进先出替换算法
        • lru_cache.cc: 近期最少使用替换算法
        • random_cache.cc: 随机替换算法
      • strategy: 路由策略代码目录
        • strategy_layer.cc: 路由算法的父类,初始化FIB
        • MonopathStrategyLayer.cc: 继承自strategy_layer.cc 多数路由算法继承此类定义了路径选择方法等
        • spr.cc : 最近路由策略算法,将请求路由至最近的内容源仓库
      • core_layer.cc: 节点的承载对象,处理请求(interest)与数据(data)
    • statistics
      • statistics.cc: 统计代码,定义了统计规则,对仿真进行数据统计
  • omnetpp.ini: 仿真配置文件,omnetpp 的配置文件语法规则

请求内容

client 通过生成一个0到1的随机数,通过zipf函数,得到该分布概率下的最有一个内容。如果把内容按热度排序,那么从1到n的热度内容概率分布是这个随机数,n就是要发起请求的内容。
INTEREST 中的 chunk 由 id + number 组成,第一个 number 为0

LRU 替换算法

LRU 替换算法通过一个哈希表和一个双向链表实现。哈希表记录内容号,用于快速查找。双向链表通过两个指针分别记录刚被使用的和最久未被使用的。

lru_pos* lru; //least recently used item
lru_pos* mru; //most recently used item