快乐虾

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

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

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

1.1    ARP帧的格式

一个ARP帧的格式例如以下:

从网上抓一个ARP帧看看。

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

非常easy和上面的ARP帧格式相应上,只是奇怪的是以太网目的地址并非期望的广播地址??

再看看192.168.24.129的回复:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />

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    成果

再加上一些辅助的功能,我们非常easy得到了一个ARP的測试工具:

再能够研究一下ARP攻击的问题了。呵呵~~~



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

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

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在上一节中.我们仿真了一个总线型网络,这一节尝试将上一节中的n0变成一个无线的AP.再连上几个节点 ...

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

    1    安装基本模块 11  安装Python 12  安装PTVS 13  加入对python-279的支持 2    在vs2013下编译NS3 3    编译NetAnim 4    在vs2 ...

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

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 在NS3提供的第一个演示样例first.py中,模拟了一个点对点的网络,接下来的一个演示样例代码模 ...

  4. NS3网络仿真(9): 构建以太网帧

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3使用了一个叫Packet的类来表示一个数据帧,本节尝试用它构造一个以太网帧. 以下是一个典 ...

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

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 ICMP的全称是 Internet ControlMessage Protocol . 其目的就是 ...

  6. NS3网络仿真(3): NetAnim

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3提供的演示样例first.py中,并没有生成NetAnim所须要的xml文件,本节我们尝试 ...

  7. NS3网络仿真(10): 解析以太网帧

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 解析以太网帧的过程是构建以太网帧的逆过程,当我们接收到一个以太网帧时,仍然以上一节中的ARP帧为例 ...

  8. NS3网络仿真(4): DataRate属性

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在first.py中创建了一个点到点的信道,且配置了两个属性: pointToPoint = ns ...

  9. NS3网络仿真(5): 数据包分析

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在我们生成的xml文件里.是不包括生成的数据包的数据的,在我们的脚本中加入以下的语句: point ...

随机推荐

  1. svg优雅降级技术

    这是一个名叫Alexey Ten首先提出来的,类似下面的代码: <svg width="96" height="96"> <image xli ...

  2. 关于oracle 11g导出的dmp文件无法导入10g的问题

    今天遇到一个问题,由于无法远程11g是数据库服务器,只能用exp命令导出了一张表的dmp文件:在本地导入时遇到如下错误: IMP-00010: 不是有效的导出文件, 头部验证失败IMP-00000: ...

  3. 方格取数(hdu 1565)

    Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数 ...

  4. jquery插件的基本写法

    (function($){ var a={name:'2222',age:5555} var b={sex:'男',grade:5555} var c=$.extend({},a,b);//合并到新的 ...

  5. 标准C程序设计七---65

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  6. Select函数实现

    int select(int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict errorfds, ...

  7. linux命令——ll详解

    一.ll命令 ll并不是linux下一个基本的命令,它实际上是ls -l的一个别名. Ubuntu默认不支持命令ll,必须用 ls -l,这样使用起来不是很方便. 如果要使用此命令,可以作如下修改:打 ...

  8. js-页面进入时同时实现-图片预加载

    下面的是我认为最简单的预加载图片里!在页面进入时就开始加载 var imgARR = ['images/xmImg1.png','images/xmImg2.png','images/xmImg3.p ...

  9. 关于udo3d双目相机的嵌入式板子系统重装

    遇到的问题: 1.下载压缩文件(.rar):在linux下下载一会就会停止 原因:linux下不支持.rar文件的下载,在windows下载即可 2.在windows下解压文件,结果为镜像文件(.im ...

  10. [Bzoj5358][Lydsy1805月赛]口算训练(预处理+动态开点线段树)

    5358: [Lydsy1805月赛]口算训练 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 318  Solved: 105[Submit][Stat ...