代码中的主要步骤如下:
- 引入所需的头文件,包括应用程序模块、核心模块、Internet模块、网络模块和点对点模块。
- 在代码中定义了一个网络拓扑,包括两个节点(n0 和 n1)。
- 创建一个PointToPointHelper对象,设置点对点链路的数据传输速率和延迟。
- 使用PointToPointHelper的Install方法将设备连接到节点,并返回一个NetDeviceContainer对象。
- 创建一个InternetStackHelper对象,用于将Internet协议栈安装到节点上。
- 创建一个Ipv4AddressHelper对象,设置节点的IP地址和子网掩码。
- 使用Ipv4AddressHelper的Assign方法为点对点链路分配IP地址。
- 创建一个UdpEchoServerHelper对象,指定服务器应用程序的端口号。
- 使用UdpEchoServerHelper的Install方法将服务器应用程序安装到节点n1上,并设置应用程序的启动和停止时间。
- 创建一个UdpEchoClientHelper对象,指定客户端应用程序的目标IP地址和端口号。
- 设置客户端应用程序的属性,如最大数据包数、发送间隔和数据包大小。
- 使用UdpEchoClientHelper的Install方法将客户端应用程序安装到节点n0上,并设置应用程序的启动和停止时间。
使用Simulator::Run()运行仿真。 使用Simulator::Destroy()清理并销毁仿真器。 返回0,表示程序正常结束。
该示例程序实现了一个简单的UDP回显客户端和服务器应用程序。客户端发送一个数据包到服务器,服务器收到数据包后将其返回给客户端。代码中设置了一些应用程序的参数,如数据传输速率、延迟、IP地址等,以及应用程序的启动和停止时间。
总体而言,这段代码演示了如何使用ns-3库创建一个简单的点对点网络拓扑,并在节点之间进行UDP通信。
#include "ns3/applications-module.h" // 引入应用程序模块的头文件
#include "ns3/core-module.h" // 引入核心模块的头文件
#include "ns3/internet-module.h" // 引入Internet模块的头文件
#include "ns3/network-module.h" // 引入网络模块的头文件
#include "ns3/point-to-point-module.h" // 引入点对点模块的头文件
// Default Network Topology
//
// 10.1.1.0
// n0 -------------- n1
// point-to-point
//
using namespace ns3;
NS_LOG_COMPONENT_DEFINE("FirstScriptExample"); // 定义日志组件
int main(int argc, char* argv[])
{
CommandLine cmd(FILE); // 创建命令行解析对象
cmd.Parse(argc, argv); // 解析命令行参数
Time::SetResolution(Time::NS); // 设置时间分辨率为纳秒
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO); // 启用日志组件,设置日志级别为INFO
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO); // 启用日志组件,设置日志级别为INFO
NodeContainer nodes; // 创建节点容器对象
nodes.Create(2); // 创建两个节点
PointToPointHelper pointToPoint; // 创建点对点网络帮助器对象
pointToPoint.SetDeviceAttribute("DataRate", StringValue("5Mbps")); // 设置点对点链路的数据传输速率为5Mbps
pointToPoint.SetChannelAttribute("Delay", StringValue("2ms")); // 设置点对点链路的传播延迟为2ms
NetDeviceContainer devices; // 创建网络设备容器对象
devices = pointToPoint.Install(nodes); // 安装点对点链路设备到节点上,并返回设备容器对象
InternetStackHelper stack; // 创建Internet协议栈帮助器对象
stack.Install(nodes); // 将Internet协议栈安装到节点上
Ipv4AddressHelper address; // 创建IPv4地址帮助器对象
address.SetBase("10.1.1.0", "255.255.255.0"); // 设置IP地址和子网掩码
Ipv4InterfaceContainer interfaces = address.Assign(devices); // 为点对点链路分配IP地址,并返回接口容器对象
UdpEchoServerHelper echoServer(9); // 创建UDP回显服务器帮助器对象,指定端口号为9
ApplicationContainer serverApps = echoServer.Install(nodes.Get(1)); // 将服务器应用程序安装到节点n1上,并返回应用程序容器对象
serverApps.Start(Seconds(1.0)); // 设置服务器应用程序的启动时间为1秒
serverApps.Stop(Seconds(10.0)); // 设置服务器应用程序的停止时间为10秒
UdpEchoClientHelper echoClient(interfaces.GetAddress(1), 9); // 创建UDP回显客户端帮助器对象,指定目标IP地址和端口号
echoClient.SetAttribute("MaxPackets", UintegerValue(1)); // 设置客户端应用程序的最大数据包数为1
echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0))); // 设置客户端应用程序的发送间隔为1秒
echoClient.SetAttribute("PacketSize", UintegerValue(1024)); // 设置客户端应用程序的数据包大小为1024字节
ApplicationContainer clientApps = echoClient.Install(nodes.Get(0)); // 将客户端应用程序安装到节点n0上,并返回应用程序容器对象
clientApps.Start(Seconds(2.0)); // 设置客户端应用程序的启动时间为2秒
clientApps.Stop(Seconds(10.0)); // 设置客户端应用程序的停止时间为10秒
Simulator::Run(); // 运行ns-3仿真器
Simulator::Destroy(); // 销毁ns-3仿真器
return 0; // 程序正常结束,返回0
}
运行指令:
./ns3 run scratch/myfirst.cc
运行结果如下:
需要注意的是这个代码实现了客户端发送数据到服务器,然后服务器回显(发送)相同的数据到客户端的功能。这个功能的实现涉及以下几个部分的代码:
第44行创建了一个UDP回显服务器帮助器对象 UdpEchoServerHelper echoServer(9),并指定了端口号为9。这里的端口号9是用于模拟回显服务器的服务端口。
第46行通过 echoServer.Install(nodes.Get(1)) 将服务器应用程序安装到节点 n1 上,并返回应用程序容器对象 serverApps。
第47行和第48行设置了服务器应用程序的启动时间和停止时间,即在仿真开始后 1 秒启动服务器应用程序,在仿真开始后 10 秒停止服务器应用程序。
第50行创建了一个UDP回显客户端帮助器对象 UdpEchoClientHelper echoClient(interfaces.GetAddress(1), 9),并指定了目标IP地址为 interfaces.GetAddress(1)(即服务器的IP地址)和端口号为9。
第51行到第53行设置了客户端应用程序的属性,包括最大数据包数、发送间隔和数据包大小。
第55行通过 echoClient.Install(nodes.Get(0)) 将客户端应用程序安装到节点 n0 上,并返回应用程序容器对象 clientApps。
第56行和第57行设置了客户端应用程序的启动时间和停止时间,即在仿真开始后 2 秒启动客户端应用程序,在仿真开始后 10 秒停止客户端应用程序。
通过以上代码,客户端和服务器应用程序被安装到不同的节点上,客户端向服务器发送数据,服务器接收到数据后将相同的数据回显发送给客户端。这样就实现了客户端发送到服务器,然后服务器再发送信息到客户端的过程。
interfaces,nodes,echoServer,echoClient关系:
- interfaces 存储了分配给点对点链路的接口地址。
- nodes 存储了仿真中的节点。
- echoServer 是用于创建 UDP 回显服务器的帮助器对象。
- echoClient 是用于创建 UDP 回显客户端的帮助器对象。
- 这些对象在代码中的作用是不同的,但它们之间存在关联,例如,echoServer 和 echoClient 都需要节点和接口地址来进行安装和配置,通过这些关系,实现了客户端和服务器之间的通信。
PS:
-- ---- Summary of optional ns-3 features:
Build profile : default
Build directory : /home/ns-allinone-3.37/ns-3.37/build
Build version embedding : OFF (not requested)
BRITE Integration : OFF (missing dependency)
DES Metrics event collection : OFF (not requested)
DPDK NetDevice : OFF (not requested)
Emulation FdNetDevice : ON
Examples : ON
File descriptor NetDevice : ON
GNU Scientific Library (GSL) : OFF (missing dependency)
GtkConfigStore : OFF (missing dependency)
LibXml2 support : OFF (missing dependency)
MPI Support : OFF (not requested)
ns-3 Click Integration : OFF (missing dependency)
ns-3 OpenFlow Integration : OFF (missing dependency)
Netmap emulation FdNetDevice : OFF (missing dependency)
PyViz visualizer : OFF (missing dependency)
Python Bindings : OFF (not requested)
SQLite support : OFF (missing dependency)
Tap Bridge : ON
Tap FdNetDevice : ON
Tests : ON
评论区