ARP地址解析协议

7 篇文章 2 订阅

地址解析协议(Address Resolution Protocol,ARP)地址解析”就是主机在发送帧前将目标 IP 地址转换成目标 MAC 地址的过程

前同步码是 10101010(0x55, 大端模式);

帧开始符,其值是 10101011(0xD5,大端模式) 

剩余5 个字 段才是真正的以太网数据帧结构

类型字段 :当这个字段的值小于 1518 时,它表示后面数据字段的数据长度,当大于 1518 的时候才 表示递交给哪个协议。

IP 数据报超过了 1500 字节,则主机必须将该数据报分片

MAC 地址可以分成三类,单播地址、多播地址和广播地址

ARP 缓存表的概念,每台主机或路由器在其内存中具有一个 ARP 缓存表(ARP table),这张表包含 IP 地址到 MAC 地址的映射关系,

static struct etharp_entry arp_table[ARP_TABLE_SIZE];

ARP 表也包含一个寿命(TTL)值,它指示了从表中删除每个映射 的时间。从一个表项放置到某 ARP 表中开始,一个表项通常的过期时间是 10 分钟

电脑会先在局域网上广播一个 ARP 请求(目标 MAC 地址为 FF-FF-FF-FF-FF-FF),广播的 ARP 请求发出后,处于同一局域网内的所有主机都会接收到这个请求,如果目标 IP 地址与主机 自身 IP 地址吻合就会返回一个 ARP 应答,告诉请求者自身的 MAC 地址,当我的电脑收到这个 ARP 应答后,就去更新 ARP 缓存表

ARP 表项的生存时间是 5 分钟,而 ARP 请求的等待时间是 5 秒钟

enum etharp_state
{
    ETHARP_STATE_EMPTY = 0,//空状态
    ETHARP_STATE_PENDING,//1 发出了一个 ARP 请求包,但是还未收到目标 IP 地址主机的应答;2 当要发送数据包的时候
    ETHARP_STATE_STABLE,//发出了一个 ARP 请求包,收到目标 IP 地址主机的应答
    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
    /** 指向此 ARP 表项上挂起的数据包队列的指针。 */
    /** 指向此 ARP 表项上挂起的数据包队列的指针。 */
    /** 指向此 ARP 表项上挂起的数据包队列的指针。 */
    struct etharp_q_entry *q; //(1)-#else
    /** 指向此 ARP 表项上的单个挂起数据包的指针。 */
    struct pbuf *q; //(1)-
#endif
    ip4_addr_t ipaddr;
    struct netif *netif;
    struct eth_addr ethaddr;
    u16_t ctime;
    u8_t state; //ARP 状态
};

 

数据包类型 ARP 数据包其值为 0x0806,对于 IP 数据报来其值为 0x0800

硬件类型,值为 1 表示以太网地址,其他还可 能表示令牌环地址;

2 字节的协议类型,表示硬件地址要映射的协议地址类型,其中, 0x0800 表示 IP 地址,其他还可能是 ICMP/IGMP 等;

1 个字节表示硬件地址长度,指 出该报文中硬件地址的长度,对于以太网,它的值为 6;

还有 1 节的协议地址长度,对于 ARP 请求或应答来说,该值为 4;

op 字段用于记录 ARP 操作的类型,分别是:

  1. • ARP 请求,其值为 1。
  2. • ARP 应答,其值为 2。
  3. • RARP 请求,其值为 3。
  4. • RARP 应答,其值为 4。

在发送 ARP 请求包的时候,以太网首部的目标 MAC 地址是 FF-FF-FF-FF-FF-FF


