NS3网络仿真(8): 实时仿真

快乐虾

http://blog.csdn.net/lights_joy/

欢迎转载,但请保留作者信息

NS3支持实时仿真,且可以将NS3模拟生成的数据包通过主机上真实的网卡发送出去,本节尝试运行NS3中自带的fd-emu-ping示例,使用NS3模拟一台设备,再通过主机上的网口ping一台网络上的真实设备。

// Allow ns-3 to ping a real host somewhere, using emulation mode
//
//   +----------------------+
//   |          host        |
//   +----------------------+
//   |    ns-3 simulation   |
//   +----------------------+
//   |      ns-3 Node       |
//   |  +----------------+  |
//   |  |    ns-3 TCP    |  |
//   |  +----------------+  |
//   |  |    ns-3 IPv4   |  |
//   |  +----------------+  |
//   |  |   FdNetDevice  |  |
//   |--+----------------+--+
//   |       | eth0 |       |
//   |       +------+       |
//   |          |           |
//   +----------|-----------+
//              |
//              |         +---------+
//              .---------| GW host |--- (Internet) -----
//                        +---------+

这个模型很清楚地表达了NS3实现这个功能的层次结构。

NS3最后的实际收发包操作是由FdNetDevice这个类来完成的,其实现方式为raw socket,但在windows下,raw socket只支持ip层以上的包收发,而不支持mac层数据的收发,因此NS3的代码无法直接在windows下使用。

观察FdNetDevice完成的操作可以发现,它只需要将NS3生成的包发送出去,再将收到的包通过下面的函数扔给NS3就可以了:

FdNetDevice::ReceiveCallback (uint8_t*buf, size_t len)

因此我们引入winpcap库完成收发包的操作,放弃rawsocket方式。

首先在StartDevice时创建winpcap的接收线程:

void
FdNetDevice::StartDevice (void)
{
......

  if (m_fd < 1000)
  {
	  m_fdReader = Create<FdNetDeviceFdReader>();
	  // 22 bytes covers 14 bytes Ethernet header with possible 8 bytes LLC/SNAP
	  m_fdReader->SetBufferSize(m_mtu + 22);
	  m_fdReader->Start(m_fd, MakeCallback(&FdNetDevice::ReceiveCallback, this));
  }
  else
  {
	  // use pcap
	  pcap_t* ph = (pcap_t*)m_fd;
	  m_hPcapThread = CreateThread(NULL, 65536, PcapThread, this, 0, NULL);
  }

}
在此接收线程中循环调用pcap的接收函数:
DWORD WINAPI FdNetDevice::PcapThread(_In_  LPVOID lpParameter)
{
	FdNetDevice* pDev = (FdNetDevice*)lpParameter;
	pDev->m_bPcapRun = true;
	pcap_t* pc = (pcap_t*)pDev->m_fd;
	while (pDev->m_bPcapRun)
	{
		pcap_dispatch(pc, 1, (pcap_handler)packet_handler, (u_char*)pDev);
	}
	return 0;
}

然后在收到数据包后调用ReceiveCallback就可以了:
/* Callback function invoked by libpcap for every incoming packet */
void FdNetDevice::packet_handler(void *_param, const void *_header, const void *_pkt_data)
{
	const struct pcap_pkthdr *header = (const struct pcap_pkthdr *)_header;
	FdNetDevice* dev = (FdNetDevice*)_param;
	uint8_t* pkt = (uint8_t*)malloc(header->len);
	memcpy(pkt, _pkt_data, header->len);
	dev->ReceiveCallback(pkt, header->len);

}

当有数据包需要发送的时候,相应地改用pcap发送:
bool
FdNetDevice::SendFrom (Ptr<Packet> packet, const Address& src, const Address& dest, uint16_t protocolNumber)
{
.....

  size_t written = 0;
  if (m_fd < 1000)
	written = cyg_write(m_fd, buffer, len);
  else
  {
	  pcap_t* ph = (pcap_t*)m_fd;
	  pcap_sendpacket(ph, buffer, len);
	  written = len;
  }
......

  return true;
}

貌似很简单的样子。

当我们在Linux下运行此示例时使用的是eth0这样的网络名称,在windows下我们需要使用一长串的名称,不过这个名称很容易用winpcap获取:

