arp协议报文格式及数据长度

arp协议报文格式及数据长度
2010-02-24 14:37
http://hi.baidu.com/ym012/blog/item/0b35be2e4f74525b4ec22659.html

 

arp数据报文格式如下:

遥控飞机   积木 动漫玩具

以下转自网络

结构e t h e r _ h e a d e r定义了以太网帧首部;结构a r p h d r定义了其后的5个字段,其信息
用于在任何类型的介质上传送A R P请求和回答; e t h e r _ a r p结构除了包含a r p h d r结构外,
还包含源主机和目的主机的地址。

定义常量

#define EPT_IP   0x0800    /* type: IP */
#define EPT_ARP   0x0806    /* type: ARP */
#define EPT_RARP 0x8035    /* type: RARP */
#define ARP_HARDWARE 0x0001    /* Dummy type for 802.3 frames */
#define ARP_REQUEST 0x0001    /* ARP request */
#define ARP_REPLY 0x0002    /* ARP reply */

定义以太网首部
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, *PEHHDR;

定义以太网arp字段
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, *PARPHDR;

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

实例分析下,先看一个请求包

 

我把原始数据考了过来

0000   ff   ff    ff    ff   ff   ff 00 0c f1 d4 d9 60 08 06 00 01 ...........`....
0010   08 00 06 04 00 01 00 0c f1 d4 d9 60 c0 a8 01 0f ...........`....
0020   00 00 00 00 00 00 c0 a8 01 02                              ..........
根据定义 
头6个字节是以太网目的地址 ff ff ff ff ff ff 这是一个广播地址,全网下的所有终端都能接受到

紧跟着的6个字节是以太网源地址就是发送者的mac地址 00 0c f1 d4 d9 60 是我的mac地址

真类型占两个字节 所以是 08 06 到这里以太网头就完了,08 06指的是后面的数据是属于arp包的

接着分析arp包。头两个字节是硬件类型 00 01 接着两个字节是协议类型arp使用的是ip协议代号08 00

硬件地址长度协议地址长度分别是6和4.这与arp报文格式是对应的(更详细信息可以参考TCP-IP详解卷1)

后面的2个字节op指的是这是一个请求包还是应答包,分别对应的值是0x0001和0x0002,原始数据里是  

00 01 所以这是一个请求包,然后6个字节又是发送者mac地址00 0c f1 d4 d9 60 ,后面4个字节是发送者ip

地址c0 a8 01 0f ,换成比较容易理解的10进制格式就是192 168 1 15,这是我的ip,然后的6个字节留空00

00 00 00 00 00 在arp请求包里也可以是其他数据 因为等会 ip地址为c0 a8 01 02 (192.168.1.2)会把自己的mac地址填充那6个字节,


填充完后,arp包里的     发送者硬件地址|目标硬件地址   和 以太网首部的
                                       以太网目的地址|以太网源地址    对调(我把他们对齐了就是上下两个地址对调)

然后在把这个包发送出去,这样一次来回就可以让两台终端互相知道对方的ip和mac。

接着在看下应答数据包

 

头6个字节是本地的mac地址(00 0c f1 d4 d9 60)。

接着的6个字节就是对方的mac地址(00 40 d0 92 7c 1f),这样就知道了对方地址。加进缓存表

仔细看可以发现应答包比请求包对了18个字节,应答包有60个字节,后面的18个字节是填充字节,构造应答包是不用管,只是把arp包的op(操作类型选择)填充0x0002就可以了

你可能感兴趣的:(Windows开发)