以太网通讯

在计算机网络中,数据发送的过程就是把数据按照各层协议层层封装的过程。在这个过程中,最终要使用的协议通常是以太网协议(数据链路层协议)。

以太网包格式

目的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协议实现]的更多相关文章

  1. [国嵌攻略][162][USB协议分析]

    USB设备逻辑结构 在USB设备的逻辑组织中,包含设备.配置.接口和端点4个层次.设备通常有一个或多个配置,配置通常有一个或多个接口,接口通常有零个或多个端点. USB设备描述符 当我们把USB设备( ...

  2. [国嵌攻略][067][tftp协议分析]

    TFTP作用 用于网络下载,TFTP客户机在TFTP服务器中下载文件. TFTP交换过程 1.配置TFTP服务器 vim /etc/xinetd.d/tftp 2.交换过程 客户端发请求包到服务器 服 ...

  3. [国嵌攻略][068][tftp网络协议实现]

    IP协议结构 UDP协议结构 TFTP协议结构 TFTP端口 读写请求端口: 69 其他请求端口:1024~65535 主程序 /*********************************** ...

  4. [国嵌攻略][179][OpenSSL加密系统]

    未加密传输的安全弊端 如果在网络传输中没有加密,就是以明文传输.传输的数据可以被抓包软件直接截获,并能读取里面的数据. 加密基本原理 1.对称加密 2.非对称加密 2.1.公钥私钥 公钥和私密要配对. ...

  5. [国嵌攻略][164][USB驱动程序设计]

    USB驱动模型 1.USB host controller driver(主控器驱动):为USB主控制器提供驱动程序 2.USB core(USB核心):连接USB主控制器驱动和USB设备驱动 3.U ...

  6. [国嵌攻略][099][Linux内核配置与编译]

    为什么要配置内核 基于硬件和软件的需求选出需要的功能,去掉不要的功能. 内核配置的方法 make config:基于文本交互的配置. make menuconfig:基于图形菜单的配置. make m ...

  7. [国嵌攻略][098][Linux内核简介]

    Linux系统架构 1.用户空间:应用程序.C函数库 2.内核空间:系统调用接口.内核.体系结构相关代码 Linux系统利用处理器不同的工作模式,使用其中的两个级别分别来运行Linux内核与应用程序, ...

  8. [国嵌攻略][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 所属头文件 ...

  9. [国嵌攻略][092][UDP网络程序设计]

    server.c #include <sys/socket.h> #include <netinet/in.h> #include <strings.h> #inc ...

随机推荐

  1. KVM(二):KVM应用

    ++++++++++++++++++++++++++++++创建和拍摄快照++++++++++++++++++++++++++++++++++ KVM快照方法常用的是qemu-img snapshot ...

  2. vuejs实现本地数据的筛选分页

    今天项目需要一份根据本地数据的筛选分页功能,好吧,本来以为很简单,网上搜了搜全是ajax获取的数据,这不符合要求啊,修改起来太费力气,还不如我自己去写,不多说直接上代码 效果图: 项目需要:点击左侧进 ...

  3. 优化设计提高sql类数据库的性能

    前言 在一个项目中,技术的统一性是最重要的,数据库的设计则是重点中的重点.NoSQL 是目前最流行的数据库,但是其实用性和功能性远不如sql数据库. 实际很多SQL数据库被诟病的性能问题大多是源于程序 ...

  4. cleanMyMac

    想看外国网站可以找我,facebook.youtube.XX大片等,只要8元钱,无限制用到服务器关闭.看大片流畅不成问题 需要cleanMyMac的请加微信只要10或直接拍 http://a.p6ff ...

  5. 【转】教你开发jQuery插件

    阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原文:http://www.cnblo ...

  6. Python学习_10__python2到python3

    同样作为动态语言,python的面相对像和ruby有很多类似的地方,这里还是推荐<Ruby元编程>一书来参考学习python的面向对象.然而python并不是纯面向对象设计,所以很多rub ...

  7. 读书笔记:《HTML5开发手册》-- 现存元素的变化

    继续学习HTML5语义化的内容,今天主要介绍一下,HTML5之前的元素经HTML5规范后的语义及一些使用示例. 一.cite HTML5对cite元素的定义进行了很大的修改,在HTML4中,cite元 ...

  8. word在线问题

    1.js代码如下 var sdata = "";$(function(){ var pathdoc = path.split("."); var explore ...

  9. ERP中自定义报表制作流程

    查询制作流程 新增单表查询--查询语句设置--表格设置(列信息)--参数设置--关联设置--着色设置 报表设计需求(以差旅报销单为例) 1.制作按部门统计每个月的 报销金额并且可以关联到明细进行比对 ...

  10. 在阿里云 ECS 搭建 nginx https nodejs 环境(三、nodejs)

    在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 在阿里云 ECS 搭建 nginx https nodejs 环境(三.nodejs) 第一步 指定版本源 执行 ...