NS3网络仿真(11): ARP

快乐虾

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

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

ARP(Address ResolutionProtocol,地址解析协议)协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的进行。本节借助NS3学习一下此协议。

1.1    ARP帧的格式

一个ARP帧的格式如下:

从网上抓一个ARP帧看看。

这是一个从192.168.24.1发送出来的arp请求帧:

很容易和上面的ARP帧格式对应上,不过奇怪的是以太网目的地址并不是期望的广播地址??

再看看192.168.24.129的回复:

1.2    用NS3生成ARP请求包

接下来尝试用NS3生成ARP请求包:

		Ptr<Packet> pkt = ns3::Create<Packet>();

		// 添加ARP头
		ArpHeader ah;
		ah.SetRequest(
			ns3::Mac48Address((const char*)src_mac),
			(const char*)src_ip,
			ns3::Mac48Address((const char*)dest_mac),
			(const char*)dest_ip);
		pkt->AddHeader(ah);

		// 添加以太网头
		EthernetHeader eh;
		eh.SetDestination("ff:ff:ff:ff:ff:ff");
		eh.SetSource((const char*)sa);
		eh.SetLengthType(ns3::ArpL3Protocol::PROT_NUMBER);
		pkt->AddHeader(eh);

		int len;
		len = pkt->CopyData(buffer, 2048);
		pktheader.caplen = len;
		pktheader.len = len;
		pktheader.ts.tv_sec = (m_nInterval * i) / 1000;
		pktheader.ts.tv_usec = ((m_nInterval * i) % 1000) * 1000;

		len = pcap_sendqueue_queue(m_pSendQueue, &pktheader, buffer);
		if (len == -1)
		{
			AfxMessageBox(L"无法发送所有的数据包!");
			break;
		}

上面的代码将生成一个NS3下的Packet并将之添加到winpcap的发送队列中,在准备好批量查询的ARP包后就可以使用winpcap一次性将所有包发送出去:

len= pcap_sendqueue_transmit(m_hSendHandle,m_pSendQueue,m_nInterval);


1.3    用NS3分析ARP回包

在发送完ARP请求包后,需要处理ARP回包,我们使用winpcap直接抓取网口上的包进行分析,当winpcap收到包后将调用我们的回调函数:

/* Callback function invoked by libpcap for every incoming packet */
void CCommonArpSendDlg::packet_handler(void *_param, const void *_header, const void *_pkt_data)
{
	uint8_t buffer[2048], *p;
	p = (uint8_t *)_pkt_data + 12;
	if (p[0] != 8 || p[1] != 6)
		return;

	// arp
	const struct pcap_pkthdr *header = (const struct pcap_pkthdr *)_header;
	CCommonArpSendDlg* dlg = (CCommonArpSendDlg*)_param;

	Ptr<Packet> pkt = ns3::Create<Packet>((uint8_t*)_pkt_data, header->len);
	EthernetHeader eh;
	ArpHeader ah;
	pkt->RemoveHeader(eh);
	pkt->RemoveHeader(ah);

	if (!ah.IsReply())
		return;

	uint32_t nip = ah.GetSourceIpv4Address().Get();
	CString ip;
	ip.Format(L"%d.%d.%d.%d", (nip >> 24) & 0xff, (nip >> 16) & 0xff, (nip >> 8) & 0xff, nip & 0xff);
	ah.GetSourceHardwareAddress().CopyTo(buffer);
	mac.Format(L"%02x:%02x:%02x:%02x:%02x:%02x", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5]);
.......
}

1.4    成果

再加上一些辅助的功能,我们很容易得到了一个ARP的测试工具:

再可以研究一下ARP攻击的问题了,呵呵~~~

??

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

时间: 2024-10-12 10:54:27

NS3网络仿真(11): ARP的相关文章

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网络仿真(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 // // +----------------------

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网络仿真(9): 构建以太网帧

快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3使用了一个叫Packet的类来表示一个数据帧,本节尝试用它构造一个以太网帧. 以下是一个典型的ARP请求帧: 我们就用Packet来创建一个同样的帧. 首先创建一个空的数据包: Ptr<Packet>pkt = Create<Packet>(); 接下来加上ARP头: //加入arp头 ArpHeader ah; ah.SetRequest(Mac48Address(&qu

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网络仿真(13): FdNetDevice的问题

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

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

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

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(