1、ARP协议简介
网络层最重要的三个协议:IP协议、ARP协议、ICMP协议
ARP协议:根据IP地址,获取MAC地址,又叫地址解析协议(Address Resolution Protocol)
特点:电脑的网卡的物理地址(MAC地址)唯一,而电脑的IP地址可变
- ARP协议:根据目标IP地址以广播方式获取相应的MAC地址,并将MAC地址存入ARP缓存表
ARP请求包、ARP应答包、IP数据包的数据格式都符合如下格式:
一般通过帧类型来区分是ARP数据包?IP数据包或者其他数据包
- MAC地址与IP地址的作用
-
IP地址:用于网络寻址,他作用空间是广域网
如果主机A和主机B是不同网段,则涉及到网络转发的问题 -
MAC地址:用于链路层寻址,它作用空间是局域网,不可变,不重复
-
同一网段可以由MAC地址直接发;
不同网段需要借助IP地址进行转发,进入同一局域网内再由MAC地址发送
2、ARP协议原理
2.1 发送ARP请求包原理
- 首先,确定是广播/单播,广播需要通过low_level_output发送,单播就要查询MAC地址
/** ARP states */
enum etharp_state {
ETHARP_STATE_EMPTY = 0, //ARP缓存表初始化状态
ETHARP_STATE_PENDING, //处于不稳定,表项只记录了IP地址,但是未记录到对应的MAC地址
ETHARP_STATE_STABLE, //应答前,数据包挂起,应答后,更新ARP缓存表及发送数据包
ETHARP_STATE_STABLE_REREQUESTING_1,
ETHARP_STATE_STABLE_REREQUESTING_2
#if ETHARP_SUPPORT_STATIC_ENTRIES
, ETHARP_STATE_STATIC
#endif /* ETHARP_SUPPORT_STATIC_ENTRIES */
};
struct etharp_entry {
#if ARP_QUEUEING
/** Pointer to queue of pending outgoing packets on this ARP entry. */
struct etharp_q_entry *q;
#else /* ARP_QUEUEING */
/** Pointer to a single pending outgoing packet on this ARP entry. */
struct pbuf *q;
#endif /* ARP_QUEUEING */
ip4_addr_t ipaddr; //目标IP地址
struct netif *netif; //指向当前网卡
struct eth_addr ethaddr; //MAC地址
u16_t ctime; //生存时间
u8_t state; //表项的状态
};
static struct etharp_entry arp_table[ARP_TABLE_SIZE];
2.2 接收ARP应答包
- ethernet_input():判断接收到的数据包是IP数据包还是ARP数据包
- etharp_input():判断ARP数据包是请求包还是应答包,根据ARP报文结构的OP部分进行判断