再修改一下目标机的IP,运行示例:

轻松搞定!!!

??

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-07 18:47:14

NS3网络仿真(8): 实时仿真的相关文章

NS3网络仿真(13): FdNetDevice的问题

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在前面的小节中,我们使用FdNetDevice进行了实时仿真,利用NS3向一台实际的机器发送ping包,但得到的结果显然有点偏离我们的预期结果,因为ping包的响应时间明显长于正常情况下的响应时间. 这个是用NS3发送ping包的结果: 使用WireShark在NS3使用的适配器上抓包,这个是在物理网卡上抓到的包: 显然对端的响应是没有问题的,莫非问题出现在winpcap的发送上?刚好学习ICM

Ns3网络仿真软件简单介绍

Ns3网络仿真软件简单介绍 1. 什么是NS-3? NS是一个开源离散事件驱动网络模拟器.官方定义:(fromhttp://www.nsnam.org/) ns-3 is a discrete-event network simulatorfor Internet systems, targeted primarily for research and educational use. ns-3is free software, licensed under the GNU GPLv2 lice

NS3网络仿真(2):first.py

1    安装基本模块 11  安装Python 12  安装PTVS 13  添加对python-279的支持 2    在vs2013下编译NS3 3    编译NetAnim 4    在vs2013下使用ns 快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 学习一下ns中的第一个示例脚本,first.py,这个示例模拟一个Echo服务和客户端之间的通信. 1.1    导入所需要的库 ns3的每一个模块都有一个对应的用C++开发的dl

NS3网络仿真(7): Wifi节点

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在上一节中,我们仿真了一个总线型网络,这一节尝试将上一节中的n0变成一个无线的AP,再连上几个节点.这也是NS3中的示例third.cc干的事情,只是我们用Python实现. // Default Network Topology // // Wifi 10.1.3.0 // AP // * * * * // | | | | 10.1.1.0 // n5 n6 n7 n0 -----------

NS3网络仿真(6): 总线型网络

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3提供的第一个示例first.py中,模拟了一个点对点的网络,接下来的一个示例代码模拟了一个总线型网络及CSMA协议. # // Default Network Topology # // # // 10.1.1.0 # // n0 -------------- n1 n2 n3 n4 # // point-to-point | | | | # // ================ #

NS3网络仿真(14): TCP连接与端口扫描

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 本节学习一下使用NS3构造一个TCP包,再利用构造好的TCP包进行最简单的TCP端口扫描. 1.    TCP协议数据报头 下图中给出了TCP协议数据报头的格式. 源端口.目的端口:16位长.标识出远端和本地的端口号. 顺序号:32位长.表明了发送的数据报的顺序. 确认号:32位长.希望收到的下一个数据报的序列号. TCP协议数据报头DE 头长:4位长.表明TCP头中包含多少个32位字. 接下来

NS3网络仿真(3): NetAnim

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3提供的示例first.py中,并没有生成NetAnim所需要的xml文件,本节我们尝试用NetAnim来展示first.py的仿真结果. 依照NetAnim的说明,在Run开始前加上一行: anim = ns.netanim.AnimationInterface('first.xml') ns.core.Simulator.Run() ns.core.Simulator.Destroy(

NS3网络仿真(1):开发环境搭建

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 1.1    安装基本模块 1.1.1  安装Python 出于对兼容性的考虑,在此选择python-2.7.9,win32版本,而不是最新的3.x版本. 安装目录为c:\python27 这个就没什么可说的了. 1.1.2  安装PTVS PTVS是ms提供的一个python插件,我用的是2.2,安装完成后可以在VS2013的扩展与更新中看到它: 1.1.3  添加对python-2.7.9的

NS3网络仿真(12): ICMPv4协议

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 ICMP的全称是 Internet ControlMessage Protocol .其目的就是让我们能够检测网络的连通状况.ICMP主要是透过不同的类别(Type)与代码(Code) 让机器来识别不同的连接状况.本节利用NS3学习一下此协议. 1.1    报文格式 ICMP的报文格式如下: 即ICMP报文是IP报文的数据,而IPv4报文的格式如下: 在网上抓一个ping包来看看: 这是一个从