基于ARP协议获取局域网活动主机的物理地址(MAC地址)
- 格式:doc
- 大小:105.00 KB
- 文档页数:9
介绍ARP协议的定义和目的ARP(Address Resolution Protocol)是一种网络协议,用于将IP地址映射到物理硬件地址(MAC地址)。
它的主要目的是在局域网中解析目标设备的IP地址,以便能够正确地发送数据包。
定义ARP协议是一种在以太网或其他局域网中使用的协议,用于确定目标设备的MAC地址。
它通过发送ARP请求广播来查询目标设备的MAC地址,并通过ARP响应获得相应的映射关系。
目的ARP协议的目的是建立IP地址和MAC地址之间的映射关系,以便实现在局域网上的数据传输。
通过将IP地址解析为对应的MAC地址,ARP协议使得数据包能够准确地被发送到目标设备。
主要目标包括:1.地址解析:ARP协议通过查询目标设备的MAC地址,实现IP地址到MAC地址的解析,确保数据包被正确路由和传递。
2.局域网通信:在局域网中,设备之间通常使用MAC地址进行通信。
ARP协议使得设备能够通过IP地址找到对应的MAC地址,从而在局域网内进行数据传输。
3.缓存管理:ARP协议维护一个本地的ARP缓存表,记录IP地址和MAC地址的映射关系。
这样,在后续的通信中,可以直接使用缓存中的映射关系,提高数据传输的效率。
总之,ARP协议的定义和目的是为了解决IP地址和MAC地址之间的映射关系,以支持在局域网上的有效数据传输。
解释ARP协议的工作原理和过程ARP协议(Address Resolution Protocol)是一种用于解析IP地址和MAC地址之间映射关系的协议。
它的工作原理可以简单地描述为以下几个步骤:1.发送ARP请求广播:当一个设备需要发送数据包到目标设备时,它首先检查本地的ARP缓存表,查看是否有目标IP地址对应的MAC地址。
如果没有找到对应的MAC地址,它将发送一个ARP请求广播到局域网上的所有设备。
2.目标设备响应ARP请求:局域网上的其他设备接收到ARP请求广播后,会检查是否是自己的IP地址与之匹配。
mac地址扫描实验网络攻防对抗大实验答辩报告实验名称:ARP协议获取局域网主机mac地址实验类型:验证型实验指导老师:专业班级:姓名:学号:电子邮件:实验地点:实验日期:年月日实验成绩:一、背景知识在TCP/IP网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址。
为了让报文在物理网路上传送,必须知道对方目的主机的物理地址。
这样就存在把IP地址变换成物理地址的地址转换问题。
以以太网环境为例,为了正确地向目的主机传送报文,必须把目的主机的32位IP地址转换成为48位以太网的地址。
这就需要在互连层有一组服务将IP地址转换为相应物理地址,这组协议就是ARP协议。
1、ARP协议的工作原理在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP 地址与MAC地址是一一对应的,如附表所示。
我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。
当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP 地址。
如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.1.1的MAC地址是什么?”网络上其他主机并不响应ARP 询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“192.168.1.1的MAC地址是00-aa-00-62-c6-09”。
这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。
同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。
ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。
使⽤ARP获取局域⽹内设备IP和MAC地址根据Arp列表数据,查询本地设备在线状态使⽤ arp -a 获得所有内⽹地址,⾸先看Mod对象public struct MacIpPair{public string HostName;public string MacAddress;public string IpAddress;public override string ToString(){string str = "";str += $"HostName:{HostName}\t{IpAddress}\t{MacAddress}";return str;}}其次看看查询⽅法:public List<MacIpPair> GetAllMacAddressesAndIppairs(){List<MacIpPair> mip = new List<MacIpPair>();System.Diagnostics.Process pProcess = new System.Diagnostics.Process();pProcess.StartInfo.FileName = "arp";pProcess.StartInfo.Arguments = "-a ";eShellExecute = false;pProcess.StartInfo.RedirectStandardOutput = true;pProcess.StartInfo.CreateNoWindow = true;pProcess.Start();string cmdOutput = pProcess.StandardOutput.ReadToEnd();string pattern = @"(?<ip>([0-9]{1,3}\.?){4})\s*(?<mac>([a-f0-9]{2}-?){6})";foreach (Match m in Regex.Matches(cmdOutput, pattern, RegexOptions.IgnoreCase)){mip.Add(new MacIpPair(){MacAddress = m.Groups["mac"].Value,IpAddress = m.Groups["ip"].Value});}return mip;}在写个调⽤就可以了:class Program{static void Main(string[] args){var arp = new Comm.ArpHelper();var i = arp.GetLocalIpInfo();Console.WriteLine(i.ToString());var l = arp.GetAllMacAddressesAndIppairs();l.ForEach(x =>{//Console.WriteLine($"IP:{x.IpAddress} Mac:{x.MacAddress}");Console.WriteLine(x.ToString());});Console.WriteLine("\r\n==================================================\r\n");Console.WriteLine("本地⽹卡信息:");Console.WriteLine(arp.GetLocalIpInfo() + " == " + arp.getLocalMac());string ip = "192.168.68.42";Console.Write("\n\r远程 " + ip + " 主机名信息:");var hName = arp.GetRemoteHostName(ip);Console.WriteLine(hName);Console.WriteLine("\n\r远程主机 " + hName + " ⽹卡信息:");string[] temp = arp.getRemoteIP(hName);for (int j = 0; j < temp.Length; j++){Console.WriteLine("远程IP信息:" + temp[j]);}Console.WriteLine("\n\r远程主机MAC :");Console.WriteLine(arp.getRemoteMac("192.168.68.21", "192.168.68.255"));Console.WriteLine(arp.getRemoteMac("192.168.68.21", "192.168.68.44"));Console.ReadKey();}}=====================================================================c# 通过发送arp包获取ip等信息利⽤dns类和WMI规范获取IP及MAC地址在C#编程中,要获取主机名和主机IP地址,是⽐较容易的.它提供的Dns类,可以轻松的取得主机名和IP地址.⽰例:string strHostName = Dns.GetHostName(); //得到本机的主机名IPHostEntry ipEntry = Dns.GetHostByName(strHostName); //取得本机IPstring strAddr = ipEntry.AddressList[0].ToString(); //假设本地主机为单⽹卡在这段代码中使⽤了两个类,⼀个是Dns类,另⼀个为IPHostEntry类,⼆者都存在于命名空间中.Dns类主要是从域名系统(DNS)中检索关于特定主机的信息,上⾯的代码第⼀⾏就从本地的DNS中检索出本地主机名.IPHostEntry类则将⼀个域名系统或主机名与⼀组IP地址相关联,它与DNS类⼀起使⽤,⽤于获取主机的IP地址组.要获取远程主机的IP地址,其⽅法也是⼤同⼩异.在获取了IP地址后,如果还需要取得⽹卡的MAC地址,就需要进⼀步探究了.这⾥⼜分两种情况,⼀是本机MAC地址,⼆是远程主机MAC地址.⼆者的获取是完全不同的.在获取本机的MAC地址时,可以使⽤WMI规范,通过SELECT语句提取MAC地址.在.NET框架中,WMI规范的实现定义在System.Management命名空间中.ManagementObjectSearcher类⽤于根据指定的查询检索管理对象的集合ManagementObjectCollection类为管理对象的集合,下例中由检索对象返回管理对象集合赋值给它.⽰例:ManagementObjectSearcher query =new ManagementObjectSearcher("SELECT * FROM Win32_NetworkAdapterConfiguration") ; ManagementObjectCollection queryCollection = query.Get();foreach( ManagementObject mo in queryCollection ){if(mo["IPEnabled"].ToString() == "True")mac = mo["MacAddress"].ToString();}获取远程主机的MAC地址时,需要借⽤API函数SendARP.该函数使⽤ARP协议,向⽬的主机发送ARP包,利⽤返回并存储在⾼速缓存中的IP和MAC地址对,从⽽获取远程主机的MAC地址.⽰例:Int32 ldest= inet_addr(remoteIP); //⽬的ipInt32 lhost= inet_addr(localIP); //本地iptry{Int64 macinfo = new Int64();Int32 len = 6;int res = SendARP(ldest,0, ref macinfo, ref len); //发送ARP包return Convert.ToString(macinfo,16);}catch(Exception err){Console.WriteLine("Error:{0}",err.Message);}return 0.ToString();但使⽤该⽅式获取MAC时有⼀个很⼤的限制,就是只能获取同⽹段的远程主机MAC地址.因为在标准⽹络协议下,ARP包是不能跨⽹段传输的,故想通过ARP协议是⽆法查询跨⽹段设备MAC地址的。
实验2 基于ARP协议获取局域网活动主机的物理地址(MAC地址)实验目的1、掌握ARP协议分组结构与协议运作过程;2、了解ARP协议获取活动主机MAC地址的方法与软件实现;实验原理实验环境(设备)windows XPVisual Studio 2008实验内容【实验方案设计】(1)掌握ARP协议分组结构与协议运作过程;(2)了解ARP协议获取活动主机MAC地址的方法与软件实现;(3)在windows平台上构造自定义数据帧,并通过指定网络适配器(网卡)发送的基本方法。
【实验过程】(实验步骤、记录、数据、分析)(1)掌握ARP协议分组结构与协议运作过程;什么是ARP? ARP (Address Resolution Protocol) 是个地址解析协议。
最直白的说法是:在IP以太网中,当一个上层协议要发包时,有了该节点的IP 地址,ARP就能提供该节点的MAC地址。
在实际的应用中,我们经常会遇到这样的问题:已经知道一个机器的IP地址,需要找出其相应的物理地址,ARP地址解析协议就是用来解决这个问题的。
ARP协议的工作原理:1)在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。
2)在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。
所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
3) ARP协议的基本功能就是通过目标设备的IP地址,查询目标主机的MAC 地址,以保证通信的顺利进行。
(2)了解ARP协议获取活动主机MAC地址的方法与软件实现1、ARP协议获取活动主机的MAC地址:每个主机都设有一个ARP高速缓存,里面有本局域网上各主机和路由器的IP地址到硬件地址的映射表。
当某主机要向该局域网的另一个主机发送信息时,先在其ARP高速缓存中查看有无该地址,如果有就查出其对应的硬件地址,写入MAC帧,然后把该帧发往目的地址。
如果ARP高速缓存中没有该地址,则源主机自动运行ARP,其运作过程如下:(1) ARP进程在本局域网上广播发送ARP请求,把自己的ARP地址到硬件地址的映射写入ARP请求中。
基于地址解析协议(ARP)的局域网访问控制方案摘要:随着网络安全技术的发展,网络安全措施越来越受到关注,当前来看,防火墙、VPN、信息加密等安全产品渐渐占据了市场,并且在学术界和商业界都得到了广泛的运用。
而作为网络中的ARP协议机制,在网络运用中,运用ARP协议机制杜绝非法访问,保护局域网的信息安全成为了十分重要的环节。
本文针对当前网络ARP的具体情况,探讨了在局域网中如何基于ARP协议及时发现内部网络访问中所出现的非法主机并对其网络访,控制信息安全的措施。
关键词:地址解析协议信息安全访问控制计算机网络安全是国家和单位信息安全的重要组成部分,也是国家和单位进行信息化建设与发展的关键,如今,随着内部网络的应用对于工作效率的提高,网络主机的访问控制也日益成为人们关注的焦点。
网络技术的发展与应用的普及,搭建内部网络以高效地完成日常工作成为大多数单位的主要网络运用手段。
1 基于地址解析协议(ARP)的高速缓存表1.1 ARP协议Address Resolution Protocol协议又称地址解析协议,它负责通知电脑要连接目标的MAC地址,以保证通信的顺利进行。
在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。
在以太网中的数据帧从一个主机到达网内的另一台主机是根据48位的以太网地址,从而根据这些来确定其接口。
在以太网络中,一个主机要和另一个主机进行直接通信,必须要通过ARP协议来获取目标设备的IP 地址,查询目标设备的MAC地址。
所以,ARP在局域网络中起着保证网络通信的顺利进行的功能。
1.2 ARP工作原理ARP的工作原理就是电脑上安装的ARP缓存表。
每一台安装TCP/IP协议电脑里面都会有ARP缓存表,当以太电脑发送数据的时候,另一台主机就会根据这个缓存表,寻找这台电脑的IP地址,一旦找到以后,就会将这台电脑的地址入帧里面发送。
这就有效的对各个信息的来往有了有据可查,如果在传输的过程中被ARP病毒攻击,服务器也会做出反应,从而快速做出防患措施。
课程设计课程名称计算机网络_题目名称______________________学生学院_____计算机学院_______专业班级____学号学生姓名指导教师___ _ _ _ _ 2013 年 1 月11 日计算机网络课程设计一、设计题目使用ARP协议获取局域网内部活动主机物理地址的程序实现(C++)二、已知技术参数和设计要求1.已知参数:选择适当的网络适配器,以绑定Winpcap。
2.设计要求:2.1协议实现需要哪些数据帧?注意要数据帧的定义要符合公共标准。
2.2如何实现实现数据帧的发送?2.3如何接收及解析目的主机的响应数据帧?2.4如何显示ARP协议的执行结果?3. C++环境为Visual C++三、设计内容与步骤1.熟悉ARP协议的工作原理;2.熟悉ARP协议相关数据帧结构;3.构造ARP请求数据帧;4.使用Winpcap相关函数实现数据帧的发送;5.接收及解析目的主机的响应数据帧;6.获得IP地址与MAC地址的对应关系并显示;7.课程设计任务说明书。
四、课程设计中涉及的网络基本理论简介:(1) 在网际协议中定义的是因特网的IP地址,但在实际进行通信时,物理层不能识别IP地址只能识别物理地址。
因此,需在IP地址与物理地址之间建立映射关系,地址之间的这种映射称为地址解析。
(2) 以太网网络中的物理地址即网卡的序列号。
IEEE规定网卡序列号为6个字节(48位),前三个字节为厂商代号,由于厂商向IEEE注册登记申请,后3个字节为网卡的流水号。
(3) 地址解析包括从IP地址到物理地址的映射和从物理地址到IP地址的映射。
TCP/IP协议组提供了两个映射协议:地址解析协议ARP和逆向地址解析协议RARP。
ARP用于从IP 地址到物理地址的映射,RARP用于从物理地址到IP地址的映射。
(4) 地址解析协议的ARP的工作原理:假定在一个物理网络上,A(源主机)要与D(目的主机)进行通信,但是不知道D的物理地址。
基于ARP协议获取局域网活动主机的物理地址ARP(Address Resolution Protocol,地址解析协议)是一种用于在IPv4网络中将IP地址转换为MAC地址的协议。
它用于将网络层的逻辑地址解析为数据链路层的物理地址,在局域网中提供转发数据的便利性。
ARP协议的操作包括ARP请求和ARP响应两个步骤。
当主机A需要发送数据包到目标主机B时,首先检查ARP缓存表,查找目标主机B的IP地址对应的MAC地址是否已经存在于ARP缓存中。
如果不存在,则主机A会发送一个ARP请求广播消息到局域网上的所有主机,请求一些主机告知目标IP地址的MAC地址。
同一局域网上的所有主机都会接收到这个ARP请求,但只有目标主机B会响应ARP请求并告知其MAC地址给主机A。
1.创建一个ARP请求报文,并设置源主机的IP地址、MAC地址,目标主机的IP地址(需要获取MAC地址的主机)以及目标主机的MAC地址(填充为广播地址)。
2.将ARP请求报文封装成一个数据包,并通过数据链路层发送到局域网上。
3.所有局域网上的主机都会接收到这个ARP请求报文。
4.接收到ARP请求报文的主机首先检查自己的ARP缓存表,如果存在目标主机的IP地址,则直接发送一个ARP响应报文给源主机(主机A),告知目标主机的MAC地址。
5.如果ARP缓存表中不存在目标主机的IP地址,则丢弃该ARP请求报文。
6.源主机(主机A)会等待一段时间,收集所有的ARP响应报文。
7.主机A将接收到的所有ARP响应报文的源IP地址和MAC地址存储在自己的ARP缓存表中,以供将来使用。
8.此时,主机A可以通过ARP缓存表查找到目标主机B的物理地址(MAC地址),用于向目标主机发送数据包。
需要注意的是,ARP协议只能在同一局域网内获取目标主机的物理地址。
如果目标主机在不同的子网上,需要使用网关(路由器)来转发ARP请求,或者使用其他协议如ARP Proxy来解决跨网段的物理地址获取。
介绍ARP协议的作用和功能ARP(Address Resolution Protocol)是一种用于在IPv4网络中解析IP地址和物理MAC地址之间映射关系的协议。
它在局域网中起着至关重要的作用,使得网络设备能够通过IP地址找到对应的MAC地址,从而实现数据的正确传递。
IP地址和MAC地址在理解ARP协议之前,需要了解IP地址和MAC地址的概念。
IP地址是全球唯一标识网络中设备的地址,它由32位二进制数组成,通常以点分十进制表示(例如:192.168.0.1)。
而MAC地址是网络设备的物理地址,由48位二进制数组成,通常以冒号分隔的十六进制表示(例如:00:1A:2B:3C:4D:5E)。
ARP协议的功能ARP协议的主要功能是将IP地址解析为对应的MAC地址,或者将MAC地址解析为对应的IP地址。
具体来说,ARP 协议提供了以下两个重要的功能:1.地址解析:当一台设备需要与另一台设备通信时,它需要知道目标设备的MAC地址。
通过发送ARP请求广播,源设备可以询问局域网中的所有设备:“谁拥有这个IP地址?”目标设备收到请求后,会回复一个ARP响应,包含自己的MAC地址。
这样,源设备就可以得到目标设备的MAC地址,从而建立通信。
2.地址缓存:为了避免频繁的ARP请求和响应,设备会在本地维护一个ARP缓存表(也称为ARP缓存或ARP表)。
ARP缓存表记录了已解析的IP地址和对应的MAC地址的映射关系。
当设备需要与已知IP地址通信时,它可以直接查找ARP缓存表,而无需发送ARP请求。
如果在ARP缓存表中找不到对应的条目,设备将重新发送ARP请求以更新缓存。
ARP协议的重要性ARP协议在局域网中的作用非常重要。
它使得设备能够通过IP地址进行通信,并且在需要时能够动态地解析IP地址和MAC地址的映射关系。
ARP协议的正常运行对于实现数据包的正确传递和网络通信的顺畅性至关重要。
然而,由于ARP协议的工作机制较为简单,存在一些安全风险,例如ARP欺骗攻击和ARP缓存中毒攻击。
使用ARP命令来绑定IP和MAC地址【导读】作为企业级的路由防火墙,ISA Server并没有提供对于MAC地址的控制功能。
不过,你可以使用Windows的命令ARP来实现IP地址和MAC地址的绑定。
这篇文章介绍了Windows下ARP协议工作的原理,以及如何使用ARP命令来静态绑定IP地址和MAC 地址。
ISA Server中没有提供对于MAC地址的控制功能,Why?这是因为MAC地址只能在本地网络中使用,当数据包跨越路由器时,数据包中主机的源MAC地址就会被路由器的出站接口的MAC地址所代替,这个时候,使用MAC地址来进行控制就不适用了。
所以只要是企业级的硬件或者软件防火墙,都基本没有提供对MAC地址的控制功能。
在Windows中,如果你安装了TCP/IP网络协议组件,那么你就可以执行命令ARP。
ARP命令的作用是查看本机的ARP缓存、静态绑定IP地址和MAC地址和删除静态绑定项。
其实绑定IP地址和MAC地址的本意是为了减少ARP广播流量,只是可以利用这一功能来控制IP地址的使用。
ARP协议(Address Resolve Protocol,地址解析协议)工作在TCP/IP协议的第二层-数据链路层,用于将IP地址转换为网络接口的硬件地址(媒体访问控制地址,即MAC地址)。
无论是任何高层协议的通讯,最终都将转换为数据链路层硬件地址的通讯。
每台主机都具有一个用于缓存MAC地址的ARP缓存列表,你可以使用命令ARP -a或ARP -g来查看当前的ARP缓存列表。
此ARP缓存列表是动态更新的,默认情况下,当其中的缓存项超过两分钟没有活动时,此缓存项就会超时被删除。
你可以使用ARP -s来静态绑定IP地址和MAC地址,不过在Windows server 2003和XP以前的Windows系统中,就算你设置了静态MAC地址绑定项,同样会通过接收其他主机的数据包而更新已经绑定的项。
在Windows server 2003和XP中,静态绑定的项不会被动态更新,直到TCP/IP协议终止为止,例如重启计算机。
实验2 基于ARP协议获取局域网活动主机的物理地址(MAC地址)实验目的1、掌握ARP协议分组结构与协议运作过程;2、了解ARP协议获取活动主机MAC地址的方法与软件实现;实验原理实验环境(设备)windows XPVisual Studio 2008实验内容【实验方案设计】(1)掌握ARP协议分组结构与协议运作过程;(2)了解ARP协议获取活动主机MAC地址的方法与软件实现;(3)在windows平台上构造自定义数据帧,并通过指定网络适配器(网卡)发送的基本方法。
【实验过程】(实验步骤、记录、数据、分析)(1)掌握ARP协议分组结构与协议运作过程;什么是ARP? ARP (Address Resolution Protocol) 是个地址解析协议。
最直白的说法是:在IP以太网中,当一个上层协议要发包时,有了该节点的IP 地址,ARP就能提供该节点的MAC地址。
在实际的应用中,我们经常会遇到这样的问题:已经知道一个机器的IP地址,需要找出其相应的物理地址,ARP地址解析协议就是用来解决这个问题的。
ARP协议的工作原理:1)在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。
2)在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。
所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
3) ARP协议的基本功能就是通过目标设备的IP地址,查询目标主机的MAC 地址,以保证通信的顺利进行。
(2)了解ARP协议获取活动主机MAC地址的方法与软件实现1、ARP协议获取活动主机的MAC地址:每个主机都设有一个ARP高速缓存,里面有本局域网上各主机和路由器的IP地址到硬件地址的映射表。
当某主机要向该局域网的另一个主机发送信息时,先在其ARP高速缓存中查看有无该地址,如果有就查出其对应的硬件地址,写入MAC帧,然后把该帧发往目的地址。
如果ARP高速缓存中没有该地址,则源主机自动运行ARP,其运作过程如下:(1) ARP进程在本局域网上广播发送ARP请求,把自己的ARP地址到硬件地址的映射写入ARP请求中。
(2)在本局域网上的所有主机上运行的ARP进程均收到此ARP请求分组。
(3)目的主机在ARP请求中见到自己的IP地址,并向源主机发送ARP 响应,并写下自己的硬件地址。
其余的主机都不理睬(4)源主机收到目的主机的响应后,就在ARP告诉缓存中写入目的主机的IP地址到硬件地址的映射2、特殊情况:ARP是解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。
如果所要找的目标主机和源主机不在同一个局域网上。
则(1)此时主机A就无法解析出主机B的硬件地址(2)此时主机A需要的是将路由器R1的IP地址解析出来,然后将该IP 数据报发送给路由器R1.(3) R1从路由表中找出下一跳路由器R2,同时使用ARP解析出R2的硬件地址。
于是IP数据报按照路由器R2的硬件地址转发到路由器R2。
(4)路由器R2在转发这个IP数据报时用类似方法解析出目的主机B的硬件地址,使IP数据报最终交付给主机B.核心代码:int GetSelfMac() //获得自己主机的MAC地址{unsigned char sendbuf[42]; //ARP包结构大小int i = -1;int res;ethernet_head eh;arp_head ah;struct pcap_pkthdr * pkt_header;const u_char * pkt_data;memset(eh.dest_mac_add,0xff,6);memset(eh.source_mac_add,0x0f,6);memset(ah.source_mac_add,0x0f,6);memset(ah.dest_mac_add,0x00,6);eh.type = htons(ETH_ARP);ah.hardware_type = htons(ARP_HARDWARE);ah.protocol_type = htons(ETH_IP);ah.hardware_add_len = 6;ah.protocol_add_len = 4;ah.source_ip_add = inet_addr("219.219.71.230");//请求方的ipah.operation_field = htons(ARP_REQUEST);// unsigned long ip;// ip = ntohl(inet_addr("192.168.1.101"));// ah.dest_ip_add =htonl(ip + loop);ah.dest_ip_add = localIP;//inet_addr("192.168.1.102");memset(sendbuf,0,sizeof(sendbuf));memcpy(sendbuf,&eh,sizeof(eh));memcpy(sendbuf+sizeof(eh),&ah,sizeof(ah));if(pcap_sendpacket(adhandle,sendbuf,42)==0){// printf("\nPacketSend succeed\n");}else{printf("PacketSendPacket in getmine Error: %d\n",GetLastError());return 0;}while((res = pcap_next_ex(adhandle,&pkt_header,&pkt_data)) >= 0){if(*(unsigned short *)(pkt_data+12) == htons(ETH_ARP)&& *(unsigned short*)(pkt_data+20) == htons(ARP_REPLY)&&*(unsigned long*)(pkt_data+38) == inet_addr("219.219.71.230")) {for(i=0; i<6; i++){selfMac[i] = *(unsigned char*)(pkt_data+22+i);printf("%02x",selfMac[i]);}break;}}if(i==6) return 1;else return 0;}//向局域网内的所有可能的IP地址发送ARP请求包void sendArpPacket(){unsigned char sendbuf[42];//arp包结构大小unsigned long ip;ethernet_head eh;arp_head ah;memset(eh.dest_mac_add,0xff,6);memcpy(eh.source_mac_add,selfMac,6);memcpy(ah.source_mac_add,selfMac,6);memset(ah.dest_mac_add,0x00,6);eh.type = htons(ETH_ARP);ah.hardware_type = htons(ARP_HARDWARE);ah.protocol_type = htons(ETH_IP);ah.hardware_add_len = 6;ah.protocol_add_len = 4;ah.operation_field = htons(ARP_REQUEST);ah.source_ip_add = inet_addr("192.168.1.101");for (unsigned long i=0; i<HostNum; i++){ip = iptosendh;ah.dest_ip_add =htonl(ip + i);memset(sendbuf,0,sizeof(sendbuf));memcpy(sendbuf,&eh,sizeof(eh));memcpy(sendbuf+sizeof(eh),&ah,sizeof(ah));if(pcap_sendpacket(adhandle,sendbuf,42)==0){// printf("\nRequest Packet succeed\n");}else{printf("Request Packet in getmine Error: %d\n",GetLastError());}Sleep(50);}Sleep(1000);flag = TRUE;}//接收ARP响应线程,分析数据包后即可获得活动的主机IP地址等void GetlivePc(){//pcap_t *p=(pcap_t *)lpParameter;int res;// arp_head ah;struct pcap_pkthdr *pkt_header;const u_char * pkt_data;unsigned char tempMac[6];while (true){if(flag){printf("扫描完毕,监听线程退出!\n");//ExitThread(0);break;}if ((res = pcap_next_ex(adhandle,&pkt_header,&pkt_data)) >= 0) {// printf("%x",ntohs(*(unsigned short *)(pkt_data+12)));if(*(unsigned short *)(pkt_data+12) == htons(ETH_ARP)){arp_packet *recv =(arp_packet*)pkt_data;if(*(unsigned short *)(pkt_data+20) == htons(ARP_REPLY)){printf("xx\n");printf("IP地址:%d.%d.%d.%d---------->mac地址:",\ recv->ah.source_ip_add&255,recv->ah.source_ip_add>>8&255,\recv->ah.source_ip_add>>16&255,recv->ah.source_ip_add>>24&255);pcGroup[aliveNum].ip = *(unsigned long *)(pkt_data+28);memcpy(pcGroup[aliveNum].mac,(pkt_data+22),6);aliveNum++;for(int i=0; i<6; i++){tempMac[i] = *(unsigned char*)(pkt_data+22+i);printf("%02x",tempMac[i]);}printf("\n");}}}Sleep(50);}}ARP协议获取活动主机MAC地址流程图(3)在windows平台上构造自定义数据帧,并通过指定网络适配器(网卡)发送的基本方法。