前言
工欲善其工,必先利其器。
最近在学习ns3,于是折腾了好几天的环境。终于可以自己动手了。如果你也是刚准备学习ns3,你可以借鉴我博客的文章,
先把应该有的环境配置好,才能更好的去学习ns3。
Ubuntu的安装与配置
Ubuntu的优化
NS3环境搭建
搞定了环境之后,还没有进入正题去入门我们的NS3。
在我们学习ns3的时候,大部分时候我们都是在终端中输入命令./waf和./war --run的方式来编译和运行项目,对于代码文件的更改也只是称“使用你喜欢的IDE将代码修改”。虽然说理论上我们可以通过vim和终端命令完成所需要的所有代码编辑功能,但是作为2020年的程序员,我们希望有IDE。
这时候大部分人会想到用eclipse去编译代码,但是书本或者官网给出的配置实在是太多了。
并且我也可以接受去使用终端编译项目,我想要的只是更方便的代码编写以及代码高亮,自动补全。
所以这时候,就轮到VScode登场了。
配置VScode
1.安装vscode,安装好扩展C/C++。
2.创建一个目录,使用vscode打开,按F1调出控制台,配置相关设置。
修改includepath的参数
至此大功告成,只要我们打开相关的代码进行编译就好了。当然编译运行还是要在终端中输入命令。
开始入门NS3
通过阅读分析一个例子程序(first.cc)的源代码,并通过运行该例子程序,快速理解ns3中的几个概念。
NS3中的几个关键概念
1.节点Node
在网络术语中,任何一台连接到网络的计算设备被称为主机,亦称为终端。NS3是一个网络模拟器,而非一个专门的因特网模拟器,为此我们避开术语“主机”,因为这个词太容易让人联想到因特网和及其相关协议。因此,我们选用了一个来源于图论,在其他网络模拟器中亦广泛使用的术语:节点。
NS3中基本计算设备被抽象为节点。节点由用C++编写的Node类来描述。Node类提供了用于管理计算设备的各种方法。
可以将节点设想为一台可以添加各种功能的计算机。为了使一台计算机有效地工作,我们可以给它添加应用程序,协议栈,外设卡及驱动程序等。NS3采用了与此相同的模型。
2.信道
在现实世界中,人们可以把计算机连接到网络上。通常我们把网络中数据流流过的媒介称为信道。当你把以太网线插入到墙壁上的插孔时,你正通过信道将计算机与以太网连接。在NS3中,可以把节点连接到代表数据交换信道的对象上。在这里,基本的通信子网这一抽象概念被称为信道,用C++编写的Channel类来描述。
Channel类提供了管理通信子网对象和把节点连接至信道的各种方法。信道类同样可以由开发者以面向对象的方法自定义。一个信道实例可以模拟一条简单的线缆(wire),也可以模拟一个复杂的巨型以太网交换机,甚至无线网络中充满障碍物的三维空间。
在本章中我们将使用几个信道模型的实例,包括:CsmaChannel,PointToPointChannel和WifiChannel。举例来说,CsmaChannel信道模拟了用于一个可以实现载波侦听多路访问的信道,这个信道具有和以太网相似的功能。
3.网络设备
如果想把一台计算机连接到网络上,必须在计算机上安装有网卡。一张网卡如果缺少控制硬件的软件驱动是不能工作的。在Unix/Linux系统中,外围硬件被划为“设备”。设备通过驱动程序来控制,而网卡通过网卡驱动程序来控制。在Unix/Linux系统中,网卡被称为像eth0这样的名字。
在NS3中,网络设备这一抽象概念相当于硬件设备和软件驱动的总和。NS3仿真环境中,网络设备相当于安装在节点上,使得节点通过信道和其他节点通信。像真实的计算机一样,一个节点可以通过多个网络设备同时连接到多条信道上。
网络设备由用C++编写的NetDevice类来描述。NetDevice类提供了管理连接其他节点和信道对象的各种方法,并且允许开发者以面向对象的方法来自定义。我们在本教程中将使用几个特定的网络设备的实例,它们分别是CsmaNetDevice,PointToPointNetDevice, 和WifiNetDevice。正如以太网卡被设计成在以太网中工作一样,CsmaNetDevice被设计成在csma信道中工作,而PointToPointNetDevice在PointToPoint信道中工作,WifiNetNevice在wifi信道中工作。
4.应用程序
计算机软件通常可分为两大类:系统软件和应用软件。系统软件根据计算模型配置,并管理计算机中的各种资源,如内存,处理器周期,硬盘,网络等。系统软件通常并不直接使用这些资源来完成用户任务。用户往往需要运行应用程序来完成一些特定的任务,而应用程序需要使用由系统软件控制的资源。
通常,系统软件和应用软件的界线表现为特权级别的变化,而这种变化是通过操作系统的自陷功能(operating systemtraps)来实现的。在NS3中并没有真正的操作系统的概念,更没有特权级别或者系统调用的概念。然而,我们有应用程序的概念。正如“现实世界”中在计算机上运行应用程序以执行各种任务一样,NS3仿真环境中的应用程序在节点上运行来驱动模拟过程。
在NS3中,需要被仿真的用户程序被抽象为应用。用Application类来描述。这个类提供了管理仿真过程中用户层应用的各种方法。开发者应当用面向对象的方法自定义和创建新的应用。在本教程中,我们会使用Application类的两个实例:UdpEchoClientApplication和UdpEchoServerApplication。这些应用程序包含了一个client应用和一个server应用来发送和回应仿真网络中的数据包。
分析例子程序first.cc的源代码
进入ns-3.15/examples/tutorial目录。你会发现一个叫first.cc的文件。这一个脚本会在两个节点间创建一个简单的点到点的连接,并且在这两个节点之间传送一个数据包。为方便后续分许,先将first.cc的源代码粘贴如下:
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation;
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include "ns3/core-module.h"
#include "ns3/network-module.h"
#include "ns3/internet-module.h"
#include "ns3/point-to-point-module.h"
#include "ns3/applications-module.h"