首页 > 其他分享 >【NS3】三、拓扑搭建过程

【NS3】三、拓扑搭建过程

时间:2024-10-16 20:20:14浏览次数:9  
标签:socket 对象 创建 拓扑 CreateSocket NS3 UdpSocketFactory Ptr 搭建

文章目录

1.创建节点:NodeContainer

创建两个 ns-3 节点 对象,代表仿真中的计算机

NodeContainer nodes;
//创建n个 ns-3 节点 对象,代表仿真中的计算机
nodes.Create (uint n);
nodes.add(Node xx / NodeContainer xx);
NodeContainer.Get(uint n);

2.建立物理层PointToPointHelper

自底向上创建 —— 先建立物理层

构建一个点到点的连接。使用PointToPointHelper来配置和连接ns-3的PointToPointNetDevice和PointToPointChannel对象。

//初始化
PointToPointHelper p2p;
//设置信道时延和速率
pointToPoint.SetDeviceAttribute ("DataRate", StringValue ("5Mbps"));
pointToPoint.SetChannelAttribute ("Delay", StringValue ("2ms"));
//Helper类的install操作都是连接两个层 , 然后会生成接口
//这里install生成netDevice,channel以2ms和5Mbps的速率传输数据连接物理层和链路层
NetDeviceContainer device = p2p.install(node1,node2);

3.网络层和传输层:InternetStackHelper

InternetStackHelper stack;
#a 创建了Ipv4L4Protocol的两个子类(UdpL4Protocol和TCpL4Protocol)和Ipv4L3Protoco(Ipv4L3Protocol和Ipv6L3Protocol)
stack.install( NodeContainer or Node );

传输层和网络层的连接比较复杂,隐含在install()里面了 ,但是此时网络层和链路层并没有连接起来,还需要IpInterface与device进行绑定
#a Ipv4AddressHelper生成ip
Ipv4AddressHelper address;
address.SetBase (“10.1.1.0”, “255.255.255.0”);
#a 分配ip给devices会返回IpInterface 【ip是存储在interface的聚合数组里面(netDevice自己本身不存储信息),所以要网卡的ip得用interafce::GetAddress( int order) 】
Ipv4InterfaceContainer p2pInterfaces = address.Assign (p2pDevices);

再上面就是应用层了
如果不创建app,直接创建socket也可以。以udpsocket的创建过程为例子,这部分参考这个
先查看Socket::CreateSocket方法的代码:
Ptr
Socket::CreateSocket (Ptr node, TypeId tid)
{
NS_LOG_FUNCTION (node << tid);
Ptr s;
NS_ASSERT (node != 0);
Ptr socketFactory = node->GetObject (tid);
NS_ASSERT (socketFactory != 0);
s = socketFactory->CreateSocket ();
NS_ASSERT (s != 0);
return s;
}

从上面的代码可以看出,以UdpSocketFactory的TypeId创建一个UdpSocketFactory对象,然后利用UdpSocketFactory对象的CreateSocket ()方法创建一个Socket对象。

但是,我们看UdpSocketFactory的源代码,发现:

namespace ns3 {

NS_OBJECT_ENSURE_REGISTERED (UdpSocketFactory);

TypeId UdpSocketFactory::GetTypeId (void)
{
  static TypeId tid = TypeId ("ns3::UdpSocketFactory")
    .SetParent<SocketFactory> ()
    .SetGroupName ("Internet")
  ;
  return tid;
}

}

UdpSocketFactory非常简单,并且是一个包含虚函数,不能创建对象。

此时就需要回到Socket::CreateSocket方法的代码:

Ptr socketFactory = node->GetObject (tid);
1
这一行代码返回的对象socketFactory 对象不是UdpSocketFactory对象,应该是它的子类对象或者父类对象,但是编程思想上看,父类对象基本不可能。只能是其子类对象。
UdpSocketFactory类的子类只有一个:UdpSocketFactoryImpl。【必定只有一个子类或者说只有一个子类对象 不然这么写的话 程序就分不清返回哪个子类对象了不是】

此时再看UdpSocketFactoryImpl的CreateSocket()方法:

Ptr
UdpSocketFactoryImpl::CreateSocket (void)
{
NS_LOG_FUNCTION_NOARGS();
return m_udp->CreateSocket ();
}
1
2
3
4
5
6
其中的m_udp对象是Ptr,再看UdpL4Protocol的CreateSocket ():

Ptr
UdpL4Protocol::CreateSocket (void)
{
NS_LOG_FUNCTION_NOARGS ();
Ptr socket = CreateObject ();
socket->SetNode (m_node);
socket->SetUdp (this);
m_sockets.push_back (socket);
return socket;
}

