Chinaunix首页 | 论坛 | 博客
  • 博客访问: 855667
  • 博文数量: 290
  • 博客积分: 511
  • 博客等级: 下士
  • 技术积分: 1590
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-29 13:14
文章分类

全部博文(290)

文章存档

2018年(28)

2017年(19)

2016年(8)

2015年(1)

2014年(14)

2013年(12)

2012年(22)

2011年(186)

分类: 网络与安全

2013-08-10 08:16:34

原文地址:arp报文格式 作者:wqfhenanxc

一、arp报文格式

1.定义常量

#define EPT_IP   0x0800         /* type: IP */
#define EPT_ARP   0x0806        /* type: ARP */
#define EPT_RARP 0x8035         /* type: RARP */

2.定义以太网首部
typedef struct ehhdr
{
unsigned char eh_dst[6];   /* destination ethernet addrress */
unsigned char eh_src[6];   /* source ethernet addresss */
unsigned short eh_type;   /* ethernet pachet type */
}EHHDR;

3.定义以太网arp字段

/*        注释:xie_minix   */
/*        要了解ARP包,他的结构和一些常量你必须知道是什么意思*/                              
#ifndef        _NET_IF_ARP_H_
#define        _NET_IF_ARP_H_

/*
* 地址解释协议.
*
* 查看 RFC 826 对该协议的描述.  ARP 包长度是变化的
* 头部(arphdr)结构定义了固定长度部分.
*/
struct        arphdr {
        u_short        ar_hrd;                /* 格式化的硬件地址 */
#define ARPHRD_ETHER         1        /* 以太网格式 */
#define ARPHRD_IEEE802        6        /* 令牌环网格式 */
#define ARPHRD_FRELAY         15        /* 帧中继硬件格式 */
        u_short        ar_pro;                /* 协议地址格式 */
        u_char        ar_hln;                /* 硬件地址长度*/
        u_char        ar_pln;                /* 协议地址长度 */
        u_short        ar_op;                /* 以下之一: */
#define        ARPOP_REQUEST        1        /* 发出请求解释一IP地址 */
#define        ARPOP_REPLY        2        /* 回应上一个请求 */
#define        ARPOP_REVREQUEST 3        /* 请求一IP地址(给出硬件地址,实际上是逆向地址解释) */
#define        ARPOP_REVREPLY        4        /* 回应逆向地址解释 */
#define ARPOP_INVREQUEST 8         /* 请求对方的ID */
#define ARPOP_INVREPLY        9        /* 回应对方的ID */
/*
* 下面的字段是可变长的,
* 主要是依照上面给出的定义.
*/
#ifdef COMMENT_ONLY
        u_char        ar_sha[];        /* 发送者硬件地址 */
        u_char        ar_spa[];        /* 发送者协议地址 */
        u_char        ar_tha[];        /* 目的方硬件地址 */
        u_char        ar_tpa[];        /* 目的方协议地址*/
#endif
};

/*
* ARP ioctl 请求
*/
struct arpreq {
        struct        sockaddr arp_pa;                /* 协议地址 */
        struct        sockaddr arp_ha;                /* 硬件地址 */
        int           arp_flags;                      /* 标识 */
};
/*  arp_flags 和 at_flags 域的值 */
#define        ATF_INUSE       0x01        /* 入口在使用 */
#define        ATF_COM         0x02        /* 完整的入口 (enaddr 有效) */
#define        ATF_PERM        0x04        /* 持久的入口 */
#define        ATF_PUBL        0x08        /* 发布一入口 (回应其他主机) */
#define        ATF_USETRAILERS 0x10        /* 有追踪请求 */

#ifdef _KERNEL
/*
* 该结构是以太网设备驱动程序和ARP程序所共享.
*/
struct        arpcom {
        /*
         *  ifnet 结构必须在此结构的第一个位置.
         */
        struct         ifnet ac_if;       
        u_char        ac_enaddr[6];                /* 以太网硬件地址*/
        int        ac_multicnt;                /* 多播地址列表数 */
        void        *ac_netgraph;                /* PPPoE(ADSL)的指针 */
};

extern u_char        etherbroadcastaddr[6];
#endif

#endif /* !_NET_IF_ARP_H_ */


由于内核中的arp头部定义为了适应各种链路而比较复杂,并且针对以太网定义的格式编译选项复杂,所以还是自己在程序中定义结构体比较easy。

typedef struct arphdr
{
//arp首部
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 long arp_spa;    /* sender protocol address */
unsigned char arp_tha[6];    /* target hardware address */
unsigned long arp_tpa;    /* target protocol address */
}ARPHDR;

4.定义整个arp报文包,总长度42字节
typedef struct arpPacket
{
EHHDR ehhdr;
ARPHDR arphdr;
} ARPPACKET;

5.由于以太网中规定以太网帧中出以太网头部外的数据长度最小为46字节,而ARP帧长度只有28字节,因此有18字节填充位,填充位的内容没有定义,与具体实现相关。

阅读(1178) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~