`

ARP数据包格式

 
阅读更多

一、ARP数据包的基本格式

Ethernet头部
ARP数据部分

6

6

2

2

2

2

2

4

6

4

6

目标MAC地址

源地MAC地址

类型号0x0800:ip

0x0806:ARP

局域网类型

以太网0x0001

网络协议类型

IP网络0x0800

MAC/IP地址长度,恒为0x06/04


ARP包类型
replay

01


REPLY
0x0002


ARP目标IP地址

ARP目标MAC 地址

ARP源IP地址

ARP源MAC地址

二、ARP数据包的信息

      请求格式,回应格式。

      包含物理地址和IP地址。

三、发送一个ARP请求

      1.下载winpcap安装

      2.下载jpcap  把jpcap.dll放到java的bin文件夹下

      3.新建一个项目导入jpcap.jar

      然后构建一个ARP数据请求包。

package com.stx.test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import jpcap.JpcapCaptor;
import jpcap.JpcapSender;
import jpcap.NetworkInterface;
import jpcap.NetworkInterfaceAddress;
import jpcap.packet.ARPPacket;
import jpcap.packet.EthernetPacket;
import jpcap.packet.IPPacket;
import jpcap.packet.Packet;
import jpcap.packet.TCPPacket;
import jpcap.packet.UDPPacket;

/*
 * 1.发送一个arp请求包
 * 2.得到arp回应包解析出目的主机的mac地址
 * */
public class Mac {

	private NetworkInterface devices[]; // 网络设备
	private NetworkInterface device; // 网络设备对象
	private JpcapCaptor jpcapCaptor; // 设备的链接
	private JpcapSender jpcapSender; // 包的发送实例
	private ARPPacket arpPacket; // arp包的构建
	private byte[] hostMAC, goalMAC; // 源主机、目标主机的MAC
	private byte hostIP[], goalIP[]; // 源主机、目标主机的IP
	private List<String> IP; // 存放请求的IP用于后面的检查
	private int request; // 发送请求的个数
	private int get; // 得到请求的个数

	// 实例化
	public Mac() {
		devices = JpcapCaptor.getDeviceList();
		IP = new ArrayList<String>();
	}

	// 的到一个网卡的实例
	public NetworkInterface getDervice(int index) {
		return devices[index];
	}

	// 整个系统的实例化
	public void init() {
		// 看具体的情况由于本地使用的是无线连接时第三个
		int choice = choiceDevice();
		device = getDervice(choice);
		//
		try {
			// 构建一个设别的连接(具体的实例,获取的字符串长度,是否开启混杂模式,超时连接)
			jpcapCaptor = JpcapCaptor.openDevice(device, 65535, false, 1000);
			// jpcapCaptor.setFilter("ip", true);
			// 构建一个发送的实例
			jpcapSender = jpcapCaptor.getJpcapSenderInstance();

		} catch (IOException e) {
			System.out.println("=====初始化失败了,设别连接实例失败=======");
			e.printStackTrace();
		}
	}

	// 摧毁设别连接的实例
	public void destory() {
		if (jpcapCaptor != null)
			jpcapCaptor.close();
		else
			System.out.println("=======设备连接已经关闭了========");
	}

	// 创建一个请求包并发送
	public void creatRequestArp(String hostIP, String goalIP) {
		/*
		 * 本地连接有源ip,目标ip 源MAC,目标MAC=0xff ff ff ff ff ff
		 */
		this.hostIP = getByte(hostIP); // 源ip
		hostMAC = device.mac_address; // 源头MAC
		this.goalIP = getByte(goalIP); // 目标IP
		goalMAC = new byte[] { (byte) 255, (byte) 255, (byte) 255, (byte) 255,
				(byte) 255, (byte) 255 };

		// 构建一个数据包
		arpPacket = new ARPPacket();
		arpPacket.hardtype = ARPPacket.HARDTYPE_ETHER; // 网络类型
		arpPacket.prototype = ARPPacket.PROTOTYPE_IP; // 网络协议IP
		arpPacket.operation = ARPPacket.ARP_REQUEST; // ARP请求
		arpPacket.hlen = 6; // 硬件长度
		arpPacket.plen = 4; // IP长度
		arpPacket.target_hardaddr = goalMAC; // 目标MAC
		arpPacket.target_protoaddr = this.goalIP; // 目标IP
		arpPacket.sender_hardaddr = hostMAC; // 源MAC
		arpPacket.sender_protoaddr = this.hostIP; // 源IP

		// 声明一个以太网的包头
		EthernetPacket ethToTarget = new EthernetPacket();
		ethToTarget.frametype = EthernetPacket.ETHERTYPE_ARP;// 类型号
		ethToTarget.src_mac = hostMAC;
		ethToTarget.dst_mac = goalMAC;
		// 数据包添加以太网的包头
		arpPacket.datalink = ethToTarget;
		// 发送这个arp请求数据包
		jpcapSender.sendPacket(arpPacket);
		System.out.println(arpPacket);
		// 添加一些统计信息
		IP.add(goalIP);
		try {
			Thread.sleep(50);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 把字符串的IP地址转换为了 byte数组行的
	public byte[] getByte(String IP) {
		byte[] byteIP = new byte[4];
		int i = 0;
		for (String s : IP.split("\\.")) {
			byteIP[i++] = (byte) (Integer.parseInt(s));
		}
		// System.out.println(IP);
		// for(int j=0;j<4;j++){
		//
		// System.out.print((int)(byteIP[j]& 0xff)+" ");
		// }
		return byteIP;

	}

	public int choiceDevice() {
		for (int i = 0; i < devices.length; i++) {
			System.out.println("--------------" + i
					+ "------------------------------");
			System.out.println("网卡名称:" + devices[i].name);
			for (NetworkInterfaceAddress a : devices[i].addresses) {
				System.out.println("IP地址:" + a.address);
			}
			System.out
					.println("------------------------------------------------");
		}

		System.out.print("请输入你的选择【从0开始】:");
		try {
			return System.in.read() - 48;
		} catch (IOException e) {
			e.printStackTrace();
			return 0;
		}

	}

	// 接收数据包
	public void getArp() {
		Packet ipPacket = null;
		do {
			ipPacket = jpcapCaptor.getPacket();
			if (ipPacket instanceof ARPPacket) {
				// System.out.println(ipPacket.src_ip.getHostAddress());
				ARPPacket a = (ARPPacket) ipPacket;
				if (a.operation == 2) {
					System.out.println(a.operation == 1 ? "请求" : "回答");
					System.out.println(a.getSenderProtocolAddress() + " "
							+ a.getSenderHardwareAddress());
					System.out.println(a.getTargetProtocolAddress() + " "
							+ a.getTargetHardwareAddress());
					System.out.println("ARP " + ipPacket);
				}
			}
			// else if(ipPacket instanceof UDPPacket){
			// System.out.println("UDP "+ipPacket);
			// }

		} while (true);
	}

	// 打印出测试IP地址
	public void showGoalIP() {
		for (int i = 0; i < IP.size(); i++) {

			System.out.println(IP.get(i));
		}
	}

}

 

分享到:
评论

相关推荐

    计算机网络课设之解析ARP数据包

    - **ARP数据包**:包含了上面提到的ARP数据包格式。 ##### 3.4 ARP协议的工作流程 ARP协议的工作流程大致可以分为以下几个步骤: 1. 当一台主机想要发送数据给另一台主机时,它会首先检查自己的ARP缓存中是否已经...

    arp的数据包格式,以及更好的掌握数据包。

    ### ARP 数据包格式详解及其在 WinPcap 下的应用 #### ARP (Address Resolution Protocol) 概述 ARP(地址解析协议)是一种将网络层地址映射到数据链路层地址的协议,主要用于解决同一局域网内主机之间的 IP 地址到...

    arp数据包生成器

    3. **嗅探和拦截**:一些ARP数据包生成器还具备监听网络流量的能力,可以捕获和分析经过的ARP数据包,帮助识别异常活动。 4. **网络诊断**:通过发送特定的ARP数据包,可以测试网络连接的稳定性,查找可能存在的ARP...

    解析ARP数据包含C++源码

    ARP协议的消息格式是指ARP数据包的结构,它由硬件类型、协议类型、物理地址长度、协议地址长度、操作、源物理地址、源IP地址、目的物理地址、目的IP地址等字段组成。其中,硬件类型指定硬件接口类型,例如,值为1...

    arp数据包的捕获实验报告

    观察ARP缓存的现实,分析IRIS软件捕获的数据包

    linux下C语言实现ARP数据包发送

    inux下C语言实现ARP数据包发送 可以随意发送ARP数据包

    arp数据包抓取解析

    标题中的“arp数据包抓取解析”涉及到网络通信的基础知识,特别是ARP(地址解析协议)的工作原理和数据包捕获技术。ARP是TCP/IP协议栈中的一个重要组成部分,它用于将IP地址转换为物理(MAC)地址,以便在局域网...

    ARP数据包的解析

    编程实现ARP数据包的解析,C语言编程。也可用wireshark捕获数据包~

    发送arp数据包

    #### 三、ARP数据包格式解析 ARP数据包的基本格式如下: - 硬件类型(Hardware Type):2字节,指示请求/应答中硬件地址的格式。对于以太网来说,值为1。 - 协议类型(Protocol Type):2字节,指示请求/应答中协议...

    计算机网络课程设计(第六章)解析ARP数据包(完整程序代码).zip

    在本课程设计中,我们将深入探讨ARP数据包的结构,并通过编写程序代码来实现ARP数据包的解析,以增强对ARP协议的理解。 ARP协议的工作原理是这样的:当一个主机想要向另一个IP地址发送数据时,它首先检查自己的ARP...

    计算机网络解析ARP数据包.doc

    计算机网络解析ARP数据包 计算机网络中的ARP(Address Resolution Protocol,地址解析协议)是一种重要的网络协议,用于将IP地址解析成MAC地址。ARP数据包是网络通信过程中的一种重要数据包,对于理解ARP协议和网络...

    用于利用windows socket构造自己的ARP数据包并发送,其中包括选择网卡能功能...

    用于利用windows socket构造自己的ARP数据包并发送,其中包括选择网卡能功能-windows socket for the use of their tectonic ARP packet and sent, including the choice of Ethernet capabilities.

    arp.rar_ARP包解析_arp 数据包_数据包捕获_网络协议_解析ARP数据包

    学习如何解析ARP数据包,你需要理解数据包的结构,包括操作码(OP字段)、发送者和接收者的IP及MAC地址等。这通常涉及到网络编程,如使用C#或其他语言编写程序来读取和分析网络流量。Visual Studio .NET 2003可能...

    解析ARP数据包报告

    解析ARP数据包解析ARP数据包解析ARP数据包

    发送Ethernet ARP数据包课程设计

    在本课程设计中,我们将深入探讨“发送Ethernet ARP数据包”的技术细节,这是一门针对网络通信基础的重要实践。ARP(地址解析协议)是TCP/IP协议栈中的关键组件,它负责将IPv4地址映射为物理(MAC)地址,使得数据...

    Linux系统下ARP数据包截取和分析.pdf

    【Linux系统下ARP数据包截取和分析】 在Linux操作系统中,ARP(Address Resolution Protocol,地址解析协议)数据包的截取和分析是网络安全管理和故障排查的重要手段。ARP协议主要用于解决IP地址到物理地址(MAC...

    ARP.rar_ARP包解析_解析ARP数据包

    本项目旨在通过编程方式捕获并解析网络中的ARP数据包,以便深入理解网络通信的底层机制。 在ARP协议中,当一个设备想要发送数据给另一个设备但只知道其IP地址时,它会广播一个ARP请求,询问哪个设备拥有特定的IP...

    基于WINPCAP ARP数据包捕获

    **基于WINPCAP ARP数据包捕获** 在计算机网络领域,数据包捕获是一种重要的技术,它允许我们观察网络上的通信细节。对于网络诊断、安全分析以及性能优化来说,这是一项不可或缺的工具。其中,WinPcap是Windows平台...

    我的ARP数据包的文章的源代码

    标题 "我的ARP数据包的文章的源代码" 涉及到的是网络协议中的ARP(Address Resolution Protocol)以及网络编程技术,特别是使用WINPCAP库进行数据包捕获和操作。ARP是TCP/IP协议栈中一个关键的部分,它用于将网络层...

    报文格式以ping arp数据包转发过程.概要.pdf

    报文格式与ping arp数据包转发过程概要 一、以太网帧格式(Ethernet II) 以太网帧格式是指以太网中传输的基本单元,包括前导码、帧首部、数据部分和CRC校验序列。其中,前导码不属于数据部分,数据长度为64-1518...

Global site tag (gtag.js) - Google Analytics