今天从《ns-3 tutorial》第4章开始。
4. 基本概念
在看或写ns-3程序前,需要理解掌握一些概念和抽象问题。
It’s be recommended taking the time to read through this section just to ensure you’re starting on a firm foundation.
4.1 关键概念(Key Abstractions)
先介绍几个网络中常用的词,它们在NS3中有特定含义。
1.node(节点)
NS3不局限于Internet模拟,所以用node表示网络中的主机或终端,而不是直接用host。node与图论中的“点”概念类似。NS-3中把基本计算设备都称为node,并将这个抽象概念用C++类Node描述。Node类中有一些管理计算设备行为的方法和属性。
你可能已经开始考虑怎么给Node上应用、协议栈、外设了,以便这个设备能有效工作,但这是稍后才能考虑的事,但都是基于node模型展开的。
2.Application(应用)
计算机软件通常划分为:系统软件和应用软件。两者直接的切分线往往是基于系统特权级别的变化。在NS-3中没有OS的概念,也没有特权级别或系统调用的概念,但有Application应用程序的概念。就像真实世界里运行于计算机中的应用程序执行某个任务一样,在模拟世界中运行于NS3 Nodes上的Applications也执行某个模拟。
NS-3里,一个能产生某项模拟活动的用户程序就被抽象地称为Application。这个抽象被C++类Application所描述。Application类中包含了一些用户级操作以执行模拟活动。在本文中,我们使用特殊的Application类——UdpEchoClientApplication和UdpEchoServerApplication类,构成一个C/S模拟网络。
3.Channel(信道)
传递数据的网络媒介(线缆/无线频道等)被称为channels。在NS-3中,连接一个node到一个通信信道,就像你在现实中把电脑后的网线连到墙上以太网插槽中一样。NS-3中把基本的通信子网(就是物理层与链路层)抽象为Channel,并用C++类Channel描述。
Channel类里提供了一系列方法,用于管理通信子网对象和连接节点。用户可以根据基本的Channel类编写自己特定Channel类,例如某线缆。特定的Channel也可以是大的以太交换机或用于无线网络的充满障碍的三维信道空间。
本文中使用特定的Channel类CsmaChannel、PointToPointChannel和WiFiChannel,也就是典型的使用以太技术的动态接入共享信道、点对点信道、wifi信道。
4.Net Device(网络设备)
通常连接一台主机到网络,我们需要买网线和网卡(NICs),网卡这类设备称为device,device需要在驱动driver支持下工作。在NS-3中,net device这个概念包含了软件dirver和硬件device。一个net device安装在Node上,使Node可以经由Channel与别的Node通信。
NS3中Net Device被抽象描述为C++类NetDevice,它提供了一些方法来管理Node对象与Channel对象的连接。
本文中将使用特殊的网络设备类CsmaNetDevice,PointToPointNetDevice和WifiNetDevice(即以太网卡类/点到点网卡类/wifi网卡类)。
5.Topology Helpers(拓扑工具)
真实世界里主机中安装着网络设备,NS-3中,node连接着net device。在较大的网络模拟中,可能需要安排Nodes、Netdevices和Channels的许多连接,这个时候需要拓扑工具来规划网络形态。
在NS-3中,连接node与netdevice、netdevice与channel、指定IP地址等工作,需要调用拓扑工具topology helpers,这会使任务变得简单。例如:生成网络设备、增加MAC地址、安装设备到node,配置node协议栈,连接netdevice到信道等等。
补充一句,上述C++类在ns-allinone-3.26/ns-3.26/src/network/model中。
4.2 第一个NS-3脚本
下载ns-allinone-3.26之后,你会在ns-3.26中看到如下内容:
切换工作环境到examples/tutorial中,你会看到一个叫first.cc的文件。这个文件是一个简单的p2p网络模拟程序,它连接两个nodes,并在节点间发送一个数据包(echo)。下面我们逐行学一下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