NS3网络仿真(11): ARP

快乐虾

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

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


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


1.1    ARP帧的格式


一个ARP帧的格式如下:

NS3网络仿真(11): ARP_第1张图片


从网上抓一个ARP帧看看。


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

NS3网络仿真(11): ARP_第2张图片


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


再看看192.168.24.129的回复:

NS3网络仿真(11): ARP_第3张图片


1.2    NS3生成ARP请求包


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


		Ptr pkt = ns3::Create();

		// 添加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 pkt = ns3::Create((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的测试工具:

NS3网络仿真(11): ARP_第4张图片

 

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











你可能感兴趣的:(通信仿真)