当一台主机把以太网数据帧发送到位于同一局域网上的另一台主机时,必须要知道对方的物理地址。如果只知道目的主机的IP地址,就必须通过ARP协议来获取其物理地址。
当链路层数据类型被标记为ARP包时,那么链路层数据段的内容就是ARP包的内容。
首先定义ARP包结构体:
//eth.h
#ifndef __ETH__
#define __ETH__
typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
/*链路层结构*/
typedef struct
{
u8 destMAC[6]; //目的MAC
u8 sourMAC[6]; //源MAC
u16 type; //类型
u8 data[1500]; //数据
}ETH_HEADER;
/*链路层数据包类型*/
typedef enum
{
ARP_PACKET=0x0806, //ARP包
RARP_PACKET=0x8035, //RARP包
IP_PACKET=0x0800 //IP包
}PACKET_TYPE;
/*ARP包结构*/
typedef struct
{
u16 hardware; //硬件地址类型,1表示MAC地址
u16 protocol; //协议地址类型,0x0800表示IP地址
u8 mac_len; //硬件地址的长度,对于MAC地址为6
u8 ip_len; //协议地址长度,对于IP地址来说有4和6,对应IPV4和IPV6
u16 op; &nbs

在局域网中,主机通过ARP协议获取目标主机的物理地址。本文深入解析ARP包结构,包括硬件地址长度、协议地址长度、操作类型等字段,并介绍如何通过网络字节顺序转换处理ARP数据。通过运行`./eth`可以观察到ARP包的详细信息。

7304

被折叠的 条评论
为什么被折叠?



