设为首页 加入收藏

TOP

LWIP学习记录------ARP协议(1)基础知识(一)
2023-07-23 13:28:49 】 浏览:39
Tags:LWIP 习记录 ------ARP 协议
关于LWIP网络协议在嵌入式设备使用越来越广泛,还是要好好学习一下,之前也看过一些资料,总是学了又忘(可能实践的太少了吧!!)。所以本文重新整理一下笔记。共同进步!

(一)ARP基础知识

(1)ARP协议的本质:

?

ARP协议的基本功能是使用目标主机的IP地址,查询其对应的MAC地址,来进行底层链路上数据包的通信工作。其中,ARP表的功能就是 记录IP地址MAC地址 的对应关系的表格。

? 在以太网中,ARP数据包与IP数据包是两个独立的部分,他们都是封装在以太网中进行传送的。ARP数据包分为两类一个是ARP请求包,另一个是arp应答包

  • 所谓ARP请求包:就是它是通过 广播 的方式在以太网中进行传输,然后希望能得到目标主机的相应。已知IP地址,请求MAC地址。

  • 显然,ARP应答包的功能,就是收到ARP请求包的主机,会解析请求包的IP地址与本机IP地址做比较,若符号,则返回一个APR应答包,包含了请求的IP地址与对应的MAC地址。这样,源主机就知道目标主机的MAC地址了,并把它加入到自己的ARP表中。

(2)ARP表的建立过程:

  1. 阶段一:当系统初始化时,ARP表为空。主机会广播自己的 <IP,MAC>,这个数据包叫 无汇报 ARP请求包。其他主机收到后,会把这个数据加入到自己的ARP表中。

  2. 阶段二:当主机要发送一个IP数据包时,要先检查自己的ARP表有没有目标主机的MAC地址?要有,好,直接发送。要没有,就要广播一个ARP请求包,然后其他主机接收后,若和自己匹配,则返回一个ARP应答包。源主机就得到了这个IP对应的MAC地址。 如果该表项的缓冲队列上有未发送的数据,相应的数据会被发送出去(后面结合代码详解)

  3. 阶段三:由于网络硬件状态可能随时改变,所以ARP还需要采用一定的定时机制来保证 缓存表中地址的 有效性。要有定时机制。

(二)lwip中关于ARP的数据结构

? etharp.c/h 文件中 实现了ARP协议的全部数据结构和函数定义。主要是ARP缓存表ARP报文

(1)ARP表

  1. ARP表是由缓存表项(entry)组成。LWIP只描述缓存表项的数据结构叫做 etharp_entry 。单个缓存表项的结构如下:

    struct etharp_entry {
      struct etharp_q_entry *q; 	  //**数据包缓冲队列指针**;
      struct pbuf *q;                 //
      ip_addr_t ipaddr;               //目标IP地址
      struct netif *netif;            //对应的网络接口信息
      struct eth_addr ethaddr;        //目标MAC地址
      u8_t state;                     //该entry 表项的状态
      u8_t ctime;                     //该entry的时间信息
    };
    
    • 第一个成员:"*q" 指向缓存表项的数据包缓存队列。因为当主机发送一个IP数据包时候,发现缓存表中并没有对应的MAC地址,那该怎么办呢?于是在得到对应的MAC地址之前,主机会新建立一个缓存表项,然后把要发送的数据 挂在这个缓存队列指针上。当接收到ARP应答包后,再发送出去。

    ?

    ? struct etharp_q_entry 结构是一个链表,包含一个*next 指针和一个 指向pbuf 数据包的指针。系统为 etharp_q_entry 结构开辟了一些 MEMP_APR_QUEUE类型的内存池。


    • state有四种状态,分别为empty 状态、Pending状态、stable状态、stable状态且发送了一个ARP请求。

      初始时,是以数组形式定义了10条ARP表项。这都是空的,没有记录任何信息。

      enum etharp_state {
        ETHARP_STATE_EMPTY = 0,        //empty状态
        ETHARP_STATE_PENDING,
        ETHARP_STATE_STABLE,
        ETHARP_STATE_STABLE_REREQUESTING
      };
      
      • pending状态:不稳定状态,此时只是找到了IP地址,正在寻找MAC地址;

      • stable状态:当Pending状态的表项接收到ARP应答后,就会变成stable稳定状态

      • stabl_rerequesting状态:系统定时更新ARP表项,当时间到了之后,会向目标主机发送一个ARP请求,来验证表项的有效性,在验证期间就会变成 stable_rerequesting状态。


    • ctime 成员:用来计时,系统会删除到时的 ARP表项。内核每5秒一次调用eth_tmr()函数,他会为每个 ARP表项 的ctime 值加1,当改值大于系统规定的值时,就会产生相应的动作。

      void etharp_tmr(void)
      {
        u8_t i;
      
        for (i = 0; i < ARP_TABLE_SIZE; ++i) {
          u8_t state = arp_table[i].state;
          if (state != ETHARP_STATE_EMPTY)  //表项不为空,说明被使用。
          {
            arp_table[i].ctime++;
            if ((arp_table[i].ctime >= ARP_MAXAGE) ||             //表项大于生存时间20分钟
                ((arp_table[i].state == ETHARP_STATE_PENDING)  &&  //达到pending 最大时间10s
                 (arp_table[i].ctime >= ARP_MAXPENDING))) 
            {
              	etharp_free_entry(i);                          //删除表项
            }
            else if (arp_table[i].state == ETHARP_STATE_STABLE_REREQUESTING)
            {
              /* Reset state to stable, so that the next transmitted packet will
                 re-send an ARP request. */
              arp_table[i].state = ETHARP_STATE_STABLE;
            }
      
          }
        }
      }
      

      (2)ARP报文

    ? 1. 前面提到的ARP请求和应答是组装在一个ARP数据包中发送的。如下图所示是一个APR包的组成;

    以太网目的地址(MAC) 以太网源地址(MAC) 帧类型 硬件协议 协议类型 硬件地址长度 协议地址长度 OP 发送方以太网地址 发送方IP 接收方以太网地址 接收方IP
    6字节 6 2 2 2 1 1 2 6 4 6 4

    前面 14个字节是以太网首部,后面28个字节是ARP数据包。

    • 帧类型:对于ARP包是0X806,对于IP包是0X0800。

    • 硬件协议:发送方想要知道的硬件接口类型,对于以太网是 1

    • 协议类型:表示要映射的协议地址类型,为0X0800,代表映射为IP地址

    • 操作字段op:表示数据包类型。ARP请求包为 1,ARP应答包为2.

    • 后面字段含义较为明显,不再赘述。

    以太网首部用结构eth_hdr表示

    struct eth_hdr {
      PACK_STRUCT_FIELD(struct eth_addr dest);  //以太网目的地址,6字节
      PACK_STRUCT_FIELD(struct eth_addr src);   //以太网源地址,6字节。
      PACK_STRUCT_FIELD(u16_t type);            //帧类型
    } PACK_STRUCT_STRUC
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇《痞子衡嵌入式半月刊》 第 72 期 下一篇轻松玩转Makefile | 企业项目级Ma..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目