ARP协议的报文格式

ARP协议的报文格式

结构ether_header定义了以太网帧首部;结构arphdr定义了其后的5个字段,其信息用于在任何类型的介质上传送ARP请求和回答;ether_arp结构除了包含arphdr结构外,还包含源主机和目的主机的地址。

图中前面的部分是以太网(这里是Ethernet II类型)的帧头部。其中,第一个字段是以太网目的MAC地址(广播类型的MAC地址:0XFF-FF-FF-FF-FF-FF,)其目标是网络上的所有主机。第二个字段是以太网源MAC地址,即请求地址解析的主机MAC地址。第三个字段是协议类型,这里用0X0806代表封装的上层协议是ARP协议协议。

接下来是ARP协议协议报文部分。其中各个字段的含义如下:

硬件类型:表明ARP协议实现在何种类型的网络上。

协议类型:代表解析协议(上层协议)。这里,一般是0800,即IP。

硬件地址长度:MAC地址长度,此处为6个字节。

协议地址长度:IP地址长度,此处为4个字节。

操作类型:代表ARP协议数据包类型。0表示ARP协议请求数据包,1表示ARP协议应答数据包。

源MAC地址:发送端MAC地址。

源IP地址:代表发送端协议地址(IP地址)。

目标MAC地址:目的端MAC地址(待填充)。

目标IP地址:代表目的端协议地址(IP地址)。

ARP协议应答协议报文和ARP协议请求协议报文类似。不同的是,此时,以太网帧头部的目标MAC地址为发送ARP协议地址解析请求的主机的MAC地址,而源MAC地址为被解析的主机的MAC地址。同时,操作类型字段为1,表示ARP协议应答数据包,目标MAC地址字段被填充以目标MAC地址。

 

ARP高速缓存

每个主机上都有一个ARP高速缓存表。这个表存放了最近IP地址到硬件地址之间的映射记录。在ARP高速缓存中的表项一般都要设置超时值。一般对完整的表项设置超时值为20分钟,而对不完整的表项设置超时值为3分钟。当这些表项再次使用时,这些实现一般都把超时值重新设为20分钟。arp -a查看本机的arp高速缓存表。

ARP的分组格式

以太网目的地址:在ARP request中为广播地址(ff.ff.ff.ff.ff.ff),在ARP relay中为发送ARP request的主机的MAC地址。

以太网源地址:发送ARP request的主机MAC地址。在ARP relay中作为以太网目的地址。

帧类型:2个字节。表示后面数据的类型。ARP帧的值为0x0806。

硬件类型:指定了网络的类型。1为以太网,3为X.25,6为IEEE802。

协议类型:指定发送者映射到数据链路标识符的网络层协议类型。IP为0x0800,ARP为0x0806,RARP为0x8035。

硬件地址长度:指定了数据链路标识符的长度。单位是octet。MAC长度为6。

协议地址长度:指定了网络地址长度。单位是octet。IPv4地址长度是4。

OP:操作字段。指明一个数据包是ARP请求(1),ARP应答(2),RARP请求(3),RARP应答(4),反转ARP请求(8),反转ARP应答(9)。

发送端以太网地址:发送ARP request的源主机MAC地址。在ARP Relay中是目的以太网地址的值。

发送端协议地址:发送ARP request的源主机网络层地址。这里指IP地址。

目的以太网地址:在ARP request中为全0。

目的协议地址:接收ARP request的目的主机网络层地址。这里指IP地址。

对于一个ARP请求来说,除目的端硬件地址外的所有其他字段都有填充值。当系统收到一份目的端为本机的ARP请求报文时,它就把硬件地址填写进去,用两个目的端地址分别替换两个发送端地址,并把操作字段置为2,然后将它发送回去。

用ARP进行动态地址解析的时间一般小于3ms。

当系统收到ARP请求或发送ARP应答时,都要把请求端的硬件地址和IP地址存入ARP高速缓存。

 

定义常量

#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;

ARP请求包的分析:如下所示为一个ARP请求包

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地址)。

帧类型0806占两个字节,到这里以太网帧头就结束了。0806指的是后面的数据是属于arp包的。

接着分析ARP包头。头两个字节是硬件类型00 01,接着两个字节是协议类型,即ARP使用的是IP协议代号08 00硬件地址长度和协议地址长度分别是6和4。这与ARP报文格式是对应的。后面的2个字节OP指示当前包是请求包还是应答包,对应的值分别是0x0001和0x0002。原始数据里是00 01所以这是一个请求包,然后6个字节又是发送者MAC地址00 0c f1 d4 d9 60 ,后面4个字节是发送者IP地址c0 a8 01 0f ,转换成点分十进制格式即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包里的发送者硬件地址|目标硬件地址和以太网首部的以太网目的地址|以太网源地址正好对调。最后把这个封装好的ARP包发送出去,这样一个来回就可以让两台终端互相知道对方的IP和MAC。

ARP欺骗的3种基本方式:

1. 主机C冒充网关欺骗主机B;

2. 主机c冒充主机B欺骗网关;

3. 主机C同时欺骗主机B和网关,实现数据中转,并监听到所有主机B的数据。

PT下仿真如下:

ARP协议的报文格式_第1张图片

这是使用的是Ethernet V2 MAC帧,然后封装ARP帧。另一台机器会返回:

ARP协议的报文格式_第2张图片

这样两台PC都知道ip和MAC地址了。

 
 

RARP:反向地址解析协议

RARP可以实现IPv4地址到已知硬件地址的映射。某些设备,如无盘工作站在启动时可能不知道自己的IP地址,嵌入这些设备固件中的RARP程序可以允许它们发送ARP请求,RARP服务器将会向这些设备回复相应的IP地址。

RARP在很大程度上正在被DHCP和BOOTP的扩展协议所替代。不同于RARP,这两种协议都可以提供IP地址以外更多的信息,而且还可以跨越本地数据链路。

RARP分组格式:

RARP分组的格式与ARP分组基本一致。它们之间的差别是RARP请求或应答的帧类型代码为0x8035,并且RARP请求和应答的操作代码分别为3和4。

RARP的请求以广播方式传送,RARP应答一般是单播传送的。

RARP在目前的应用中已极少被使用,不再赘述了。

你可能感兴趣的:(网络编程)