[国嵌攻略][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 ...
随机推荐
- web网站嵌入QQ临时会话代码 ----转载----小技巧
第一种 <img style="CURSOR: pointer" onclick="javascript:window.open('tencent://messag ...
- 简单记录一下原生ajax
面试老忘记,代码如下 function ajax() { var xmlHttpRequest = null; //定义XMLHttp对象的容器 if(window.XMLHttpRequest) { ...
- awk 命令详解
作用:awk 是一种编程语言, 用于在linux/unix 下对文本和数据进行处理. 数据可以来自标准输入(stdin),一个或多个文件, 或其他命令的输出.它支持用户自定义函数和动态正则表达式等先进 ...
- 初识JavaScript(一)
初识JavaScript(一) 最近由于工作的需要的原因,我从一个写后台的现在让我转到写前端,再加上我的js部分特别的差,所以我现在开始学习js部分的知识. 我的第一篇博文就这样开始写了.俗话说,千里 ...
- Java订单号生成,唯一订单号(日均千万级别不重复)
Java订单号生成,唯一订单号 相信大家都可以搜索到很多的订单的生成方式,不懂的直接百度.. 1.订单号需要具备以下几个特点. 1.1 全站唯一性. 1.2 最好可读性. 1.3 随机性,不能重复,同 ...
- PHP 判断Header 送出前, 是否有值被送出去: headers_sent()
1 为避免header()函数是,出现 <b>Warning</b>: Cannot modify header information - headers already ...
- python中星号的意义(**字典,*列表或元组)
传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊的语法:*.** . 调用函数时使用* ,** test(*args)中 * 的作用:其 ...
- python pandas 合并数据函数merge join concat combine_first 区分
pandas对象中的数据可以通过一些内置的方法进行合并:pandas.merge,pandas.concat,实例方法join,combine_first,它们的使用对象和效果都是不同的,下面进行区分 ...
- RobotFrame连接MySql数据库
RobotFrame连接MySql数据库这类的教程网上并不多,就算有,也是很多坑.小编今天为大家提供一个靠谱的教程,但是具体的包需要大家自己下载.废话不多说,看疗效~~~ 1.pip install ...
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...