[国嵌攻略][066][ARP协议实现]
以太网通讯
在计算机网络中,数据发送的过程就是把数据按照各层协议层层封装的过程。在这个过程中,最终要使用的协议通常是以太网协议(数据链路层协议)。
以太网包格式
目的MAC地址:接收者的物理地址(6字节)
源MAC地址:发送者的物理地址(6字节)
类型:高层数据使用的协议类型(2字节)
数据:高层的数据(46~1500字节)
CRC:校验码(4字节)
ARP功能
在以太网络中,每一台计算机的唯一身份表示是MAC地址(物理层的地址),两台计算机要进行通讯,必须要知道对方的MAC地址,但是用户通常只知道对方的IP地址 ,这时就可以利用ARP(地址解析协议)来向局域网中的所有计算机发送ARP请求包,收到请求包并且满足条件的计算机会恢复ARP应答包,告知其MAC地址。所以ARP协议是一种利用IP地址和MAC地址的协议。
ARP包格式
ARP包属于网络层,分为请求包和应答包,通过OP字段来区分。
以太网目的地址(6字节)
以太网源地址(6字节)
帧类型(2字节)
硬件类型(2字节)
协议类型(2字节)
硬件地址长度(1字节)
协议地址长度(1字节)
OP(2字节)
发送端以太网地址(6字节)
发送端到IP地址(4字节)
目的以太网地址(6字节)
目的IP地址(4字节)
网络字节序
在网络通讯中认为主机都是大端模式。对与多个字节的需要转换,一个字节的不用转换。
小端模式:低地址放低字节,高地址放高字节
大端模式:低地址方高字节,高地址放低字节
/********************************************************************
*名称:arp.c
*作者:D
*时间:2015.11.26
*功能:ARP协议
*********************************************************************/ /********************************************************************
*宏定义
*********************************************************************/
#define ETH_ARP 0x0806 //ARP
#define ETH_RARP 0x0805 //RARP
#define ARP_ETH 0x0001 //ETHERNET
#define ARP_IP 0x0800 //IP
#define ARP_REQ 0x0001 //Request
#define ARP_REP 0x0002 //Reply #define HTONS(n) ( (((n)&0xFF00)>>8) | (((n)&0x00FF)<<8) ) //把unsigned short类型从主机序转换到网络序 #define MAC_LENGTH 6 //MAC地址长度
#define IP_LENGTH 4 //IP地址长度
#define PACKET_LENGTH 42 //ARP报文包长度,以太网帧最小长度为64字节,发送时会自动填充为64字节 /********************************************************************
*类型定义
*********************************************************************/
//以太网帧首部
typedef struct ehhdr
{
unsigned char eh_dst[6]; //destination ethernet addrress
unsigned char eh_src[6]; //source ethernet addresss
unsigned short eh_type; //ethernet packet type
}EHHDR, *PEHHDR; //以太网帧数据
typedef struct arphdr
{
unsigned short arp_hrd; //format of hardware address
unsigned short arp_pro; //format of protocol address
unsigned char arp_hln; //length of hardware address
unsigned char arp_pln; //length of protocol address
unsigned short arp_op; //ARP/RARP operation unsigned char arp_sha[6]; //sender hardware address
unsigned char arp_spa[4]; //sender protocol address
unsigned char arp_tha[6]; //target hardware address
unsigned char arp_tpa[4]; //target protocol address
}ARPHDR, *PARPHDR; //ARP报文包
typedef struct arpPacket
{
EHHDR ehhdr;
ARPHDR arphdr;
}ARPPACKET, *PARPPACKET; /********************************************************************
*全局变量声明
*********************************************************************/
unsigned char eh_src[6] = {0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}; //MAC发送地址
unsigned char eh_dst[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //MAC目的地址 unsigned char ip_src[4] = {192, 168, 1, 150}; //IP发送地址
unsigned char ip_dst[4] = {192, 168, 1, 100}; //IP目的地址 /********************************************************************
*函数原型声明
*********************************************************************/
void requst_arp();
void create_packet(ARPPACKET *arp_packet); void process_arp(ARPPACKET *arp_packet); /********************************************************************
*名称:requst_arp
*参数:
* none
*返回:
* none
*功能:ARP请求
*********************************************************************/
void requst_arp(){
ARPPACKET arp_packet; //ARP报文包 //创建ARP报文包
create_packet(&arp_packet); //发送ARP报文包
tx_dm9000(&arp_packet, PACKET_LENGTH);
} /********************************************************************
*名称:create_packet
*参数:
* arp_packet 报文包
*返回:
* none
*功能:创建ARP报文包
*********************************************************************/
void create_packet(ARPPACKET *arp_packet){
//填充以太网帧首部
memcpy(arp_packet->ehhdr.eh_dst, eh_dst, MAC_LENGTH); //MAC目的地址
memcpy(arp_packet->ehhdr.eh_src, eh_src, MAC_LENGTH); //MAC发送地址
arp_packet->ehhdr.eh_type = HTONS(ETH_ARP); //帧类型 //填充以太网帧数据
arp_packet->arphdr.arp_hrd = HTONS(ARP_ETH); //硬件类型
arp_packet->arphdr.arp_pro = HTONS(ARP_IP); //协议类型
arp_packet->arphdr.arp_hln = MAC_LENGTH; //硬件地址长度
arp_packet->arphdr.arp_pln = IP_LENGTH; //协议地址长度
arp_packet->arphdr.arp_op = HTONS(ARP_REQ); //操作类型 memcpy(arp_packet->arphdr.arp_sha, eh_src, MAC_LENGTH); //MAC发送地址
memcpy(arp_packet->arphdr.arp_spa, ip_src, IP_LENGTH); //IP发送地址
memcpy(arp_packet->arphdr.arp_tha, eh_dst, MAC_LENGTH); //MAC目的地址
memcpy(arp_packet->arphdr.arp_tpa, ip_dst, IP_LENGTH); //IP目的地址
} /********************************************************************
*名称:process_arp
*参数:
* arp_packet 报文包
*返回:
* none
*功能:处理ARP报文包
*********************************************************************/
void process_arp(ARPPACKET *arp_packet){
int i;
unsigned char eh_addr[6]; //物理地址
unsigned char ip_addr[4]; //协议地址 //提取发送地址
memcpy(eh_addr, arp_packet->arphdr.arp_sha, MAC_LENGTH);
memcpy(ip_addr, arp_packet->arphdr.arp_spa, IP_LENGTH); //打印发送地址
printf("IP is ");
for(i = 0; i < IP_LENGTH; i++){
printf("%3d.", ip_addr[i]);
}
printf("\b!"); printf("MAC is ");
for(i = 0; i < MAC_LENGTH; i++){
printf("%02X:", eh_addr[i]);
}
printf("\b!\n");
}
[国嵌攻略][066][ARP协议实现]的更多相关文章
- [国嵌攻略][162][USB协议分析]
USB设备逻辑结构 在USB设备的逻辑组织中,包含设备.配置.接口和端点4个层次.设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有零个或多个端点. USB设备描述符 当我们把USB设备( ...
- [国嵌攻略][067][tftp协议分析]
TFTP作用 用于网络下载,TFTP客户机在TFTP服务器中下载文件. TFTP交换过程 1.配置TFTP服务器 vim /etc/xinetd.d/tftp 2.交换过程 客户端发请求包到服务器 服 ...
- [国嵌攻略][068][tftp网络协议实现]
IP协议结构 UDP协议结构 TFTP协议结构 TFTP端口 读写请求端口: 69 其他请求端口:1024~65535 主程序 /*********************************** ...
- [国嵌攻略][179][OpenSSL加密系统]
未加密传输的安全弊端 如果在网络传输中没有加密,就是以明文传输.传输的数据可以被抓包软件直接截获,并能读取里面的数据. 加密基本原理 1.对称加密 2.非对称加密 2.1.公钥私钥 公钥和私密要配对. ...
- [国嵌攻略][164][USB驱动程序设计]
USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.U ...
- [国嵌攻略][099][Linux内核配置与编译]
为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make m ...
- [国嵌攻略][098][Linux内核简介]
Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序, ...
- [国嵌攻略][070-095][Linux编程函数手册]
第1类 时间编程类 1.1 获取日历时间 1.1.1 函数名 time 1.1.2 函数原形 time_t time(time_t *t) 1.1.3 函数功能 返回日历时间 1.1.4 所属头文件 ...
- [国嵌攻略][092][UDP网络程序设计]
server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #inc ...
随机推荐
- Docker(三):Docker仓库配置
1.仓库介绍 仓库(repository)用来集中管理Docker镜像,支持镜像分发和更新. 目前世界上最大最知名的公共仓库是Docker官方的Docker Hub,国内比较知名的有:Docker P ...
- 3、树莓派的配置:改静态IP、连接ssh、安装中文字体、安装谷歌输入法、增加USB电流、修改触摸屏分辨率、扩展sd卡空间、修复vi和vim乱码问题、安装配置远程桌面vnc
本博文仅作本人操作过程的记录,留作备忘.自强不息 QQ1222698 1.连接上HDMI线,插上触摸屏,插上键盘,鼠标,网线,启动.系统正常启动,但是一直闪烁,不停的黑屏,是由于触摸屏的usb口供电不 ...
- input选择框样式修改与自定义
html自带的选择框样式不好看,并且在ios设备上丑的罚款.所以一般都是自定义样式: 原理:将原来默认的input选择框隐藏,然后控制label的:before与:after,配合矢量图标或者图片来实 ...
- JavaScript函数补完:toString()
javascript中的toString()方法,主要用于Array.Boolean.Date.Error.Function.Number等对象.下面是这些方法的一些解析和简单应用,做个纪律,以作备忘 ...
- C# 控件拖动
https://zhidao.baidu.com/question/2116834779399609987.html [DllImport("user32.dll", EntryP ...
- 微信小程序开发之picker
一.绑定简单数组 通过bindChange控制index,使得当前选择值发生改变 示例1 data: { Data: ['A','B'], Index: 0, }, <picker class= ...
- Hibernate学习笔记(3)---hibernate关联关系映射
一对一关联 假设有两个持久化类(实体类)User与Address,它们之间存在一对一的关系 1,通过主键关联(个人偏向另外一种) User.hbm.xml文件配置 <id name=" ...
- js生成word中图片处理
首先功能是要求前台导出word,但是前后台是分离的,图片存在后台,所以就存在跨域问题. 导出文字都是没有问题的(jquery.wordexport.js),但是导出图片就存在问题了: 图片是以链接形式 ...
- Centos6.5搭建分布式压力测试工具Tsung的环境搭建
各软件版本: 1.otp_src_17.1.tar.gz 2.tsung_1.5.1.tar.gz 3.7.0的Java编译环境 因工作需要,需要用TSung工具测试xmpp协议,经历了一段时间的挣扎 ...
- php的二维数组排序
//建立一个$arr的二维数组 $arr=array( array('name'=>'e','age'=>5), array('name'=>'b','age'=>2), ar ...