看到这个代码就知道了,UdpSocketFactory的实现类UdpSocketFactoryImpl利用UdpL4Protocol对象来创建Socket对象。而UdpL4Protocol对象的CreateSocket 方法通过创建UdpSocket的实现类UdpSocketImpl来创建socket,并返回。

也就是说,最终创建的socket对象是UdpSocketImpl类型的。

参考连接
https://blog.csdn.net/Hesy_H/article/details/95179160

标签:socket,对象,创建,拓扑,CreateSocket,NS3,UdpSocketFactory,Ptr,搭建
From: https://blog.csdn.net/Aimonii/article/details/142957145

相关文章

  • 【NS3】二、关键概念
    https://www.nsnam.org/docs/文章目录Node(节点):NetDevice(网络设备):Channel(信道):Application(应用程序):Helper类:Routing(路由):FlowMonitor(流量监测器):Node(节点):含义:基本计算设备被抽象为节点。作用:节点可以添加应用程序、协议栈、外围卡及其驱动程序(通常称为网卡),并用于构建模......
  • 【朝花夕拾】免费个人网页搭建:免费托管、CDN加速、个人域名、现代化网页模板一网打尽
    现代化网页设计的免费宝藏:GitHubPages+CodePen+Cloudflare+US.KG前言在当今数字化时代,个人和企业越来越重视在线形象的建立。GitHubPages提供了一个免费且便捷的平台,允许用户托管静态网站。然而,GitHubPages默认的域名可能不够个性化,因此,许多用户希望将自定义域名绑定......
  • 从0到1搭建DeltaLake大数据平台
    1.下载VMWare,安装CentOS9虚拟机2.配置用户,创建目录1.以管理员身份登录,创建Spark用户给Spark使用sudoaddusersparkuser2.修改新用户密码(123456)sudopasswdsparkuser3.给新用户SparkuserSudo权限切换到Root:su-给sparkuser权限:sp......
  • rust学习一、入门之搭建简单开发环境
    最近希望学习一些新的,选择了rust.本篇介绍怎么搭建一个非常简单的windows开发环境,以及如何使用cargo命令1、搭建开发环境(windows11)a.登录官网https://www.rust-lang.org/tools一看就明白,此处略。b.安装rustup一看就明白,此处略。c.安装cargoscriptcargoinstallcargo......
  • pikachu靶场搭建
    写在前面“如果你想搞懂一个漏洞,比较好的方法是:你可以自己先制造出这个漏洞(用代码编写),然后再利用它,最后再修复它”。Pikachu是一个带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞。如果你是一个Web渗透测试学习人员且正发愁没有合适的靶场进行练习,那么Pikachu可能正合你......
  • vite+ts搭建的项目,@配置失效的解决办法
    今天创建新项目,按照往常的管理去配置@别名安装依赖:因为path是node中的模块,node又不支持ts,所以:yarnadd@types/node或者npmi@types/node然后进vite.config.ts,添加添加@别名resolve:{alias:{'@':resolve(__dirname,'src')}}其实到这里,就可以......
  • OS-Nachos实验环境的搭建
    实验目的:按照实验教程在本地虚拟机搭建Nachos开发环境;安装docker,下载镜像搭建基于docker的Nachos开发环境;使用./nachos–u学习nachos的用法,并对相关命令选项进行尝试;使用nachos–x选项加载test目录下编译为noff格式的用户程序运行,思考nachos执行结果错误的原因;使用gdb......
  • 【AIGC】AI Agent 和 AI Workflow 的区别,Agent搭建
    Agent详解引言AIAgent和AIWorkflow的区别1.定义与功能2.自主性与灵活性3.应用场景AIWorkflowAIAgent详解基本特征分类应用场景dify搭建简单的agent结语引言随着AI的不断进步,我们见证了多种不同类型的AI概念的出现。其中,AIAgent和AIWorkflow是两个经常......
  • Linux环境搭建vsftpd服务
    vsftpd(verysecureFTPdaemon)是一个广泛使用的、开源的FTP服务器软件,以其高性能、高安全性和稳定性著称,支持多种FTP相关协议,包括FTP、SFTP(通过SSH)、TLS/SSL加密的FTP等。一:安装vsftpd#安装vsftpd服务yuminstallvsftpd-y#启动FTP服务,并设置开机自启动systemctlenablev......
  • 基于cloudreve(Docker应用)搭建网盘服务,用于目录的分享和在线预览。
    文章目录I基于cloudreve(Docker应用)搭建网盘服务安装主要功能设置角色最大容量II知识扩展:网盘类的文件预览需求背景:iOS可以直接预览PDF等常见格式文件,但是Android浏览器需要先下载文件,才能查看文件内容,因此需要搭建支持目录的分享和在线预览的Min......