struct eth_addr //以太网地址结构体
{
    PACK_STRUCT_FLD_8(u8_t addr[ETH_HWADDR_LEN]);
} PACK_STRUCT_STRUCT;
struct eth_hdr //以太网首部
{
    PACK_STRUCT_FLD_S(struct eth_addr dest); //以太网目标 MAC 地址
    PACK_STRUCT_FLD_S(struct eth_addr src);  //以太网源 MAC 地址
    PACK_STRUCT_FIELD(u16_t type);           //帧类型
} PACK_STRUCT_STRUCT;
struct etharp_hdr //ARP 报文
{
    PACK_STRUCT_FIELD(u16_t hwtype);  //硬件类型
    PACK_STRUCT_FIELD(u16_t proto);   //协议类型
    PACK_STRUCT_FLD_8(u8_t hwlen);    //硬件地址长度
    PACK_STRUCT_FLD_8(u8_t protolen); //协议地址长度
    PACK_STRUCT_FIELD(u16_t opcode);  //op 字段
    /* 以上是 ARP 报文首部 */
    PACK_STRUCT_FLD_S(struct eth_addr shwaddr);             //源 MAC 地址
    PACK_STRUCT_FLD_S(struct ip4_addr_wordaligned sipaddr); //源 ip 地址
    PACK_STRUCT_FLD_S(struct eth_addr dhwaddr);             //目标 MAC 地址
    PACK_STRUCT_FLD_S(struct ip4_addr_wordaligned dipaddr); //目标 ip 地址
} PACK_STRUCT_STRUCT;
enum etharp_opcode //op 字段操作
{
    ARP_REQUEST = 1, //请求包
    ARP_REPLY = 2    //应答包
};

 LwIP 中数据包从网卡接收的函数是 ethernetif_input(),真正让 LwIP 内核去处理接收到的数据包是 ethernet_input() 函数

ARP 数据包的处理函数为 etharp _input(),在这里它完成两个任务:

1. 如果收到的是 ARP 应答包,说明本机之前发出的 ARP 请求包有了回应,就根据应答包,更 新自身的 ARP 缓存表

2. 如果收到的是 ARP 请求包,如果包中的目标 IP 地址与主机 IP 地址匹配,除了记录原主机的 IP 与 MAC 地址,更新自身的 ARP 表外,还要向源主机发送一个 ARP 应答包。但是如果包中目 标 IP 地址与主机 IP 地址不匹配,则尽可能记录源主机的 IP 与 MAC 地址,更新自身的 ARP 表, 并丢弃该请求包,为什么说是尽可能呢,因为主机的 ARP 缓存表是有限的,不可能记录太多的 ARP 表项,所以在有空闲的表项时才记录,如果没有空闲的表项,ARP 觉得它自己已经尽力了, 也记不住那么多表项。

etharp_update_arp_entry() 函数是用于更新 ARP 缓存表的,它会在收到一个 ARP 数据包的时候被调用,它会先查找一个 ARP 表项,如果没有找到这个 ARP 表项的记录,就会去新建一个 ARP 表 项,然后重置 ARP 表项的参数(状态、网卡。IP 地址与对应的 MAC 地址以及生存时间等),然后检测 ARP 表项中是否挂载数据包,如果有就将这些数据包发送出去

上层协议想要发送数据

如果上层协议想要发送数据,也肯定需要经过 ARP 协议将 IP 地址映射为 MAC 地址才能完 成发送操作,IP 数据报通过 ip4_output() 函数将上层数据包传递到 ARP 协议处理,关于 IP 协议 是怎么样传递的我们暂且不说,那么 ARP 通过 etharp_output() 函数接收到 IP 数据报后,就会进 行发送,ARP 会先从数据包中进行分析,看看这个 IP 数据报是单播数据包还是多播或者是广播 数据包,然后进行不同的处理

        • 对于多播或者是广播数据包,这种处理就很简单,直接将数据包丢给网卡就行了(调用 ethernet_output() 函数)。

        • 对于单播包的处理稍微麻烦一点,ARP 协议需要根据 IP 地址找到对应的 MAC 地址,然后 才能正确发送,如果找不到 MAC 地址的话,还要延迟发送数据包,ARP 协议首先会创建一 个 ARP 表项,然后将数据包挂到 ARP 表项对应的缓存队列上,与此同时会发出一个 ARP 请求包,等待目标主机的回应后再发送 IP 数据报

此处需要注意的是,对于 PBUFF_ERF、PBUF_POOL、PBUF_RAM 类型的数据包是不允许直接 挂到 ARP 表项对应的缓存队列上的,因为此时内核需要等待目标主机的 ARP 应答,而这段时间 里,这些数据有可能会被上层改动,这是不允许的,所以 LwIP 需要将这些 pbuf 数据包拷贝到新 的空间,等待发送

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Car12

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值