ARP协议以及获取当前局域下主机MAC地址

一、什么是ARP协议、
ARP被称为地址解析协议,在局域网内通过IP地址查找目标主机的MAC地址。ARP协议是实现IP地址到MAC地址的转化。
二、ARP协议的工作原理
为什么使用ARP协议?
在进行网络通讯的时候源主机知道目标主机的IP地址和端口号,却不知道目标主机的硬件地址。而我们发送的数据包是先被网卡接收然后才处理上层协议,如果接收的数据包的硬件地址与自己的硬件地址不相符合,那么就会被直接丢弃。所以要进行两台主机的通信,就必须知道它们的硬件地址,而ARP协议就是通过主机的IP地址来获取其MAC地址的。
ARP协议的原理:
ARP协议能够实现IP地址到MAC地址的转换原理为:主机向自己所处的网络广播一个ARP请求(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播),该请求包含的目标机器的网络地址,这个请求会被当前局域网内的所有主机都会收到,在数据链路层都会收到然后处理交给上层,目的主机收到广播的ARP请求,发现与IP地址与本机相符合就发一个ARP应答给源主机,将自己的MAC地址写到应答包中。而其他主机接收后发现与自己的IP不符合就会直接丢弃。
这里写图片描述
ARP请求/应答的报文格式:
这里写图片描述
1、硬件类型字段定义物理地址的类型,值为1表示MAC地址
2、协议类型字段表示要映射的协议地址类型,它的值为0x800,表示IP地址。
3、硬件地址长度字段和协议地址长度字段(单位是字节),对MAC地址来说长度是6,对IP(v4)地址来说长度是4。
4、操作字段指出四种操作类型(op):ARP请求:1,ARP应答:2,RARP请求:3,RARP应答:4。
5、最后四个字段指定通信双方的以太网地址和IP地址,发送端除了去填充目的端以太网地址外的其他3个字段,以构建ARP请求并发送。

由此可见,ARP请求/应答的长度为28,加上以太网帧头部和尾部的18字节,则一个ARP请求/应答的长度为46字节。有的实现要求以太网帧的数据长度最少为46字节,此时ARP的长度就是64字节。
这里写图片描述
ARP缓存
ARP协议的实质上需要有一个ARP缓存,这个缓存来进行保存ip地址和MAC地址的映射关系,这样,就不需要进行多次的ARP请求了。

三、ARP欺骗攻击以及防御
ARP欺骗原理:
在局域网中,通信前必须通过ARP协议来完成IP地址转换为第二层物理地址(即MAC地址)。ARP协议对网络安全具有重要的意义,但是当初ARP方式的设计没有考虑到过多的安全问题,给ARP留下很多的隐患,ARP欺骗就是其中一个例子。而ARP欺骗攻击就是利用该协议漏洞,通过伪造MAC地址实现ARP欺骗的攻击技术。
在同一局域网内的电脑都是通过MAC地址进行通讯的。方法为,PC和另一台设备通讯,PC会先寻找对方的IP地址,然后在通过ARP表(ARP表里面有所以可以通讯IP和IP所对应的MAC地址)调出相应的MAC地址。通过MAC地址与对方通讯。也就是说在内网中各设备互相寻找和用来通讯的地址是MAC地址,而不是IP地址。
任何一台机器都可以轻松的发送ARP广播,来宣称自己的IP和自己的MAC.这样收到的机器都会在自己的ARP表格中建立一个他的ARP项,记录他的IP和MAC地址。如果这个广播是错误的其他机器也会接受。有了这个方法欺骗者只需要做一个软件,就可以在局域网内进行ARP欺骗攻击了。
ARP攻击的防御:
最理想的防制方法是网络内的每台电脑的ARP一律改用静态的方式,不过这在大型的网络是不可行的,因为需要经常更新每台电脑的ARP表。或者可以使用一些软件来进行ARP的防护,例如DHCP snooping,网络设备可借由DHCP保留网络上各电脑的MAC地址,在伪造的ARP数据包发出时即可侦测到。
这里写图片描述
四、脚本获取当前局域网下主机的MAC地址
查找当前局域网内的所有MAC地址,脚本代码如下:
这里写图片描述
获取到的MAC地址:
这里写图片描述

  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
你可以使用Java中的`InetAddress`类和`NetworkInterface`类来实现ARP协议获取局域网内指定活动主机MAC地址。下面是一个简单的示例代码: ```java import java.net.InetAddress; import java.net.NetworkInterface; import java.net.SocketException; import java.net.UnknownHostException; public class ArpProtocolExample { public static void main(String[] args) { try { // 指定活动主机IP地址 String ipAddress = "192.168.0.100"; InetAddress inetAddress = InetAddress.getByName(ipAddress); NetworkInterface networkInterface = NetworkInterface.getByInetAddress(inetAddress); if (networkInterface != null) { byte[] macAddressBytes = networkInterface.getHardwareAddress(); if (macAddressBytes != null) { StringBuilder macAddressBuilder = new StringBuilder(); for (int i = 0; i < macAddressBytes.length; i++) { macAddressBuilder.append(String.format("%02X%s", macAddressBytes[i], (i < macAddressBytes.length - 1) ? "-" : "")); } String macAddress = macAddressBuilder.toString(); System.out.println("MAC地址: " + macAddress); } else { System.out.println("无法获取MAC地址"); } } else { System.out.println("无法找到指定的网络接口"); } } catch (UnknownHostException e) { e.printStackTrace(); } catch (SocketException e) { e.printStackTrace(); } } } ``` 请注意,这段代码只能在拥有足够权限的情况下才能运行成功。另外,由于ARP协议在Java中并没有直接的API支持,所以这段代码实际上是利用了操作系统底层的ARP功能来获取MAC地址

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值